تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نحوه بهبود عملکرد وب‌سایت با gzip و Nginx در سرور مجازی اوبونتو Ubuntu


۱۰ بهمن ۱۴۰۳

مقدمه

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

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

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

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

پیش‌نیازها

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

  • یک سرور مجازی Ubuntu با یک کاربر عادی غیر روت (non-root user) که دارای دسترسی sudo باشد. می‌توانید با دنبال کردن آموزش راه‌اندازی اولیه سرور، سرور خود را آماده کنید.
  • Nginx آماده روی سرور. برای نصب آن، این آموزش را دنبال کنید.

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

    در ادامه، بخوانید:

    • مرحله اول: ایجاد فایل‌های تست
    • مرحله دوم: بررسی رفتار پیش‌فرض
    • مرحله سوم: پیکربندی تنظیمات 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 یک گام مهم برای بهبود آن است.

    سرور مجازی لینوکس لیارا یکی از بهترین گزینه‌ها برای توسعه‌دهندگان و کسب‌وکارهایی است که به دنبال یک سرویس قدرتمند، مقیاس‌پذیر و مقرون به صرفه هستند. این سرویس با بهره‌گیری از جدیدترین تکنولوژی‌ها و سخت‌افزارهای پیشرفته، عملکرد عالی و سرعت بالای سرور را تضمین می‌کند. از دیگر ویژگی‌های بارز سرور مجازی لینوکس لیارا می‌توان به مدیریت آسان، مقیاس‌پذیری بالا، امنیت بالای داده‌ها و پشتیبانی ۲۴ ساعته اشاره کرد.

    call
    تلفن واحد فروش: ۳۳۵۵۷۶۱۹-۰۲۵ (روزهای کاری ۹ الی ۱۷)