بهبود عملکرد وب‌سایت با gzip در Nginx

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

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

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

به دلیل نحوه فشرده‌سازی و عملکرد gzip، برخی فایل‌ها بهتر فشرده می‌شوند. به طور مثال، فایل‌های متنی به خوبی فشرده می‌شوند و معمولاً بیش از دو برابر کوچک‌تر می‌شوند. در مقابل، تصاویری مانند JPEG یا PNG ذاتاً قبلاً فشرده شده‌اند و فشرده‌سازی مجدد آنها با gzip نتیجه خاصی ندارد. فشرده‌سازی فایل‌ها منابع سرور را مصرف می‌کند، پس بهتر است فقط فایل‌هایی که از کاهش حجم بهره‌مند می‌شوند را فشرده کنید.

در این آموزش شما Nginx را طوری پیکربندی می‌کنید تا از gzip برای فشرده‌سازی استفاده شود. این کار اندازه محتوا ارسال‌شده به بازدیدکنندگان سایت را کاهش داده و عملکرد را بهبود می‌بخشد.

پیش‌نیازها:

ایجاد فایل‌های تست در مسیر پیش‌فرض Nginx

در این مرحله چند فایل تست در مسیر پیش‌فرض Nginx ایجاد می‌کنیم تا رفتار پیش‌فرض Nginx برای فشرده‌سازی gzip را بررسی کنیم.

Nginx نوع فایل را از محتویات آن تشخیص نمی‌دهد، بلکه بر اساس پسوند فایل MIME type را مشخص می‌کند.

بنابراین محتویات فایل‌های تست مهم نیست، کافیست نام صحیحی برای هرکدام در نظر بگیریم تا Nginx فرض کند مثلاً یک فایل خالی تصویر است و دیگری استایل‌شیت.

یک فایل به نام test.html در مسیر پیش‌فرض Nginx با دستور truncate ایجاد می‌کنیم (پسوند .html بیانگر صفحه HTML است):

truncate -s 1000 /var/www/html/test.html

به همین روش چند فایل دیگر شامل یک تصویر jpg، یک استایل‌شیت css و یک فایل js ایجاد می‌کنیم:

truncate -s 1000 /var/www/html/test.jpg
truncate -s 1000 /var/www/html/test.css
truncate -s 1000 /var/www/html/test.js

بررسی رفتار اولیه Nginx نسبت به فشرده‌سازی gzip

ابتدا بررسی می‌کنیم که آیا فایل HTML test.html با فشرده‌سازی ارسال می‌شود یا خیر. با دستور زیر درخواست خود را به سرور ارسال و هدر Accept-Encoding: gzip را اضافه می‌کنیم:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.html

در پاسخ، هدری مانند زیر را مشاهده خواهید کرد:

Content-Encoding: gzip

این به این معناست که فشرده‌سازی gzip برای این فایل فعال شده است. به‌طور پیش‌فرض در Ubuntu 20.04 فشرده‌سازی gzip برای فایل‌های HTML فعال است.

اما به‌صورت پیش‌فرض فقط HTML فشرده می‌شود و سایر فایل‌ها بدون فشرده‌سازی سرو می‌شوند. برای اطمینان، تصویر test.jpg را درخواست می‌دهیم:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.jpg

در خروجی هدر Content-Encoding: gzip وجود ندارد، یعنی این فایل بدون فشرده‌سازی ارسال شده است.

این آزمایش را با فایل css نیز انجام می‌دهیم:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.css

باز هم خبری از فشرده‌سازی نیست.

پیکربندی Nginx برای فشرده‌سازی انواع فایل‌های متنی با gzip

برای اعمال تغییرات، فایل پیکربندی اصلی Nginx را با nano یا ویرایشگر دلخواه باز کنید:

sudo nano /etc/nginx/nginx.conf

بخش تنظیمات gzip را پیدا کنید که معمولاً شبیه زیر است:

gzip on;
#gzip_buffers 16 8k;
#gzip_comp_level 1;
#gzip_disable "msie6";
#gzip_http_version 1.1;
#gzip_min_length 20;
#gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

شما می‌بینید که gzip با دستور gzip on فعال است ولی بقیه تنظیمات کامنت شده‌اند. طبق تجربه به تنظیمات زیر تغییر دهید:

gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_types
    text/plain
    text/css
    application/json
    application/javascript
    text/xml
    application/xml
    text/javascript
    application/vnd.api+json;

فایل را ذخیره کنید و ببندید.

برای فعال‌شدن پیکربندی جدید، Nginx را ریستارت کنید:

sudo systemctl restart nginx

تست پیکربندی جدید gzip

دوباره تست html را انجام دهید؛ وضعیت مشابه قبل خواهد بود:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.html

ولی اگر css را درخواست کنیم:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.css

این بار هدر Content-Encoding: gzip اضافه شده است و فایل با فشرده‌سازی ارسال می‌شود.

از بین فایل‌های تست، فقط تصویر test.jpg بدون فشرده‌سازی باقی خواهد ماند:

curl -H "Accept-Encoding: gzip" -I http://your_domain_or_IP/test.jpg

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

در این صورت، فشرده‌سازی gzip را در Nginx با موفقیت فعال کرده‌اید.

جمع‌بندی

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

از همراهی شما با پارمین کلود متشکریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *