عنوان:

‫ NGINX برای توسعه‌دهندگان ASP.NET Core - قسمت هفتم - خودآزمایی


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۰۲ ۰۸:۰۵
آدرس: www.dntips.ir
در ادامه یک آزمون، برای سنجش دانش شما بر اساس محتوای این دوره تهیه شده‌است؛ پاسخ‌های مرتبط با آن‌ها را در انتهای مطلب، مشاهده خواهید کرد.

خودآزمایی دوره NGINX برای توسعه‌دهندگان ASP.NET Core

دستورالعمل: برای هر پرسش، فقط یک گزینه صحیح است. بهترین گزینه را انتخاب کنید.

۱. دلیل اصلی استفاده از NGINX به عنوان Reverse Proxy در کنار وب سرور Kestrel چیست؟
  • الف) Kestrel قادر به اجرا روی سیستم‌عامل لینوکس نیست.
  • ب) NGINX وظایف مربوط به لبه شبکه مانند مدیریت SSL، امنیت و توزیع بار را بهتر از Kestrel انجام می‌دهد.
  • ج) NGINX به طور کامل جایگزین Kestrel می‌شود و نیازی به اجرای Kestrel نیست.
  • د) سرعت اجرای کدهای #C در NGINX بیشتر از Kestrel است.

۲. تفاوت اصلی بین دستور sudo systemctl reload nginx و sudo systemctl restart nginx چیست؟
  • الف) هیچ تفاوت عملی وجود ندارد و هر دو یک کار را انجام می‌دهند.
  • ب) restart سریع‌تر است اما reload امن‌تر است.
  • ج) reload تنظیمات جدید را بدون قطع کردن ارتباطات فعال کاربران اعمال می‌کند، اما restart سرویس را کاملاً متوقف و دوباره راه‌اندازی می‌کند.
  • د) reload فقط فایل‌های conf. را بررسی می‌کند اما restart آن‌ها را اعمال می‌کند.

۳. وظیفه اصلی دستور proxy_pass در فایل کانفیگ NGINX چیست؟
  • الف) تنظیم هدرهای HTTP برای ارسال به سرور پشتیبان.
  • ب) مشخص کردن پورتی که NGINX باید روی آن به درخواست‌ها گوش دهد.
  • ج) هدایت (Forward) کردن درخواست دریافت شده به یک سرور یا upstream پشتیبان.
  • د) تعریف نام دامنه برای یک بلوک server.

۴. مشاهده خطای 502 Bad Gateway به طور معمول به چه معناست؟
  • الف) در فایل کانفیگ NGINX یک خطای نوشتاری (syntax error) وجود دارد.
  • ب) NGINX نمی‌تواند با اپلیکیشن پشتیبان (Kestrel) ارتباط برقرار کند، زیرا اپلیکیشن یا اجرا نشده یا در آدرس مشخص شده در دسترس نیست.
  • ج) کلاینت (مرورگر) اجازه دسترسی به این منبع را ندارد.
  • د) گواهینامه SSL منقضی شده است.

۵. ابزار certbot برای چه منظوری استفاده می‌شود؟
  • الف) بهینه‌سازی عملکرد و کش کردن محتوا در NGINX.
  • ب) یک ویرایشگر متن پیشرفته برای فایل‌های کانفیگ NGINX.
  • ج) خودکارسازی فرآیند دریافت، نصب و تمدید گواهینamه SSL/TLS از Let's Encrypt.
  • د) ابزاری برای تست کردن میزان بار قابل تحمل توسط سرور.

۶. دستور server_name در یک بلوک server چه نقشی دارد؟
  • الف) نامی برای بلوک upstream جهت استفاده در proxy_pass مشخص می‌کند.
  • ب) برای میزبانی چند وب‌سایت روی یک IP، مشخص می‌کند که این بلوک تنظیمات باید برای کدام دامنه اعمال شود.
  • ج) نام کاربری که NGINX با آن اجرا می‌شود را تعیین می‌کند.
  • د) مسیر فایل لاگ خطاهای مربوط به این بلوک را تعریف می‌کند.

