نحوه بهبود عملکرد وبسایت با gzip و Nginx در سرور مجازی اوبونتو Ubuntu
۱۰ بهمن ۱۴۰۳
مقدمه
عملکرد یک وبسایت تا حدی به اندازه فایلهایی بستگی دارد که مرورگر کاربر، باید دانلود کند. کاهش اندازه این فایلها میتواند سرعت وبسایت شما را افزایش دهد. همچنین میتواند هزینه استفاده از وبسایت را برای کاربرانی که از اتصالات با پهنای باند محدود استفاده میکنند، کاهش دهد.
gzip یک برنامه محبوب برای فشردهسازی دادهها است. شما میتوانید Nginx را بهگونهای پیکربندی کنید که فایلهایی را که ارائه میدهد، به صورت پویا (داینامیک)، فشرده کند. این فایلها، سپس توسط مرورگرهایی که از این قابلیت پشتیبانی میکنند، بدون هیچگونه افت کیفیت، بازگشایی (decompressed) میشوند. این فرآیند، باعث میشود دادههای کمتری بین سرور وب و مرورگر انتقال یابد. خبر خوب این است که فشردهسازی در تمام مرورگرهای پایه، پشتیبانی میشود و دلیلی برای عدم استفاده از آن وجود ندارد.
به دلیل نحوه عملکرد کلی فشردهسازی و نحوه عملکرد gzip، برخی از فایلها بهتر از دیگر فایلها فشرده میشوند. به عنوان مثال، فایلهای متنی (text files) به خوبی فشرده میشوند و اغلب اندازه آنها به کمتر از نصف، کاهش مییابد. از سوی دیگر، تصاویری مانند فایلهای JPEG یا PNG ذاتاً فشرده هستند و فشردهسازی دوباره آنها با استفاده از gzip تقریباً نتیجهای ندارد. فرایند فشردهسازی فایلها، منابع سرور را تا حدی، مصرف میکند، بنابراین بهتر است فقط فایلهایی را فشرده کنید که کاهش اندازه قابل توجهی، خواهند داشت.
در این آموزش، شما Nginx را برای استفاده از gzip، پیکربندی خواهید کرد. این کار اندازه محتوایی را که برای بازدیدکنندگان وبسایت شما ارسال میشود، کاهش داده و عملکرد وبسایت را بهبود میبخشد.
پیشنیازها
برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:
- یک سرور مجازی Ubuntu با یک کاربر عادی غیر روت (non-root user) که دارای دسترسی sudo باشد. میتوانید با دنبال کردن آموزش راهاندازی اولیه سرور، سرور خود را آماده کنید.
- Nginx آماده روی سرور. برای نصب آن، این آموزش را دنبال کنید.
در صورتی که با مفاهیم مربوط به سرور مجازی لینوکس، آشنا نیستید، توصیه میشود در ابتدا، مقالههای زیر را مطالعه کنید:
- سرور مجازی یا VPS چیست؟ + معرفی انواع سرورهای مجازی و کاربرد آنها
- SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
در ادامه، بخوانید:
- مرحله اول: ایجاد فایلهای تست
- مرحله دوم: بررسی رفتار پیشفرض
- مرحله سوم: پیکربندی تنظیمات gzip در Nginx
- مرحله چهارم: تایید پیکربندی جدید
- نتیجهگیری
مرحله اول: ایجاد فایلهای تست
در این مرحله، چند فایل تستی، در دایرکتوری پیشفرض Nginx ایجاد میکنیم. از این فایلها بعداً برای بررسی رفتار پیشفرض Nginx در فشردهسازی gzip استفاده خواهیم کرد.
برای شناسایی نوع فایلهایی که از طریق شبکه ارائه میشوند، Nginx محتوای فایل را تحلیل نمیکند، زیرا این کار بسیار کند خواهد بود. در عوض، به پسوند فایل نگاه میکند تا نوع MIME آن را تعیین کند که هدف فایل را مشخص میکند.
به دلیل این رفتار، محتوای فایلهای تست ما اهمیت ندارد. با نامگذاری مناسب فایلها، میتوانیم Nginx را فریب دهیم تا فکر کند مثلاً یک فایل کاملاً خالی یک تصویر یا یک stylesheet است.
یک فایل به نام test.html
در دایرکتوری پیشفرض Nginx با استفاده از دستور truncate
ایجاد کنید. این پسوند، نشاندهنده یک صفحه HTML است:
sudo truncate -s 1k /var/www/html/test.html
همچنین بخوانید: cURL چیست؟ + نحوه دانلود فایل با cURL در سرور مجازی
حالا چند فایل تست دیگر به همین روش ایجاد میکنیم: یک تصویر jpg، یک فایل css، و یک فایل جاوا اسکریپت:
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 در رابطه با فشردهسازی فایلهای درخواست شده در یک نصب تازه (بدون هیچگونه پیکربندی) است.
مرحله دوم: بررسی رفتار پیشفرض
برای بررسی اینکه آیا فایل HTML به نام test.html
، با فشردهسازی ارائه میشود، از دستور زیر استفاده کنید. دستور زیر، یک فایل را از سرور Nginx درخواست میکند و مشخص میکند که محتوای فشرده شده gzip با استفاده از یک هدر HTTP (Accept-Encoding: gzip) قابل قبول است یا خیر:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
در پاسخ، باید چندین هدر پاسخ HTTP مشاهده کنید:
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 به طور پیشفرض، حتی در یک نصب تازه Ubuntu، فشردهسازی gzip را برای فایلهای HTML فعال میکند. با این حال، به طور پیشفرض، Nginx فقط فایلهای HTML را فشرده میکند. سایر فایلها بدون فشردهسازی ارائه میشوند که بهینه نیست. برای تأیید این موضوع، میتوانید فایل تصویر test.jpg
را به همین روش درخواست کنید:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
نتیجه باید کمی متفاوت باشد:
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
وجود ندارد که نشان میدهد فایل، بدون فشردهسازی، ارائه شده است. شما میتوانید همین تست را با فایل test.css
نیز، تکرار کنید:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
بار دیگر، هیچ در خروجی، هیچ خبری از فشردهسازی نیست:
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 روی آنها تاثیر بسزایی دارد را، فشرده کنید.
مرحله سوم: پیکربندی تنظیمات gzip در Nginx
برای تغییر تنظیمات gzip در Nginx، فایل پیکربندی اصلی Nginx را با استفاده از ویرایشگر متن مورد علاقهتان (مانند nano) باز کنید:
sudo nano /etc/nginx/nginx.conf
قسمت تنظیمات gzip را پیدا کنید، که باید مشابه زیر باشد:
. . .
##
# `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 on
فعال است، اما تنظیمات اضافی با علامت #
، کامنت شدهاند و تأثیری ندارند. در این بخش، تغییرات زیر را اعمال میکنیم:
- تمام خطوط کامنتشده را با حذف علامت
#
در ابتدای خطوط، فعال کنید. - دستور
gzip_min_length 256;
را به فایل فوق، اضافه کنید. این تنظیم به Nginx میگوید فایلهایی که اندازه آنها کمتر از ۲۵۶ بایت است را فشرده نکند، زیرا فشردهسازی فایلهای بسیار کوچک، سود چندانی ندارد. - دستور
gzip_types
را با افزودن انواع فایلهای اضافی برای فونتهای وب، آیکونها، فیدهای XML، دادههای ساختاریافته JSON، و تصاویر SVG گسترش دهید.
بعد از اعمال این تغییرات، بخش تنظیمات باید به این صورت باشد:
. . .
##
# `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
حالا باید مطمئن شویم که پیکربندی جدید به درستی کار میکند.
مرحله چهارم: تایید پیکربندی جدید
دستور قبلی را برای درخواست فایل HTML تست، اجرا کنید:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
پاسخ، همانطور باقی خواهد ماند، زیرا، فشردهسازی برای این نوع فایل، قبلاً فعال بوده است:
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 فایل را فشرده کرده است:
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
از تمام فایلهای تست ایجاد شده در مرحله اول، تنها فایل test.jpg
(تصویر) نباید فشرده شود. میتوانید این مورد را به همان روش تست کنید:
curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
فشردهسازی gzip اعمال نشده است:
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
در اینجا، هدر Content-Encoding: gzip
، در خروجی، وجود ندارد، که مطابق انتظار است.
نتیجهگیری
پیکربندی gzip در Nginx به درستی انجام شده است. فعال کردن فشردهسازی gzip در Nginx ساده است، اما مزایای بزرگی به همراه دارد. بازدیدکنندگانی که پهنای باند محدودی دارند سایت را سریعتر دریافت میکنند، و سایر کاربران نیز افزایش قابلتوجهی در سرعت بارگذاری مشاهده خواهند کرد.
موتورهای جستجو نیز از بارگذاری سریعتر سایت رضایت دارند. سرعت بارگذاری اکنون یکی از معیارهای مهم برای رتبهبندی وبسایتها در موتورهای جستجو است و استفاده از gzip یک گام مهم برای بهبود آن است.
سرور مجازی لینوکس لیارا یکی از بهترین گزینهها برای توسعهدهندگان و کسبوکارهایی است که به دنبال یک سرویس قدرتمند، مقیاسپذیر و مقرون به صرفه هستند. این سرویس با بهرهگیری از جدیدترین تکنولوژیها و سختافزارهای پیشرفته، عملکرد عالی و سرعت بالای سرور را تضمین میکند. از دیگر ویژگیهای بارز سرور مجازی لینوکس لیارا میتوان به مدیریت آسان، مقیاسپذیری بالا، امنیت بالای دادهها و پشتیبانی ۲۴ ساعته اشاره کرد.