این آزمون برای سنجش درک شما از چالشهای رایج و نحوه عیبیابی در یک محیط پروداکشن طراحی شده است. بهترین گزینه را برای هر سوال انتخاب کنید.
سوالات:
۱. پس از انتشار برنامه، در مرورگر با خطای 502 Bad Gateway مواجه میشوید. محتملترین علت این خطا چیست و اولین قدم برای عیبیابی کدام است؟
الف) گواهی SSL منقضی شده است - باید Certbot را مجدداً اجرا کرد.
ب) سرویس Kestrel در حال اجرا نیست یا Crash کرده است - باید وضعیت سرویس با systemctl status بررسی شود.
ج) فایروال پورت 80 را مسدود کرده است - باید قوانین ufw را بررسی کرد.
د) در فایل کانفیگ Nginx خطای گرامری (Syntax) وجود دارد - باید دستور nginx -t را اجرا کرد.
۲. سرویس systemd شما پس از استارت، بلافاصله با وضعیت failed متوقف میشود. در لاگهای برنامه با journalctl خطای System.IO.FileNotFoundException: 'appsettings.json' را مشاهده میکنید. مشکل چیست؟
الف) فایل appsettings.json در زمان پابلیش به درستی کپی نشده است.
ب) سطح لاگبرداری (LogLevel) در فایل کانفیگ بسیار پایین است.
ج) دستور ExecStart در فایل سرویس اشتباه است.
د) پارامتر WorkingDirectory در فایل سرویس systemd به درستی تنظیم نشده است.
۳. در لاگهای برنامه خود متوجه میشوید که IP تمام کاربران به صورت 127.0.0.1 ثبت میشود. کدام هدر ضروری در پیکربندی Reverse Proxy شما در Nginx فراموش شده است؟
الف) X-Forwarded-Proto
ب) X-Forwarded-For
ج) Host
د) Connection
۴. هنگام آپلود یک فایل ۱۰ مگابایتی، Nginx خطای 413 Request Entity Too Large را برمیگرداند. برای حل این مشکل، کدام پارامتر و در کدام فایل باید تنظیم شود؟
الف) پارامتر upload_max_filesize در فایل php.ini.
ب) پارامتر client_max_body_size در فایل کانفیگ سایت در Nginx.
ج) پارامتر MaxRequestBodySize در کد Program.cs برنامه ASP.NET Core.
د) پارامتر worker_connections در فایل nginx.conf.
۵. شما میدلور app.UseHttpsRedirection را در برنامه خود فعال کردهاید، اما کاربران در یک حلقه ریدایرکت بیپایان گیر میکنند. علت این مشکل چیست؟
الف) Nginx هدر X-Forwarded-Proto را به درستی برای Kestrel ارسال نمیکند.
ب) Certbot به درستی اجرا نشده و ریدایرکت HTTP به HTTPS را تنظیم نکرده است.
ج) کش مرورگر کاربر باعث ایجاد این مشکل شده است.
د) پورت Kestrel مستقیماً از طریق فایروال در دسترس است.
۶. کدام دستور برای مشاهده خروجیها و لاگهای زنده (Live) یک برنامه ASP.NET Core که به عنوان سرویس kestrel-myapp.service در حال اجراست، استفاده میشود؟
الف) tail -f /var/log/nginx/access.log
ب) systemctl status kestrel-myapp.service
ج) journalctl -u kestrel-myapp.service -f
د) dotnet run log
۷. یک کاربر گزارش خطا میدهد. اولین فایلی که برای تشخیص اولیه مشکل (اینکه آیا مشکل از Nginx است یا از برنامه شما) باید بررسی کنید، کدام است؟
الف) /var/log/nginx/access.log
ب) /var/log/nginx/error.log
ج) فایل appsettings.Production.json
د) لاگهای برنامه با journalctl
۸. در لاگ خطای Nginx با پیام connect() failed (111: Connection refused) while connecting to upstream مواجه میشوید. این پیام به چه معناست؟
الف) Nginx منابع کافی (RAM یا CPU) برای پردازش درخواست را ندارد.
ب) برنامه ASP.NET Core در حال اجرا نیست یا روی پورت/سوکت اشتباهی در حال گوش دادن است.
ج) فایروال، ارتباط خروجی Nginx را مسدود کرده است.
د) یک خطای 500 در داخل کد برنامه ASP.NET Core رخ داده است.
۹. یک برنامه SignalR که از WebSockets استفاده میکند، در محیط پروداکشن کار نمیکند. کدام یک از هدرهای زیر برای پشتیبانی از WebSockets در پراکسی Nginx حیاتی هستند؟
الف) Host و X-Real-IP
ب) Upgrade و Connection
ج) X-Frame-Options و X-Content-Type-Options
د) X-Forwarded-For و X-Forwarded-Proto
۱۰. بهترین و امنترین روش برای اجرای یک سرویس systemd برای برنامه ASP.NET Core چیست؟
الف) اجرای سرویس با کاربر root تا هیچ مشکل دسترسی وجود نداشته باشد.
ب) اجرای سرویس با یک کاربر غیرممتاز مانند www-data و تنظیم صحیح User در فایل سرویس.
ج) اجرای برنامه با دستور dotnet run در یک screen یا tmux.
د) قرار دادن دستور اجرای برنامه در فایل /etc/rc.local.
۱۱. پس از انتقال ارتباط Nginx و Kestrel از پورت TCP به سوکت یونیکس، Nginx خطای 502 میدهد. محتملترین علت چیست؟
الف) سوکتهای یونیکس به طور کلی از پورتهای TCP کندتر هستند.
ب) کاربر Nginx (www-data) اجازه خواندن/نوشتن روی فایل سوکت یا پوشه آن را ندارد.
ج) باید listen در Program.cs همزمان برای پورت TCP و سوکت یونیکس تنظیم شود.
د) فراموش کردهاید پیشوند http:// را از دستور proxy_pass در Nginx حذف کنید.
۱۲. قانون طلایی برای تنظیم پارامتر worker_processes در فایل nginx.conf جهت دستیابی به عملکرد بهینه چیست؟
الف) همیشه آن را روی ۱ تنظیم کنید تا از تداخل جلوگیری شود.
ب) آن را دو برابر تعداد هستههای CPU تنظیم کنید.
ج) آن را برابر با تعداد هستههای CPU سرور تنظیم کنید (یا از auto استفاده کنید).
د) آن را برابر با مقدار worker_connections تقسیم بر ۱۰۲۴ تنظیم کنید.
۱۳. شما worker_connections را روی 8192 تنظیم کردهاید، اما Nginx با خطای "Too many open files" اجرا نمیشود. راهحل چیست؟
الف) مقدار worker_connections را به ۱۰۲۴ کاهش دهید.
ب) با دستور ulimit -n 8192 در ترمینال، محدودیت را به صورت موقت افزایش دهید.
ج) پارامتر worker_rlimit_nofile را با مقداری برابر یا بیشتر از 8192 در nginx.conf تنظیم کنید.
د) مقدار worker_processes را به ۱ کاهش دهید.
۱۴. در لاگ خطای Nginx با خطای upstream timed out (110: Connection timed out) مواجه میشوید که منجر به خطای 504 برای کاربر میشود. این خطا به چه مشکلی در برنامه ASP.NET Core شما اشاره دارد؟
الف) برنامه Crash کرده و در دسترس نیست.
ب) برنامه در حال اجراست، اما پردازش درخواست بیش از حد طول کشیده است (مثلاً یک کوئری سنگین دیتابیس).
ج) حجم درخواست ارسال شده توسط کاربر بیش از حد مجاز Nginx است.
د) یک مشکل در اتصال شبکه بین Nginx و اینترنت وجود دارد.
۱۵. برای جلوگیری از حملات Clickjacking، کدام هدر امنیتی باید در کانفیگ Nginx اضافه شود؟
الف) server_tokens off;
ب) add_header X-Content-Type-Options "nosniff";
ج) add_header X-Frame-Options "SAMEORIGIN";
د) add_header X-XSS-Protection "1; mode=block";
۱۶. چرا بهتر است سرویسدهی فایلهای استاتیک (CSS, JS, تصاویر) به Nginx سپرده شود تا Kestrel؟
الف) چون Kestrel نمیتواند فایلهای استاتیک را سرویس دهد.
ب) چون Nginx این کار را بسیار بهینهتر انجام میدهد و بار را از روی دوش برنامه اصلی برمیدارد.
ج) چون این کار باعث میشود نیازی به استفاده از app.UseStaticFiles نباشد.
د) چون Nginx میتواند فایلهای CSS و JS را فشرده کند، اما Kestrel نمیتواند.
۱۷. بهترین روش برای مدیریت تمدید گواهیهای SSL که از Let's Encrypt دریافت شدهاند، چیست؟
الف) هر دو ماه یکبار دستور sudo certbot renew را به صورت دستی اجرا کنید.
ب) هیچ کاری لازم نیست، پکیج Certbot به صورت خودکار یک کار زمانبندی شده (Cron Job/Systemd Timer) برای تمدید ایجاد میکند.
ج) یک گواهی جدید با دستور sudo certbot --nginx دریافت کنید تا جایگزین قبلی شود.
د) یک اسکریپت بنویسید که هر هفته سرور را ریبوت کند تا Certbot دوباره اجرا شود.
۱8. یک اقدام امنیتی حیاتی پس از راهاندازی موفقیتآمیز Nginx به عنوان Reverse Proxy برای Kestrel چیست؟
الف) اطمینان از اینکه پورت Kestrel (مثلاً 5000) در فایروال سرور مسدود شده و از دسترس عموم خارج است.
ب) افزایش مقدار worker_connections برای جلوگیری از حملات DDoS.
ج) فعال کردن access_log برای ثبت تمام درخواستها.
د) اجرای Nginx با کاربر root برای جلوگیری از خطاهای دسترسی.
۱۹. شما متوجه میشوید که تغییرات شما در فایل appsettings.Production.json اعمال نمیشود. محتملترین علت چیست؟
الف) فراموش کردهاید سرویس systemd را پس از تغییر فایل، ریاستارت (restart) کنید.
ب) Nginx پاسخها را کش کرده است و باید کش آن پاک شود.
ج) متغیر محیطی ASPNETCORE_ENVIRONMENT در فایل سرویس systemd به درستی روی Production تنظیم نشده است.
د) هر دو گزینه الف و ج محتمل هستند.
۲۰. در چه سناریویی استفاده از سوکت یونیکس به جای پورت TCP برای ارتباط Nginx و Kestrel، انتخاب بهتری محسوب میشود؟
الف) زمانی که Nginx و Kestrel روی دو سرور مجزا قرار دارند.
ب) زمانی که به دنبال حداکثر امنیت و عملکرد در یک سرور با چندین سرویس هستید.
ج) زمانی که برنامه شما نیاز به پشتیبانی از WebSockets دارد.
د) زمانی که به دنبال سادهترین راه برای استقرار هستید.
کلید پاسخها و راهنمای تشریحی
۱. پاسخ صحیح: ب
- راهنما: خطای 502 به معنای آن است که Nginx (نگهبان) نتوانسته با Kestrel (برنامه اصلی) ارتباط برقرار کند. شایعترین علت این است که برنامه اصلی اصلاً در حال اجرا نیست. اولین قدم منطقی، بررسی وضعیت سرویس آن است. گزینههای دیگر مشکلات متفاوتی را ایجاد میکنند (خطای SSL، خطای 403، یا خطای پیکربندی قبل از اجرا).
۲. پاسخ صحیح: د
- راهنما: وقتی یک سرویس
systemd اجرا میشود، دایرکتوری کاری پیشفرض آن ریشه سیستم (/) است، نه پوشه برنامه. خطای پیدا نشدن فایل appsettings.json (که در کنار DLL برنامه قرار دارد) یک علامت کلاسیک برای فراموش کردن تنظیم WorkingDirectory=/path/to/your/app در فایل .service است.
۳. پاسخ صحیح: ب
- راهنما: وقتی Nginx به عنوان پراکسی عمل میکند، از دید Kestrel، تمام درخواستها از طرف خود Nginx (یعنی
127.0.0.1) میآیند. هدر X-Forwarded-For حاوی IP واقعی کلاینت است و فریمورک ASP.NET Core به صورت خودکار از آن برای تشخیص IP کاربر استفاده میکند.
۴. پاسخ صحیح: ب
- راهنما: Nginx یک محدودیت پیشفرض برای حجم بدنه درخواست دارد. این محدودیت با پارامتر
client_max_body_size در فایل کانفیگ سایت Nginx (بلاک server) کنترل میشود و باید برای پشتیبانی از آپلودهای حجیم، افزایش یابد.
۵. پاسخ صحیح: الف
- راهنما: میدلور ریدایرکت HTTPS در ASP.NET Core برای اینکه بداند درخواست اصلی از طرف کاربر با
https بوده یا http، به هدر X-Forwarded-Proto که توسط Reverse Proxy تنظیم میشود، تکیه میکند. اگر این هدر ارسال نشود، برنامه فکر میکند تمام درخواستها http هستند و تلاش میکند آنها را به https ریدایرکت کند که منجر به حلقه بینهایت میشود.
۶. پاسخ صحیح: ج
- راهنما: وقتی برنامه توسط
systemd مدیریت میشود، تمام خروجیهای کنسول آن به صورت متمرکز در Journald ذخیره میشود. دستور journalctl -u برای مشاهده این لاگها و سوییچ -f برای دنبال کردن آنها به صورت زنده (follow) است.
۷. پاسخ صحیح: ب
- راهنما: لاگ خطای Nginx (
error.log) اولین خط دفاعی شماست. این لاگ مشکلات ارتباطی بین Nginx و برنامه شما (مانند خطاهای 502, 503, 504) را ثبت میکند و به شما میگوید که آیا مشکل در لایه Nginx است یا باید در لاگهای برنامه به دنبال آن بگردید.
۸. پاسخ صحیح: ب
- راهنما: پیام
Connection refused یک پیام سطح پایین شبکه است که یعنی تلاش برای برقراری اتصال به یک آدرس/پورت یا سوکت، به طور فعال توسط سیستمعامل رد شده است. این تقریباً همیشه به این معنی است که هیچ فرآیندی در مقصد برای پذیرش آن اتصال وجود ندارد.
۹. پاسخ صحیح: ب
- راهنما: ارتباط WebSocket با یک درخواست HTTP عادی شروع میشود که حاوی هدرهای
Upgrade و Connection برای "ارتقا" به یک پروتکل دوطرفه است. Nginx باید طوری پیکربندی شود که این هدرها را به درستی به سرور پشتیبان (Kestrel) منتقل کند.
۱۰. پاسخ صحیح: ب
- راهنما: اجرای هر سرویس تحت وب با کاربر
root یک ریسک امنیتی بسیار بزرگ است. بهترین روش، استفاده از یک کاربر با حداقل دسترسیهای لازم (Principle of Least Privilege) مانند www-data است.
۱۱. پاسخ صحیح: ب
- راهنما: سوکت یونیکس یک فایل در فایل سیستم است و مانند هر فایل دیگری، مشمول قوانین دسترسی لینوکس میشود. اگر کاربر Nginx (
www-data) اجازه خواندن/نوشتن در این فایل (که توسط فرآیند Kestrel ایجاد شده) را نداشته باشد، ارتباط برقرار نخواهد شد.
۱۲. پاسخ صحیح: ج
- راهنما: از آنجایی که هر فرآیند کارگر Nginx تکرشتهای است، تنظیم تعداد آنها برابر با تعداد هستههای CPU به سیستمعامل اجازه میدهد تا بار را به صورت بهینه بین تمام هستهها توزیع کرده و از حداکثر توان پردازشی سرور استفاده کند.
۱۳. پاسخ صحیح: ج
- راهنما: دستور
worker_rlimit_nofile به صورت اختصاصی و تمیز، محدودیت تعداد فایلهای باز (File Descriptors) را فقط برای فرآیندهای کارگر Nginx افزایش میدهد و آنها را قادر میسازد تا تعداد کانکشنهای مشخص شده در worker_connections را مدیریت کنند.
۱۴. پاسخ صحیح: ب
- راهنما: خطای 504 Timeout به این معنی است که Nginx با موفقیت به برنامه شما متصل شده (پس برنامه در حال اجراست)، اما برنامه شما در زمان تعیین شده پاسخی برنگردانده است. این خطا مستقیماً به یک مشکل عملکردی یا بنبست در کد برنامه شما اشاره دارد.
۱5. پاسخ صحیح: ج
- راهنما: هدر X-Frame-Options به مرورگر دستور میدهد که آیا اجازه دارد این صفحه را در یک frame یا iframe نمایش دهد یا خیر. تنظیم آن روی SAMEORIGIN یا DENY از حملات Clickjacking جلوگیری میکند.
۱۶. پاسخ صحیح: ب
- راهنما: Nginx یک وبسرور است که برای عملیات I/O با کارایی بالا (مانند ارسال فایل) بهینه شده است. سپردن این کار به Nginx باعث آزاد شدن منابع برنامه اصلی (Kestrel) میشود تا روی منطق داینامیک کسبوکار تمرکز کند.
۱۷. پاسخ صحیح: ب
- راهنما: یکی از بزرگترین مزایای استفاده از Certbot، خودکارسازی کامل فرآیند تمدید گواهی است. در زمان نصب، یک کار زمانبندی شده ایجاد میشود که به طور خودکار گواهیها را قبل از انقضا تمدید میکند.
۱۸. پاسخ صحیح: الف
- راهنما: تمام ترافیک باید مجبور شود که از طریق Nginx عبور کند تا قوانین امنیتی، کشینگ و لاگینگ ما اعمال شود. باز گذاشتن پورت Kestrel یک راه پشتی (Backdoor) ناامن به برنامه شما ایجاد میکند.
۱۹. پاسخ صحیح: د
- راهنما: هر دو گزینه صحیح هستند.
appsettings.json و سایر فایلهای کانفیگ در زمان شروع برنامه بارگذاری میشوند، بنابراین برای اعمال تغییرات، سرویس باید ریاستارت شود. همچنین، اگر متغیر محیطی ASPNETCORE_ENVIRONMENT روی Production تنظیم نشده باشد، برنامه اصلاً فایل appsettings.Production.json را نمیخواند.
۲۰. پاسخ صحیح: ب
- راهنما: سوکتهای یونیکس به دلیل امنیت بالاتر (مبتنی بر دسترسی فایل) و عملکرد کمی بهتر (حذف سربار TCP/IP) در سناریوهایی که امنیت و عملکرد در اولویت هستند و چندین سرویس روی یک هاست اجرا میشوند، انتخاب بهتری هستند.