NGINX برای توسعهدهندگان ASP.NET Core - قسمت چهارم - بهینهسازی عملکرد
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۳۰ ۰۸:۰۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
/etc/nginx/nginx.conf را باز کرده و داخل بلوک http کد زیر را اضافه کنید:http {
# ... سایر تنظیمات http
upstream my_aspnet_app_backend {
# least_conn; # <-- میتوانید الگوریتم را مشخص کنید
server localhost:5000;
server localhost:5001;
server localhost:5002;
}
# ...
}# در فایل /etc/nginx/sites-available/my-aspnet-app.conf
server {
# ...
location @proxy {
proxy_pass http://my_aspnet_app_backend; # <--- این خط تغییر میکند
# ... سایر تنظیمات پراکسی
}
}round_robin (پیشفرض): درخواستها به نوبت بین سرورها تقسیم میشوند.least_conn: درخواست به سروری ارسال میشود که کمترین تعداد ارتباط فعال را دارد. برای درخواستهای زمانبر مناسب است.ip_hash: تضمین میکند که تمام درخواستهای یک کاربر (بر اساس IP) همیشه به یک سرور خاص ارسال شود. این برای اپلیکیشنهایی که از Session داخل حافظه (In-Memory) استفاده میکنند، ضروری است. برای فعالسازی کافی است خط ip_hash; را به ابتدای بلوک upstream اضافه کنید.sudo nginx -t && sudo systemctl reload nginx.# در فایل /etc/nginx/nginx.conf داخل بلوک http proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_app_cache:10m inactive=60m max_size=1g;
keys_zone=my_app_cache:10m: یک ناحیه حافظه اشتراکی به نام my_app_cache و با حجم ۱۰ مگابایت برای نگهداری کلیدهای کش ایجاد میکند.inactive=60m: اگر یک آیتم کش شده به مدت ۶۰ دقیقه استفاده نشود، حذف خواهد شد.max_size=1g: حداکثر حجم کش روی دیسک را ۱ گیگابایت تعیین میکند.# در فایل /etc/nginx/sites-available/my-aspnet-app.conf
server {
# ...
# برای دیباگ کردن، این هدر وضعیت کش را نشان میدهد (HIT, MISS, EXPIRED)
add_header X-Proxy-Cache $upstream_cache_status;
location /api/public/products {
proxy_cache my_app_cache;
proxy_cache_valid 200 10m; # پاسخهای موفق (200) را ۱۰ دقیقه کش کن
proxy_cache_valid 404 1m; # پاسخهای "پیدا نشد" (404) را ۱ دقیقه کش کن
# اگر سرور پشتیبان از دسترس خارج بود، از نسخه تاریخ مصرف گذشته کش استفاده کن
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_pass http://my_aspnet_app_backend;
# ... سایر تنظیمات پراکسی
}
# سایر درخواستها بدون کش به پراکسی ارسال میشوند
location / {
proxy_pass http://my_aspnet_app_backend;
# ... سایر تنظیمات پراکسی
}
}# در فایل /etc/nginx/nginx.conf داخل بلوک http ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # برای مرورگرهای بسیار قدیمی IE6 غیرفعال شود gzip_vary on; gzip_proxied any; gzip_comp_level 6; # سطح فشردهسازی بین ۱ تا ۹ (۶ یک تعادل خوب است) gzip_buffers 16 8k; gzip_http_version 1.1; # فقط فایلهای متنی را فشرده کن، نه تصاویر یا فایلهای فشرده دیگر gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip on;: فشردهسازی Gzip را فعال میکند.gzip_types: لیست انواع فایلهایی (MIME Type) که باید فشرده شوند را مشخص میکند. بسیار مهم است که فرمتهای از قبل فشرده شده مانند jpg یا png را در این لیست قرار ندهید.نکته:Brotli یک الگوریتم فشردهسازی جدیدتر و معمولاً کارآمدتر از Gzip است. برای فعالسازی آن ممکن است نیاز به نصب یک ماژول اضافی در NGINX داشته باشید (sudo apt install libnginx-mod-brotli).Content-Encoding: gzip به پاسخهای شما اضافه شده است.