بازگشت به مجله
وب سرورتیم فنی هایوهاست۹ دقیقه مطالعه

بهینه سازی Nginx: فشرده سازی، کش و HTTP/2

چند تنظیم کوچک در Nginx میتواند حجم انتقال و زمان پاسخ را به شکل محسوسی کاهش دهد، بدون تغییر در برنامه.

سرعت تحویل

پیکربندی پیشفرض Nginx محافظه کارانه است و برای اینکه روی هر سروری بدون مشکل کار کند تنظیم شده، نه برای اینکه بهترین عملکرد را بدهد. چند تغییر ساده که در ادامه می آیند، معمولا بین سی تا هفتاد درصد حجم انتقال را کم میکنند و هیچ تغییری در کد برنامه لازم ندارند.

1

فعال کردن فشرده سازی

فشرده سازی در Nginx به صورت پیشفرض یا خاموش است یا فقط روی فایل های متنی ساده اعمال میشود. باید انواع فایل هایی که میخواهید فشرده شوند را صراحتا مشخص کنید.

دو نکته مهم: سطح فشرده سازی را روی مقدار میانه بگذارید چون سطوح بالاتر سود کمی دارند و پردازنده بیشتری مصرف میکنند. همچنین فایل های خیلی کوچک را فشرده نکنید، چون سربار آن از سودش بیشتر است.

افزودن به /etc/nginx/nginx.conf در بخش http
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 چون متنی است، فشرده سازی روی آن تاثیر زیادی دارد.
2

فعال کردن HTTP/2

این پروتکل اجازه میدهد چند فایل همزمان روی یک اتصال منتقل شوند و برای صفحاتی که منابع زیادی دارند تفاوت محسوسی ایجاد میکند. شرط استفاده از آن داشتن گواهی SSL است.

یک نکته درباره نحوه نوشتن: در نسخه های جدید Nginx، روش قدیمی نوشتن آن در انتهای خط listen منسوخ شده و باید از دستور جداگانه استفاده کنید. اگر در لاگ هشدار منسوخ شدن دیدید، دلیلش همین است.

روش درست در نسخه های جدید
server {
    listen 443 ssl;
    http2 on;
    server_name example.com;
}
روش قدیمی که دیگر توصیه نمیشود
listen 443 ssl http2;
3

کش فایل های ثابت در مرورگر

فایل هایی که تغییر نمیکنند نباید در هر بازدید دوباره دانلود شوند. با تنظیم زمان انقضا، مرورگر آنها را نگه میدارد و بازدیدهای بعدی به شکل محسوسی سریعتر میشوند.

اگر نام فایل های شما شامل نسخه یا هش است، میتوانید مدت طولانی تری تعیین کنید و مقدار immutable را اضافه کنید تا مرورگر حتی بررسی هم نکند.

افزودن به بلاک server
location ~* \.(css|js|jpg|jpeg|png|gif|ico|webp|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    access_log off;
}
4

کش پاسخ های پویا

این مورد بیشترین تاثیر را دارد اما باید با احتیاط استفاده شود. اگر صفحات شما برای همه کاربران یکسان است، میتوانید پاسخ تولید شده را ذخیره کنید تا درخواست های بعدی اصلا به برنامه نرسند.

حتما صفحاتی که مخصوص کاربر وارد شده هستند را از کش خارج کنید، وگرنه ممکن است صفحه یک کاربر به کاربر دیگری نمایش داده شود. این یکی از خطرناک ترین اشتباهات در تنظیم کش است.

تعریف فضای کش در بخش http
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;
}
5

تنظیم پردازش ها و اتصال ها

مقدار پیشفرض تعداد پردازش ها معمولا مناسب است چون خودکار با تعداد هسته ها تنظیم میشود، اما سقف اتصال همزمان هر پردازش اغلب پایین است و روی سرورهای پرترافیک باید افزایش یابد.

تنظیم در /etc/nginx/nginx.conf
worker_processes auto;

events {
    worker_connections 2048;
    multi_accept on;
}
6

بررسی اینکه تنظیمات واقعا اعمال شده

بعد از هر تغییر، به جای اعتماد به پیکربندی، نتیجه را از بیرون بررسی کنید. هدرهای پاسخ نشان میدهند فشرده سازی و کش فعال شده اند یا نه.

بررسی فشرده سازی
curl -I -H "Accept-Encoding: gzip" https://example.com
بررسی هدرهای کش یک فایل ثابت
curl -I https://example.com/style.css
تست و اعمال تغییرات
sudo nginx -t
sudo systemctl reload nginx

پرسش های پرتکرار

تفاوت gzip و brotli چیست؟

هر دو فشرده سازی انجام میدهند اما brotli معمولا حجم کمتری تولید میکند. brotli به صورت پیشفرض در Nginx وجود ندارد و باید ماژول آن نصب شود، در حالی که gzip همیشه در دسترس است.

چرا HTTP/2 روی سایت من فعال نمیشود؟

این پروتکل در مرورگرها فقط روی ارتباط امن کار میکند. تا وقتی گواهی SSL نصب نکرده اید و روی پورت ۴۴۳ سرویس نمیدهید، فعال نخواهد شد.

آیا فشرده سازی مصرف پردازنده را زیاد نمیکند؟

کمی زیاد میکند اما در سطح متوسط این هزینه ناچیز است و در مقابل کاهش حجم انتقال کاملا میصرفد. استفاده از بالاترین سطح فشرده سازی توصیه نمیشود چون سود کمی دارد و هزینه پردازش را زیاد میکند.

به راهنمای بیشتری نیاز دارید؟

تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.

گفتگو با پشتیبانی

ادامه یادگیری

مشاهده همه