۷. بلوک upstream در NGINX برای چه کاری تعریف می‌شود؟
  • الف) برای تعریف مجموعه‌ای (Pool) از سرورهای پشتیبان جهت توزیع بار (Load Balancing).
  • ب) برای کش کردن محتوای داینامیک اپلیکیشن.
  • ج) برای تنظیم هدرهای امنیتی مانند HSTS.
  • د) برای تعریف قوانین محدودسازی نرخ درخواست‌ها.

۸. در کدام سناریو استفاده از الگوریتم توزیع بار ip_hash ضروری است؟
  • الف) زمانی که بخواهیم درخواست‌ها به صورت کاملاً مساوی بین سرورها تقسیم شوند.
  • ب) زمانی که سرورهای پشتیبان دارای سخت‌افزار متفاوتی هستند.
  • ج) زمانی که اپلیکیشن از Session داخل حافظه (In-Memory) استفاده می‌کند و نیاز داریم درخواست‌های یک کاربر همیشه به همان سرور ارسال شود.
  • د) زمانی که بخواهیم سریع‌ترین الگوریتم توزیع بار را داشته باشیم.

۹. کدام هدر امنیتی به طور خاص برای جلوگیری از حمله Clickjacking استفاده می‌شود؟
  • الف) Strict-Transport-Security
  • ب) Content-Security-Policy
  • ج) X-Content-Type-Options
  • د) X-Frame-Options

۱۰. دستور limit_req در یک بلوک location برای چه منظوری به کار می‌رود؟
  • الف) برای محدود کردن حجم پاسخ‌های ارسالی از سرور.
  • ب) برای اعمال یک قانون محدودسازی نرخ درخواست (Rate Limit) که قبلاً با limit_req_zone تعریف شده است.
  • ج) برای محدود کردن تعداد ارتباطات همزمان به یک سرور پشتیبان.
  • د) برای محدود کردن حجم کش پراکسی.

۱۱. برای پشتیبانی صحیح از SignalR و WebSockets در NGINX، کدام تنظیمات ضروری است؟
  • الف) فقط افزایش دادن زمان proxy_read_timeout.
  • ب) استفاده از دستور proxy_pass_websockets on;.
  • ج) ارسال صحیح هدرهای Upgrade و Connection به سرور پشتیبان.
  • د) فعال کردن Gzip روی آن location خاص.

۱۲. در یک فایل docker-compose.yml، دستور proxy_pass http://aspnet-app:80; در کانفیگ NGINX به چه معناست؟
  • الف) aspnet-app یک دامنه عمومی است که باید در اینترنت قابل دسترس باشد.
  • ب) aspnet-app نام سرویس کانتینر اپلیکیشن است که توسط DNS داخلی داکر به IP آن کانتینر ترجمه می‌شود.
  • ج) aspnet-app یک نام مستعار است که باید در فایل /etc/hosts سرور تعریف شود.
  • د) aspnet-app یک متغیر است که باید با IP واقعی کانتینر جایگزین شود.

۱۳. پوشه /etc/nginx/sites-enabled/ به طور معمول حاوی چیست؟
  • الف) فایل اصلی nginx.conf.
  • ب) فایل‌های پشتیبان از تنظیمات سایت‌ها.
  • ج) لینک‌های نمادین (Symbolic Links) به فایل‌های کانفیگ سایت‌هایی که می‌خواهیم فعال باشند.
  • د) فایل‌های لاگ دسترسی و خطا.

۱۴. چرا اپلیکیشن ASP.NET Core را با systemd به عنوان یک سرویس اجرا می‌کنیم؟
  • الف) برای اینکه بتوانیم کد #C را روی لینوکس کامپایل کنیم.
  • ب) برای اینکه اپلیکیشن در پس‌زمینه اجرا شود و در صورت بروز خطا یا ری‌استارت شدن سرور، به طور خودکار دوباره اجرا شود.
  • ج) برای مدیریت فایل‌های کانفیگ NGINX به صورت خودکار.
  • د) برای باز کردن پورت‌های لازم در فایروال.

