طرح‌چه

فشرده سازی پاسخ ها | Nginx from scratch

۲۸ تیر ۱۴۰۴

فشرده سازی پاسخ ها | Nginx from scratch
با فشرده‌سازی پاسخ‌ها، حجم داده‌ی ارسالی کاهش می‌یابد و انتقال آن از طریق شبکه سریع‌تر انجام می‌شود.

فشرده‌سازی پاسخ ها باعث کاهش حجم فایل‌هایی مانند HTML، CSS، JavaScript و JSON تا حدود ۷۰٪ یا بیشتر می‌شود! بعد از فشرده سازی, به‌ دلیل کوچک‌تر بودن حجم داده ها, سریعتر از طریق شبکه انتقال پیدا می کنند و این باعث افزایش سرعت لود شدن وبسایت می شود. 

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

یکی از الگوریتم هایی که میتوانیم برای فشرده سازی استفاده کنیم gzip نام دارد. برای فعال کردن آن میتوان از دستور gzip on استفاده کرد. دستور gzip_types مشخص می‌کند فشرده‌سازی فقط روی پاسخ‌هایی انجام شود که نوع محتوای آن‌ها (Content-Type) با مقادیر تعیین‌شده مطابقت دارد.

server {
    listen 9055 default_server;

    location / {
        root /var/www/public;
        index index.html;
    }

    gzip on;
    gzip_types text/plain application/json;
    gzip_vary on;
}

دستور gzip_vary چه کاربردی داره؟

وقتی gzip فعال می‌شود، nginx پاسخ درخواست‌ها را قبل از ارسال به مرورگر کاربر فشرده می‌کند تا حجم داده‌ها کاهش یافته و انتقال سریع‌تر انجام شود. اما همه مرورگرها یا کلاینت‌ها ممکن است از فشرده‌سازی پشتیبانی نکنند.

برای اینکه سرور بداند مرورگر توانایی بازکردن فایل فشرده را دارد یا خیر، مرورگر هنگام ارسال درخواست هدر Accept-Encoding را می‌فرستد که در آن مشخص می‌کند مثلاً gzip را پشتیبانی می‌کند یا نه!

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

برای جلوگیری از این مشکل، باید به کش‌ها اطلاع داده شود که پاسخ‌ها ممکن است بر اساس هدر Accept-Encoding متفاوت باشند. این کار با اضافه کردن هدر Vary: Accept-Encoding به پاسخ‌ها انجام می‌شود. 

با فعال‌سازی دستور ‍gzip_vary on، سرور این هدر را به صورت خودکار به پاسخ‌های فشرده‌شده اضافه می‌کند. این باعث می‌شود کش‌ها متوجه شوند که بسته به مقدار هدر Accept-Encoding کلاینت، پاسخ‌ها متفاوت خواهند بود. بنابراین کش فقط نسخه فشرده را برای کلاینت‌هایی که gzip را قبول دارند نگه می‌دارد و نسخه معمولی را برای بقیه ارسال می‌کند. 

در نتیجه، دستور ‍gzip_vary on  نقش مهمی در تضمین ارسال فایل‌های فشرده تنها به مرورگرهای پشتیبانی‌کننده دارد و به همه کاربران این امکان را می‌دهد که بدون خطا و مشکل صفحات سایت را مشاهده کنند.

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


قسمت قبل: بلاک و وایت لیست کردن آیپی ها | Nginx from scratch

قسمت بعد: مودیفایرهای لوکیشن (location modifiers) | Nginx from scratch


دیدگاه ها