در این بخش، با مفاهیم پایهای 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 راهاندازی کنید!