۱۵. دلیل اصلی سرو کردن فایل‌های استاتیک (CSS, JS, تصاویر) توسط NGINX به جای Kestrel چیست؟
  • الف) Kestrel قادر به سرو کردن فایل‌های استاتیک نیست.
  • ب) NGINX این کار را بسیار بهینه‌تر انجام می‌دهد و بار پردازشی را از روی دوش اپلیکیشن ASP.NET Core برمی‌دارد.
  • ج) این تنها راه برای امن کردن این فایل‌ها با HTTPS است.
  • د) چون نمی‌توان روی فایل‌های استاتیک که توسط Kestrel سرو می‌شوند، کش اعمال کرد.

۱۶. دستور proxy_cache_valid چه کاری انجام می‌دهد؟
  • الف) صحت و سلامت فایل‌های کش شده را بررسی می‌کند.
  • ب) حداکثر حجم قابل استفاده برای کش را تعیین می‌کند.
  • ج) مدت زمان اعتبار کش برای پاسخ‌هایی با کدهای وضعیت (Status Code) مختلف را تعیین می‌کند.
  • د) کش پراکسی را برای یک location خاص فعال یا غیرفعال می‌کند.

۱۷. کدام گزینه یک دلیل خوب برای فشرده نکردن (Gzip) یک نوع فایل است؟
  • الف) فایل بسیار بزرگ است.
  • ب) فایل از نوع JavaScript است.
  • ج) فایل از قبل فشرده شده است (مانند تصاویر JPEG یا فایل‌های ZIP).
  • د) فایل به صورت داینامیک تولید می‌شود.

۱8. هدر Strict-Transport-Security (HSTS) چه وظیفه‌ای دارد؟
  • الف) فقط درخواست فعلی را از HTTP به HTTPS ریدایرکت می‌کند.
  • ب) اتصال را رمزنگاری می‌کند.
  • ج) به مرورگر دستور می‌دهد که در آینده برای این دامنه، فقط و فقط از طریق HTTPS ارتباط برقرار کند.
  • د) محتوای ترکیبی (Mixed Content) را در صفحه بررسی می‌کند.

۱۹. قبل از اجرای دستور sudo systemctl reload nginx، اجرای کدام دستور یک بهترین رویه (Best Practice) حیاتی محسوب می‌شود؟
  • الف) sudo nginx -s stop
  • ب) sudo systemctl status nginx
  • ج) sudo ufw status
  • د) sudo nginx -t

۲۰. دستور try_files $uri @proxy; چه کاری انجام می‌دهد؟
  • الف) به عنوان یک صفحه جایگزین برای خطای 404 عمل می‌کند.
  • ب) ابتدا تلاش می‌کند یک فایل استاتیک مطابق با آدرس درخواستی پیدا کند و اگر پیدا نکرد، درخواست را به location نام‌گذاری شده @proxy ارسال می‌کند.
  • ج) راهی برای تعریف دو سرور پشتیبان مختلف است.
  • د) تست می‌کند که آیا سرور پراکسی آنلاین است یا خیر.


پاسخنامه و راهنمای تشریحی

۱. پاسخ صحیح: ب
  • راهنما: همانطور که در بخش اول آموختیم، Kestrel یک اپلیکیشن سرور عالی است، اما NGINX به عنوان یک وب سرور لبه (Edge)، در انجام وظایفی مانند خاتمه دادن به SSL، مدیریت هدرهای امنیتی، سرو کردن فایل‌های استاتیک و توزیع بار، بسیار کارآمدتر و قوی‌تر عمل می‌کند.

