چالشهای متداول توسعهدهندگان ASP.NET Core هنگام استفاده از Nginx - قسمت ششم - مباحث پیشرفته و بهینهسازی عملکرد
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۱۲ ۰۸:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
location در کانفیگ Nginx خود دقت کنید:location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
# --- این دو خط برای WebSocket حیاتی هستند ---
# به Kestrel میگوید که کلاینت درخواست ارتقای پروتکل را دارد
proxy_set_header Upgrade $http_upgrade;
# نوع کانکشن را روی "upgrade" تنظیم میکند تا ارتباط باز بماند
proxy_set_header Connection "upgrade";
# ... سایر هدرها
}/etc/nginx/nginx.conf و داخل بلاک http قرار میگیرند. http {
# ... سایر تنظیمات
# فعالسازی Gzip
gzip on;
# به پراکسیها میگوید که نسخه فشرده را کش کنند
gzip_vary on;
# برای تمام درخواستهایی که از طریق پراکسی میآیند اعمال شود
gzip_proxied any;
# سطح فشردهسازی (بین ۱ تا ۹، ۶ یک انتخاب معقول است)
gzip_comp_level 6;
# نوع فایلهایی که باید فشرده شوند
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}location مربوط به فایلهای استاتیک که در فصل ۳ ساختیم را به شکل زیر تکمیل میکنیم: location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ {
root /var/www/mywebapp/wwwroot;
# به مرورگر میگوید این فایل را برای ۷ روز کش کند
expires 7d;
# به کشهای عمومی (مانند CDN) نیز اجازه کش کردن میدهد
add_header Cache-Control "public";
}nginx.conf: در بلاک http یک محدوده تعریف میکنیم. http {
# ...
# یک محدوده حافظه ۱۰ مگابایتی تعریف میکند که به هر IP اجازه ۱۰ درخواست در ثانیه را میدهد
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=10r/s;
}location سایت خود، این محدوده را اعمال میکنیم. location / {
# اعمال محدوده تعریف شده
limit_req zone=global_limit burst=20;
# ... تنظیمات پراکسی
}burst=20 اجازه میدهد تا ۲۰ درخواست به صورت آنی و پشت سر هم ارسال شوند تا کاربران عادی دچار مشکل نشوند. درخواستهای بیشتر با خطای 503 Service Unavailable پاسخ داده میشوند.localhost:5000) برای ارتباط بین Nginx و Kestrel، میتوان از سوکتهای یونیکس استفاده کرد. این کار کمی عملکرد را بهبود میبخشد (چون از پشته شبکه TCP/IP عبور نمیکند) و مشکل تداخل پورتها در سرور را از بین میبرد.Program.cs):builder.WebHost.ConfigureKestrel(options =>
{
// این خط را کامنت یا حذف کنید
// options.Listen(IPAddress.Loopback, 5000);
// و این خط را اضافه کنید
options.ListenUnixSocket("/var/run/kestrel-mywebapp.sock");
});location / {
# این خط را تغییر دهید
# proxy_pass http://localhost:5000;
# به این خط
proxy_pass http://unix:/var/run/kestrel-mywebapp.sock;
# ...
}www-data) باید دسترسی خواندن و نوشتن به این فایل سوکت داشته باشد. این موضوع میتواند نیازمند تنظیمات دسترسی بیشتری باشد و به همین دلیل یک تکنیک پیشرفته محسوب میشود.dotnet run اجرا میشد، تا یک زیرساخت تولید حرفهای، امن و با عملکرد بالا طی کردیم.systemd به یک سرویس پایدار تبدیل کنید.