پیکربندی پیشفرض Nginx محافظه کارانه است و برای اینکه روی هر سروری بدون مشکل کار کند تنظیم شده، نه برای اینکه بهترین عملکرد را بدهد. چند تغییر ساده که در ادامه می آیند، معمولا بین سی تا هفتاد درصد حجم انتقال را کم میکنند و هیچ تغییری در کد برنامه لازم ندارند.
فعال کردن فشرده سازی
فشرده سازی در Nginx به صورت پیشفرض یا خاموش است یا فقط روی فایل های متنی ساده اعمال میشود. باید انواع فایل هایی که میخواهید فشرده شوند را صراحتا مشخص کنید.
دو نکته مهم: سطح فشرده سازی را روی مقدار میانه بگذارید چون سطوح بالاتر سود کمی دارند و پردازنده بیشتری مصرف میکنند. همچنین فایل های خیلی کوچک را فشرده نکنید، چون سربار آن از سودش بیشتر است.
gzip on;
gzip_vary on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;- تصاویر jpg و png را فشرده نکنید؛ از قبل فشرده هستند.
- گزینه gzip_vary برای درست کار کردن کش میانی لازم است.
- قالب svg چون متنی است، فشرده سازی روی آن تاثیر زیادی دارد.
فعال کردن HTTP/2
این پروتکل اجازه میدهد چند فایل همزمان روی یک اتصال منتقل شوند و برای صفحاتی که منابع زیادی دارند تفاوت محسوسی ایجاد میکند. شرط استفاده از آن داشتن گواهی SSL است.
یک نکته درباره نحوه نوشتن: در نسخه های جدید Nginx، روش قدیمی نوشتن آن در انتهای خط listen منسوخ شده و باید از دستور جداگانه استفاده کنید. اگر در لاگ هشدار منسوخ شدن دیدید، دلیلش همین است.
server {
listen 443 ssl;
http2 on;
server_name example.com;
}listen 443 ssl http2;کش فایل های ثابت در مرورگر
فایل هایی که تغییر نمیکنند نباید در هر بازدید دوباره دانلود شوند. با تنظیم زمان انقضا، مرورگر آنها را نگه میدارد و بازدیدهای بعدی به شکل محسوسی سریعتر میشوند.
اگر نام فایل های شما شامل نسخه یا هش است، میتوانید مدت طولانی تری تعیین کنید و مقدار immutable را اضافه کنید تا مرورگر حتی بررسی هم نکند.
location ~* \.(css|js|jpg|jpeg|png|gif|ico|webp|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}کش پاسخ های پویا
این مورد بیشترین تاثیر را دارد اما باید با احتیاط استفاده شود. اگر صفحات شما برای همه کاربران یکسان است، میتوانید پاسخ تولید شده را ذخیره کنید تا درخواست های بعدی اصلا به برنامه نرسند.
حتما صفحاتی که مخصوص کاربر وارد شده هستند را از کش خارج کنید، وگرنه ممکن است صفحه یک کاربر به کاربر دیگری نمایش داده شود. این یکی از خطرناک ترین اشتباهات در تنظیم کش است.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=APPCACHE:20m inactive=60m;set $skip_cache 0;
if ($http_cookie ~* "logged_in") {
set $skip_cache 1;
}تنظیم پردازش ها و اتصال ها
مقدار پیشفرض تعداد پردازش ها معمولا مناسب است چون خودکار با تعداد هسته ها تنظیم میشود، اما سقف اتصال همزمان هر پردازش اغلب پایین است و روی سرورهای پرترافیک باید افزایش یابد.
worker_processes auto;
events {
worker_connections 2048;
multi_accept on;
}بررسی اینکه تنظیمات واقعا اعمال شده
بعد از هر تغییر، به جای اعتماد به پیکربندی، نتیجه را از بیرون بررسی کنید. هدرهای پاسخ نشان میدهند فشرده سازی و کش فعال شده اند یا نه.
curl -I -H "Accept-Encoding: gzip" https://example.comcurl -I https://example.com/style.csssudo nginx -t
sudo systemctl reload nginxپرسش های پرتکرار
تفاوت gzip و brotli چیست؟
هر دو فشرده سازی انجام میدهند اما brotli معمولا حجم کمتری تولید میکند. brotli به صورت پیشفرض در Nginx وجود ندارد و باید ماژول آن نصب شود، در حالی که gzip همیشه در دسترس است.
چرا HTTP/2 روی سایت من فعال نمیشود؟
این پروتکل در مرورگرها فقط روی ارتباط امن کار میکند. تا وقتی گواهی SSL نصب نکرده اید و روی پورت ۴۴۳ سرویس نمیدهید، فعال نخواهد شد.
آیا فشرده سازی مصرف پردازنده را زیاد نمیکند؟
کمی زیاد میکند اما در سطح متوسط این هزینه ناچیز است و در مقابل کاهش حجم انتقال کاملا میصرفد. استفاده از بالاترین سطح فشرده سازی توصیه نمیشود چون سود کمی دارد و هزینه پردازش را زیاد میکند.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.