۲. پاسخ صحیح: ج
  • راهنما: این یکی از ویژگی‌های کلیدی NGINX است. دستور reload به فرآیند اصلی NGINX سیگنال می‌دهد که تنظیمات جدید را بخواند و فرآیندهای کارگر (worker processes) جدیدی را با تنظیمات جدید ایجاد کند، در حالی که فرآیندهای قدیمی به درخواست‌های فعال خود رسیدگی کرده و سپس به آرامی خاموش می‌شوند. این فرآیند منجر به اعمال تغییرات بدون هیچ‌گونه قطعی می‌شود.

۳. پاسخ صحیح: ج
  • راهنما:proxy_pass قلب تنظیمات یک Reverse Proxy است. این دستور به NGINX می‌گوید که درخواست دریافتی را به کدام آدرس (یک سرور مشخص یا یک گروه upstream) ارسال کند.

۴. پاسخ صحیح: ب
  • راهنما: خطای 502 به معنای "دروازه خراب" است. این یعنی NGINX (دروازه) تلاش کرده با سرور پشتیبان (اپلیکیشن Kestrel) صحبت کند اما پاسخی دریافت نکرده است. دلایل رایج آن خاموش بودن اپلیکیشن، crash کردن آن، یا اشتباه بودن آدرس/پورت در proxy_pass است.

۵. پاسخ صحیح: ج
  • راهنما:certbot ابزاری است که به صورت خودکار با Certificate Authority به نام Let's Encrypt ارتباط برقرار کرده، هویت دامنه شما را تأیید، گواهینامه SSL را دریافت و حتی فایل کانفیگ NGINX شما را برای استفاده از آن گواهینامه ویرایش می‌کند.

۶. پاسخ صحیح: ب
  • راهنما: این قابلیت به "میزبانی مجازی مبتنی بر نام" (Name-based Virtual Hosting) معروف است. NGINX هدر Host درخواست ورودی را می‌خواند و آن را با مقادیر server_name در بلوک‌های server مختلف مقایسه می‌کند تا بفهمد کدام مجموعه تنظیمات را باید برای آن درخواست اعمال کند.

۷. پاسخ صحیح: الف
  • راهنما: بلوک upstream برای تعریف یک نام برای گروهی از سرورها استفاده می‌شود. سپس می‌توان از این نام در دستور proxy_pass استفاده کرد تا NGINX ترافیک را بین سرورهای تعریف شده در آن گروه توزیع کند.

۸. پاسخ صحیح: ج
  • راهنما: الگوریتم ip_hash از آدرس IP کلاینت برای انتخاب سرور پشتیبان استفاده می‌کند. این تضمین می‌کند که یک کاربر خاص همیشه به یک سرور یکسان متصل شود. این برای حفظ حالت Session که روی همان سرور ذخیره شده (و بین سرورها به اشتراک گذاشته نشده) ضروری است. به این حالت "جلسات چسبنده" (Sticky Sessions) نیز می‌گویند.

۹. پاسخ صحیح: د
  • راهنما: حمله Clickjacking زمانی رخ می‌دهد که یک سایت مخرب، سایت شما را در یک نامرئی قرار داده و کاربر را فریب می‌دهد تا روی دکمه‌ای کلیک کند. هدر X-Frame-Options به مرورگر دستور می‌دهد که اجازه چنین کاری را ندهد.

۱۰. پاسخ صحیح: ب
  • راهنما: فرآیند Rate Limiting دو مرحله دارد: ابتدا با limit_req_zone یک ناحیه با قوانین مشخص (مثلاً ۵ درخواست در دقیقه) تعریف می‌کنیم و سپس با استفاده از limit_req در location مورد نظر، آن قانون را روی آن مسیر خاص اعمال می‌کنیم.

۱۱. پاسخ صحیح: ج
  • راهنما: پروتکل WebSocket با یک درخواست HTTP عادی که شامل هدرهای Upgrade و Connection است، آغاز می‌شود تا به سرور بگوید "بیایید این ارتباط را به WebSocket ارتقا دهیم". اگر این هدرها توسط پراکسی به درستی به سرور پشتیبان منتقل نشوند، این ارتقا شکست می‌خورد و ارتباط برقرار نمی‌شود.

