عنوان:

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


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۲۷ ۰۸:۱۰
آدرس: www.dntips.ir
در این بخش، با مفاهیم پایه‌ای NGINX آشنا می‌شویم و مهم‌تر از همه، بررسی می‌کنیم که چرا یادگیری آن برای یک توسعه‌دهنده ASP.NET Core یک مزیت بزرگ محسوب می‌شود.

۱. NGINX چیست و چه کاربردهایی دارد؟
NGINX (بخوانید "Engine-X") یک نرم‌افزار متن‌باز و بسیار قدرتمند است که در دنیای وب مدرن نقش‌های مختلفی ایفا می‌کند. شاید اسم آن را به عنوان یک "وب سرور" شنیده باشید، اما قابلیت‌های آن بسیار فراتر است.
مهم‌ترین کاربردهای NGINX عبارت‌اند از:
  • وب سرور (Web Server): وظیفه اصلی آن، تحویل دادن فایل‌های استاتیک (مانند فایل‌های HTML, CSS, JavaScript و تصاویر) به مرورگر کاربر است. NGINX در این کار، فوق‌العاده سریع و بهینه عمل می‌کند.
  • ریورس پراکسی (Reverse Proxy): این مهم‌ترین کاربرد برای ماست. NGINX می‌تواند به عنوان یک واسطه بین کاربران اینترنت و اپلیکیشن ASP.NET Core شما (که روی سرور Kestrel در حال اجراست) قرار بگیرد. تمام درخواست‌ها ابتدا به NGINX می‌رسند و سپس به سمت اپلیکیشن شما هدایت می‌شوند.
  • لود بالانسر (Load Balancer): اگر اپلیکیشن شما بازدید بالایی داشته باشد، می‌توانید چندین نسخه (Instance) از آن را همزمان اجرا کنید. NGINX ترافیک ورودی را بین این نسخه‌ها تقسیم می‌کند تا بار کاری سرور متعادل شده و پایداری سرویس افزایش یابد.
  • مدیریت SSL/TLS: به سادگی می‌توانید گواهینامه‌های SSL را روی NGINX نصب کنید تا ارتباطات سایت شما به صورت HTTPS امن شود. NGINX وظیفه سنگین رمزنگاری و رمزگشایی را به دوش می‌کشد.
  • کش سرور (Cache Server): می‌تواند پاسخ‌های تکراری را در حافظه خود ذخیره کند (کش کند) تا در درخواست‌های بعدی، بدون مراجعه به اپلیکیشن شما، مستقیماً به کاربر پاسخ دهد و سرعت را به شدت افزایش دهد.
ویژگی‌های کلیدی NGINX:عملکرد فوق‌العاده بالا، مصرف بسیار پایین منابع (حافظه و CPU) و پایداری بالا آن را به یکی از محبوب‌ترین ابزارها برای میزبانی وب‌سایت‌های بزرگ تبدیل کرده است.

۲. چرا در کنار Kestrel به NGINX نیاز داریم؟
این مورد یک سؤال بسیار رایج است: "اپلیکیشن ASP.NET Core به صورت پیش‌فرض با وب سرور Kestrel اجرا می‌شود. پس چرا باید از یک وب سرور دیگر در کنار آن استفاده کنیم؟"
جواب کوتاه: Kestrel یک اپلیکیشن سرور عالی است، اما NGINX یک وب سرور لبه (Edge) فوق‌العاده است.
بیایید این موضوع را با یک مثال ساده توضیح دهیم:
  • Kestrel 🧑‍🍳: آن را مانند یک سرآشپز حرفه‌ای در آشپزخانه رستوران خود در نظر بگیرید. او در پختن غذا (اجرای منطق برنامه شما) تخصص دارد و این کار را به بهترین شکل انجام می‌دهد.
  • NGINX 🤵: آن را مانند تیم جلوی رستوران (مدیر سالن، نگهبانان و گارسون‌ها) در نظر بگیرید. این تیم وظیفه خوشامدگویی به مشتریان، گرفتن سفارش‌ها، مدیریت صف و تأمین امنیت سالن را بر عهده دارد. آن‌ها آشپزخانه را از شلوغی و خطرات دنیای بیرون محافظت می‌کنند.

