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

 

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

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

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

 

این مطلب نیز ممکن است برای شما مفید باشد: پیکربندی گزارش های دسترسی و خطای Nginx

 

دقت کنید که قبل از دنبال کردن این آموزش، به موارد زیر نیاز دارید:

  • یک سرور اوبونتو 20.04 با یک کاربر عادی (غیر root) با امتیازات sudo
  • Nginx نصب شده برروی سرور اوبونتو 20.04

 

مرحله 1 - ایجاد فایل‌های آزمایشی

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

Nginx برای بررسی اینکه چه نوع فایلی از طریق شبکه منتقل می‌شود، محتوای فایل را آنالیز نمی‌کند (که این منجر به کاهش سرعت می‌شود)؛ بلکه برای تعیین نوع MIME فایل، پسوند فایل را جستجو می‌کند که هدف آن فایل را نشان می‌دهد.

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

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

sudo truncate -s 1k /var/www/html/test.html

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

sudo truncate -s 1k /var/www/html/test.jpg
sudo truncate -s 1k /var/www/html/test.css
sudo truncate -s 1k /var/www/html/test.js

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

 

مرحله 2 - بررسی رفتار پیش فرض

بیایید بررسی کنیم که آیا فایل HTML به نام test.html با فشرده سازی ارائه می‌شود یا خیر. دستور زیر، از سرور Nginx ما یک فایل را درخواست می‌کند و با استفاده از یک سرآیند HTTP (یعنی Accept-Encoding: gzip) مشخص می‌کند که محتوای آن با gzip فشرده سازی شود.

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

در جواب باید چندین هدر پاسخ HTTP مشابه زیر مشاهده نمایید:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip

در خط آخر، شما می‌توانید سرآیند Content-Encoding: gzip را مشاهده کنید. این به ما می‌گوید که برای ارسال این فایل از فشرده سازی gzip استفاده شده است.

این نشان می‌دهد که Nginx، فشرده سازی gzip را حتی در نصب تازه Ubuntu 20.04 به طور خودکار فعال می‌کند.

 

با این حال، به طور پیش فرض، Nginx تنها فایل‌های HTML را فشرده می‌کند. هر فایل دیگری بدون فشرده سازی ارائه می‌شود؛ چرا که فشرده سازی آن‌ها کمتر از حد مطلوب است. برای تأیید این موضوع، می‌توانید تصویر آزمایشی ما به نام test.jpg را به همین ترتیب درخواست نمایید:

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

نتیجه اجرای دستور، باید کمی متفاوت از قبل باشد:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:05:49 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

همانطور که مشاهده می‌کنید، هیچ سرآیند Content-Encoding: gzip در خروجی وجود ندارد؛ به این معنی که فایل بدون هیچ گونه فشرده سازی منتقل می‌شود.

 

شما می‌توانید آزمایش را برای فایل‌های استایل CSS نیز انجام دهید:

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

همانطور که مشاهده می‌کنید، هیچ اشاره‌ای به فشرده سازی در خروجی نمی‌شود:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:06:04 GMT
Content-Type: text/css
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

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

 

مرحله 3 - پیکربندی تنظیمات gzip در Nginx

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

sudo nano /etc/nginx/nginx.conf

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

           /etc/nginx/nginx.conf

. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
. . .

 

همانطور که می‌بینید، فشرده سازی gzip در واقع توسط دستورالعمل gzip فعال می‌شود؛ اما چند دستور دیگر برای این کار نیز وجود دارد که با علامت # کامیت شده و هیچ تأثیری ندارند. در این بخش، چندین تنظیم شرح داده شده است:

تنظیمات اضافی را با از کامنت خارج کردن همه خطوط کامنت شده فعال کنید. (به عنوان مثال، با حذف # در ابتدای خط)

gzip_min_length 256 را اضافه کنید. این دستورالعمل به Nginx می‌گوید فایل‌های کمتر از 256 بایت را فشرده نکند. چراکه فایل‌های بسیار کوچک نتیجه مطلوبی از فشرده سازی نخواهند داشت.

دستور gzip_types را با انواع فایل‌های اضافی که فونت‌های وب، آیکون‌ها، فیدهای XML، داده‌های ساخت یافته JSON و تصاویر SVG را نشان می‌دهد، اضافه کنید.

 

بعد از اعمال این تغییرات، قسمت تنظیمات باید مشابه زیر باشد:

/etc/nginx/nginx.conf

. . .
##
# `gzip` Settings
#
#
gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
  application/atom+xml
  application/geo+json
  application/javascript
  application/x-javascript
  application/json
  application/ld+json
  application/manifest+json
  application/rdf+xml
  application/rss+xml
  application/xhtml+xml
  application/xml
  font/eot
  font/otf
  font/ttf
  image/svg+xml
  text/css
  text/javascript
  text/plain
  text/xml;
. . .

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

 

برای فعال کردن پیکربندی جدید، Nginx را دوباره راه‌اندازی نمایید:

sudo systemctl restart nginx

در مرحله بعدی باید مطمئن شویم که پیکربندی جدید ما به درستی کار می‌کند.

 

مرحله 4 - تأیید پیکربندی جدید

همان درخواست قبلی را برای فایل HTML آزمایشی اجرا کنید:

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

از آنجا که فشرده سازی قبلاً برای آن نوع فایل فعال شده است، پاسخ به همان صورت خواهد بود:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:04:25 GMT
Content-Type: text/html
Last-Modified: Tue, 09 Feb 2021 19:03:41 GMT
Connection: keep-alive
ETag: W/"6022dc8d-400"
Content-Encoding: gzip

با این وجود، اگر صفحه استایل CSS فشرده نشده قبلی را درخواست نمایید، پاسخ متفاوت خواهد بود:

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

 

اکنون gzip در حال فشرده سازی فایل است:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:21:54 GMT
Content-Type: text/css
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"6022dc91-400"
Content-Encoding: gzip

از تمام فایل‌های آزمایشی ایجاد شده در مرحله 1، تنها فایل تصویر test.jpg باید فشرده نشده باقی بماند. شما می‌توانید این را به همان روش آزمایش کنید:

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

همانطور که در خروجی مشاهده می‌نمایید، مطابق انتظار، سرآیند Content-Encoding: gzip مربوط به فشرده سازی gzip وجود ندارد:

output:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 09 Feb 2021 19:25:40 GMT
Content-Type: image/jpeg
Content-Length: 1024
Last-Modified: Tue, 09 Feb 2021 19:03:45 GMT
Connection: keep-alive
ETag: "6022dc91-400"
Accept-Ranges: bytes

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

 

 

 

منبع:

digitalocean