۱۲. پاسخ صحیح: ب
  • راهنما: Docker یک شبکه مجازی داخلی با سرویس DNS مخصوص به خود ایجاد می‌کند. وقتی کانتینرها با Docker Compose راه‌اندازی می‌شوند، نام هر سرویس (در اینجا aspnet-app) به عنوان یک نام هاست در این شبکه ثبت می‌شود و سایر کانتینرها می‌توانند از طریق این نام با آن ارتباط برقرار کنند.

۱۳. پاسخ صحیح: ج
  • راهنما: این ساختار به شما اجازه می‌دهد تا به راحتی یک سایت را با ایجاد یا حذف لینک نمادین آن در پوشه sites-enabled، فعال یا غیرفعال کنید، بدون اینکه نیاز به حذف فایل اصلی تنظیمات از sites-available داشته باشید.

۱۴. پاسخ صحیح: ب
  • راهنما:systemd مدیر سرویس و فرآیند استاندارد در توزیع‌های مدرن لینوکس است. با تعریف اپلیکیشن به عنوان یک سرویس، سیستم‌عامل مدیریت چرخه حیات آن (اجرا، توقف، راه‌اندازی مجدد خودکار) را بر عهده می‌گیرد.

۱۵. پاسخ صحیح: ب
  • راهنما: NGINX برای عملیات I/O (ورودی/خروجی) بهینه شده و می‌تواند هزاران فایل استاتیک را با مصرف بسیار پایین حافظه و CPU سرو کند. واگذار کردن این وظیفه به NGINX، به اپلیکیشن ASP.NET Core اجازه می‌دهد تا تمام منابع خود را روی اجرای منطق داینامیک برنامه متمرکز کند.

۱۶. پاسخ صحیح: ج
  • راهنما: این دستور به شما کنترل دقیقی بر روی رفتار کش می‌دهد. برای مثال، می‌توانید بگویید پاسخ‌های موفق (200 OK) را ۱۰ دقیقه کش کن، اما پاسخ‌های "پیدا نشد" (404 Not Found) را فقط ۱ دقیقه کش کن تا در صورت ایجاد شدن منبع، سریع‌تر در دسترس قرار گیرد.

۱۷. پاسخ صحیح: ج
  • راهنما: تلاش برای فشرده کردن داده‌ای که از قبل فشرده شده (مانند تصاویر، ویدئوها یا فایل‌های zip)، نه تنها فایده‌ای ندارد بلکه به دلیل سربار فرآیند فشرده‌سازی، ممکن است حجم فایل نهایی را کمی افزایش هم بدهد و CPU را بیهوده مصرف کند.

۱8. پاسخ صحیح: ج
  • راهنما: HSTS یک مکانیزم امنیتی قدرتمند است که پس از اولین بازدید موفق از سایت با HTTPS، به مرورگر می‌گوید که تا مدت زمان مشخص شده (max-age)، هرگز تلاشی برای اتصال به این دامنه از طریق HTTP نکند و تمام درخواست‌ها را به صورت داخلی به HTTPS تبدیل کند.

۱۹. پاسخ صحیح: د
  • راهنما: دستور nginx -t فایل‌های کانفیگ شما را برای هرگونه خطای نوشتاری یا منطقی بررسی می‌کند. اگر شما بدون تست کردن، reload کنید و خطایی در کانفیگ وجود داشته باشد، NGINX ممکن است نتواند تنظیمات جدید را بارگذاری کند یا حتی متوقف شود.

۲۰. پاسخ صحیح: ب
  • راهنما: این یک الگوی بسیار رایج و کارآمد برای سرو کردن فایل‌های استاتیک است. NGINX ابتدا سعی می‌کند منبع درخواستی را به عنوان یک فایل ($uri) در مسیر root پیدا کند. اگر موفق نشد، به جای برگرداندن خطای 404، کنترل را به location دیگری به نام @proxy واگذار می‌کند که وظیفه ارسال درخواست به اپلیکیشن پشتیبان را بر عهده دارد.