مزایای استفاده از NGINX در مقابل Kestrel:
  • امنیت (Security) 🛡️: Kestrel برای اینکه مستقیماً در معرض اینترنت قرار بگیرد، طراحی نشده است. NGINX به عنوان یک سپر دفاعی عمل می‌کند، درخواست‌های ورودی را فیلتر کرده و از اپلیکیشن شما در برابر حملات رایج وب محافظت می‌کند.
  • مدیریت متمرکز HTTPS/SSL 🔒: به جای درگیر کردن اپلیکیشن ASP.NET Core با تنظیمات پیچیده SSL، می‌توانید این وظیفه را به طور کامل به NGINX بسپارید. این کار مدیریت گواهینامه‌ها را بسیار ساده‌تر می‌کند.
  • سرویس‌دهی بهینه فایل‌های استاتیک 🚀: NGINX فایل‌های CSS, JavaScript و تصاویر را بسیار سریع‌تر از Kestrel به کاربران تحویل می‌دهد. این کار بار پردازشی را از روی دوش اپلیکیشن شما برمی‌دارد تا Kestrel بتواند تمام منابع خود را صرف اجرای کدهای شما کند.
  • مقیاس‌پذیری و Load Balancing ⚖️: با NGINX می‌توانید به راحتی ترافیک را بین چند سرور اپلیکیشن تقسیم کنید، بدون اینکه نیاز به تغییر در کد خود داشته باشید.
  • میزبانی چندین سایت روی یک سرور 🏗️: با NGINX می‌توانید ده‌ها وب‌سایت (حتی با تکنولوژی‌های مختلف) را روی یک سرور و یک IP میزبانی کرده و ترافیک را بر اساس نام دامنه به اپلیکیشن مربوطه هدایت کنید.
نتیجه‌گیری: طبق توصیه رسمی مایکروسافت، بهترین روش (Best Practice) برای میزبانی اپلیکیشن‌های ASP.NET Core در محیط Production، قرار دادن آن پشت یک Reverse Proxy مانند NGINX است.

۳. نصب و راه‌اندازی NGINX
در این دوره از توزیع Ubuntu لینوکس به عنوان سیستم‌عامل استاندارد استفاده می‌کنیم. نصب NGINX روی آن بسیار ساده است.
۱. به‌روزرسانی لیست پکیج‌ها:
sudo apt update

۲. نصب NGINX:
sudo apt install nginx
تمام شد! به همین سادگی.

۳. بررسی وضعیت سرویس NGINX:
برای اطمینان از اینکه NGINX به درستی نصب و اجرا شده است، از دستور زیر استفاده کنید:
sudo systemctl status nginx
اگر خروجی شامل عبارت active (running) به رنگ سبز بود، یعنی همه چیز مرتب است.

۴. دستورات اصلی برای مدیریت NGINX:
این دستورات را به خاطر بسپارید، چون بارها از آن‌ها استفاده خواهیم کرد.
  • sudo systemctl start nginx: برای شروع به کار سرویس.
  • sudo systemctl stop nginx: برای متوقف کردن سرویس.
  • sudo systemctl restart nginx: برای راه‌اندازی مجدد سرویس (سرویس را متوقف و دوباره اجرا می‌کند).
  • sudo systemctl reload nginx: این دستور بسیار مهم است. برای اعمال تغییرات جدید در فایل‌های کانفیگ، بدون قطع کردن ارتباط کاربران فعلی، از این دستور استفاده کنید.
  • sudo systemctl enable nginx: برای اینکه سرویس NGINX با هر بار روشن شدن سرور، به صورت خودکار اجرا شود.

۴. ساختار فایل‌های پیکربندی NGINX
قدرت واقعی NGINX در فایل‌های متنی پیکربندی آن نهفته است. در ابتدا شاید کمی پیچیده به نظر برسند، اما ساختار منطقی و ساده‌ای دارند.
فایل اصلی: /etc/nginx/nginx.conf
  • این فایل، پیکربندی اصلی و سراسری NGINX را در خود دارد. معمولاً ما برای اضافه کردن سایت‌های خودمان، این فایل را مستقیماً ویرایش نمی‌کنیم.

پیکربندی سایت‌ها (روش استاندارد):
  • NGINX یک روش هوشمندانه برای مدیریت فایل‌های کانفیگ سایت‌های مختلف دارد.
  • /etc/nginx/sites-available/: این پوشه، "کتابخانه" تنظیمات سایت‌های شماست. برای هر سایت یا اپلیکیشنی که می‌خواهید میزبانی کنید، یک فایل کانفیگ جداگانه در این پوشه می‌سازید (مثلاً my-aspnet-app.conf).
  • /etc/nginx/sites-enabled/: برنامه NGINX فقط فایل‌هایی را می‌خواند که در این پوشه قرار دارند. ما فایل‌های کانفیگ مورد نظرمان را از پوشه sites-available به این پوشه لینک می‌دهیم تا فعال شوند. این ساختار به شما اجازه می‌دهد یک سایت را بدون حذف فایل تنظیماتش، به راحتی فعال یا غیرفعال کنید.

نحوه فعال‌سازی یک سایت:
برای فعال کردن یک سایت، یک لینک نمادین (Symbolic Link) از فایل کانفیگ آن به پوشه sites-enabled می‌سازیم:
sudo ln -s /etc/nginx/sites-available/your-config-file /etc/nginx/sites-enabled/

تست کردن کانفیگ قبل از اعمال:
نکته بسیار مهم: همیشه قبل از reload کردن NGINX، صحت فایل‌های کانفیگ خود را با دستور زیر بررسی کنید تا از بروز خطا جلوگیری شود:
sudo nginx -t
اگر خروجی syntax is ok و test is successful را مشاهده کردید، با خیال راحت می‌توانید NGINX را reload کنید.

با این دانش پایه، شما آماده‌اید تا در بخش بعدی، اولین اپلیکیشن ASP.NET Core خود را با استفاده از NGINX به عنوان Reverse Proxy راه‌اندازی کنید!

نظرات

  • وحید نصیری در ۱۴۰۴/۰۳/۲۷ ۱۰:۵۲
    یک نکته‌ی تکمیلی: توضیح کامل ساختار sites-available و sites-enabled برای تازه‌کارها

    تصور کنید شما مدیر یک رستوران بزرگ هستید.
    پوشه sites-available (کتاب آشپزی کامل شما) چیست؟
    این پوشه را مانند کتاب آشپزی اصلی و کامل رستوران خود در نظر بگیرید. شما تمام دستور پخت‌هایی (Recipes) که بلد هستید یا ممکن است روزی بخواهید سرو کنید را در این کتاب بزرگ می‌نویسید. دستور پخت "پیتزا پپرونی"، "سالاد سزار"، "استیک"، "لازانیا" و... همه و همه در این کتاب موجود است. در دنیای NGINX: پوشه /etc/nginx/sites-available/ جایی است که شما فایل‌های پیکربندی (کانفیگ) تمام وب‌سایت‌ها و اپلیکیشن‌هایی که روی این سرور دارید یا ممکن است در آینده داشته باشید را ایجاد می‌کنید. برای هر سایت، یک فایل جداگانه می‌سازید. مثلا:
    • my-blog.com.conf
    • my-shop.com.conf
    • test-app.conf (یک اپلیکیشن تستی)
    این فایل‌ها، فایل‌های اصلی و واقعی شما هستند.

    پوشه sites-enabled (منوی امروز رستوران)چیست؟
    حالا تصور کنید که امروز سه‌شنبه است و شما نمی‌خواهید تمام غذاهای کتاب آشپزی را سرو کنید. شما فقط می‌خواهید "پیتزا پپرونی" و "سالاد سزار" را در منوی امروز قرار دهید. چکار می‌کنید؟ شما دستور پخت‌ها را دوباره نمی‌نویسید! فقط یک برگه کوچک برمی‌دارید و روی آن می‌نویسید: "امروز سرو می‌شود: پیتزا (مراجعه به صفحه ۵۴ کتاب)، سالاد (مراجعه به صفحه ۱۲ کتاب)". این برگه کوچک، منوی فعال شماست. در دنیای NGINX: پوشه /etc/nginx/sites-enabled/ دقیقاً مانند منوی فعال شماست. خود NGINX وقتی اجرا می‌شود، فقط و فقط به محتویات این پوشه نگاه می‌کند تا بفهمد کدام سایت‌ها را باید فعال کرده و به درخواست‌هایشان پاسخ دهد.

    "لینک نمادین" (Symbolic Link) - جادوی اتصال این دو پوشه
    حالا سوال اصلی اینجاست: چطور آن "ارجاع" از منوی روزانه به کتاب آشپزی را ایجاد کنیم؟ در لینوکس این کار با یک ابزار فوق‌العاده قدرتمند به نام لینک نمادین (Symbolic Link) انجام می‌شود. لینک نمادین چیست؟ آن را مانند یک "شورتکات" (Shortcut) بسیار هوشمند در ویندوز در نظر بگیرید. این لینک، یک فایل واقعی نیست، بلکه فقط یک اشاره‌گر به یک فایل دیگر است:
    • اگر فایل اصلی (در sites-available) را ویرایش کنید، لینک (در sites-enabled) به صورت خودکار به نسخه جدید اشاره می‌کند.
    • اگر لینک را حذف کنید، فایل اصلی هیچ آسیبی نمی‌بیند.

    مقایسه‌ای با تجربه‌ی ویندوزی شما (IIS):
    در IIS شما روی یک سایت راست‌کلیک کرده و گزینه "Start" یا "Stop" را می‌زنید. در NGINX، شما همین کار را با ایجاد یا حذف یک لینک نمادین انجام می‌دهید!

    فعال کردن یک سایت (Start کردن در IIS):
    ما یک لینک از فایل کانفیگ مورد نظرمان به پوشه sites-enabled ایجاد می‌کنیم.
    # فرمت کلی: ln -s [فایل اصلی] [محل قرارگیری شورتکات]
    sudo ln -s /etc/nginx/sites-available/my-blog.com.conf /etc/nginx/sites-enabled/
    با این دستور، ما به NGINX می‌گوییم: "لطفاً سایت my-blog.com را به منوی فعال خود اضافه کن."

    غیرفعال کردن یک سایت (Stop کردن در IIS):
    ما فقط لینک (شورتکات) را از پوشه sites-enabled حذف می‌کنیم.
    sudo rm /etc/nginx/sites-enabled/my-blog.com.conf
    نکته حیاتی: این دستور فقط شورتکات را پاک می‌کند. فایل اصلی کانفیگ شما در sites-available کاملاً امن و دست‌نخورده باقی می‌ماند. شما هر زمان که بخواهید می‌توانید دوباره با دستور ln -s آن را فعال کنید.

    مزایای استفاده از این ساختار ویژه
    • ایمنی (Safety): شما هیچ‌وقت نگران حذف تصادفی کانفیگ اصلی یک سایت نیستید. غیرفعال کردن یک سایت، یک عملیات غیرمخرب است.
    • تمیزی و سازماندهی (Organization): همیشه می‌دانید که تمام کانفیگ‌های ممکن کجا هستند (sites-available) و کدام‌ها در حال حاضر فعال هستند (sites-enabled).
    • سرعت و سادگی (Simplicity): فعال یا غیرفعال کردن یک وب‌سایت فقط با یک دستور ساده و سریع انجام می‌شود. دیگر نیازی به کامنت کردن کل محتوای یک فایل یا تغییر نام آن نیست.
    • مدیریت آسان: وقتی ۱۰ سایت روی یک سرور دارید، مدیریت آن‌ها با این روش بسیار ساده‌تر از داشتن تمام کانفیگ‌ها در یک پوشه شلوغ است.

    به طور خلاصه، این ساختار یک راه حل زیبا، امن و کارآمد برای مشکلی رایج در مدیریت سرور است که به شما اجازه می‌دهد با اطمینان و سرعت بالا، وب‌سایت‌های خود را مدیریت کنید.