فناوری اطلاعاتوب

الگوریتم Brotli

Brotli چیست؟

یک الگوریتم فشرده سازی است که در ابتدا توسط دو نفر از پرسنل گوگل برای کاهش حجم وب فونت های WOFF2 ساخته شد اما بدلیل کارایی بالا در زمینه فشرده سازی بصورت گسترده مورد استفاده قرار گرفت و در نهایت در سال ۲۰۱۶ تحت RFC7932 برای استفاده عموم در دسترس قرار گرفت. استفاده از فشرده سازی در وب باعث می شود که پهنای باند کمتری استفاده شود و بازدیدکنندگان با سرعت بیشتری فایل ها را دریافت کنند. این الگوریتم در مقایسه با الگوریتم های gzip و zopfli از قدرت بیشتری برخوردار است و همچنین از Cpu کمتری نیز برای فشرده سازی استفاده می کند. 

از این الگوریتم تنها برای فشرده سازی فایل های text-based استفاده می شود و برای عکس ها نمی توان از این روش استفاده کرد زیرا آنها قبلا فشرده شده اند و فشرده سازی مجدد آنها باعث بالاتر رفتن سایز آنها خواهد شد. در مقایسه ای که بین این روش با gzip انجام شده است، نشان می دهد که brotli می تواند ۱۴ درصد فشرده سازی بیشتر در فایل های جاوا اسکریپت، ۲۱ درصد در فایل های HTML و ۱۷ درصد در فایل های CSS داشته باشد. 

همچنین برای استفاده از brotli می بایست هم در سمت سرور و هم در سمت browser از این الگوریتم پشتیبانی شود. علاوه بر این مرورگرها این الگوریتم را در صورتی که بر روی پروتکل http باشد قبول نخواهند کرد و تنها بر روی https از آن پشتیبانی می کنند.

تمامی مرورگرهای بزرگ از قبیل کروم، فایرفاکس، اپرا، سافاری و edge از brotli پشتیبانی می کنند. در سمت سرور نیز، وب سرورهای Nginx و Apache دارای  extension اختصاصی برای Brotli هستند، اما وب سرورهای IIS و Node.js از این پروتکل پشتیبانی رسمی نمی کنند اما می توان از طریق ماژول هایی، این قابلیت را به آنها افزود.

عبارت br که در مقابل هدر content-encoding قرار دارد نشان دهنده ی پشتیبانی از این الگوریتم است.

دو نوع فشرده سازی داینامیک و استاتیک وجود دارد. در روش داینامیک هر زمان درخواست از سمت کاربر رسید، سرور شروع به فشرده سازی آن اطلاعات می کند، در صورتی که در روش استاتیک تمامی فایل ها از قبل فشرده شده اند و تنها سرور می بایست آنها را یافته و به سمت کاربر ارسال کند. در نتیجه روش داینامیک، بار زیادی را بر روی سرور ایجاد می کند و مشخصا در صورت استفاده از سطوح بالای فشرده سازی مانند سطح ۱۱، کندی در باز شدن سایت را خواهیم داشت.

در روش استاتیک می بایست یک نسخه فشرده سازی شده به روش Brotli از تمامی فایل ها را در یک شاخه سرور ایجاد نماییم. در نتیجه اگر برای مثال یک فایل style.css داشته باشیم یک نسخه با نام style.css.br نیز از آن ساخته می شود. می توانیم یک نسخه دیگر نیز با روش gzip بسازیم تا اگر مرورگر کاربر از brotli پشتیبانی نمی کند نسخه gzip آن ارائه شود. با دستور زیر می توان بصورت دستی دو نسخه فشرده سازی شده از فایل های تعریف شده، ساخت:

find <path/to/files> -type f -a \( -name ‘*.html’ -o -name ‘*.css’ -o -name ‘*.js’ \ -o -name ‘*.json’ -o -name ‘*.xml’ -o -name ‘*.svg’ -o -name ‘*.txt’ \) \ -exec brotli –best {} \+ -exec gzip –best -k {} \+

عبارت best در دستور بالا، باعث می شود که بالاترین سطح فشرده سازی انجام شود که در brotli سطح ۱۱ می باشد. همچنین با استفاده از ماژول های مختلفی که ارائه شده است می توان انجام این کار را بصورت اتوماتیک انجام داد. همچنین باید گزینه های  brotli_static on و gzip_static on را مطابق آموزش زیر در فایل پیکربندی nginx فعال نماییم.

راه اندازی Brotli بر روی Nginx

شرکت گوگل یک ماژول مخصوص اینکار ارائه داده است که می بایست برای استفاده از آن Nginx را از روی source نصب کرد. بعد از نصب می بایست موارد زیر را در فایل nginx.conf قرار دهیم:

brotli on;
brotli_static on;                         # for static compression, explained latergzip_vary off;
brotli_comp_level 11;               # this setting can vary from 1-11
brotli_types text/xml text/css image/svg+xml application/xml+rss application/xaml+xml application/atom+xml message/ text/* application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype image/x-icon font/opentype image/x-win-bitmap font/woff2 font/woff;

بهتر است که هر دو نوع فشرده سازی gzip و brotli در سرور فعال باشند. سرور Nginx در صورتی که هر دو نوع فشرده سازی وجود داشته باشند بصورت پیش فرض Brotli را انتخاب خواهد کرد. برای فعال سازی Gzip نیز خطوط زیر وارد فایل nginx.conf می نماییم:

gzip on;
gzip_disable “msie6”;
gzip_vary off;
gzip_proxied any;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_static on;
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 application/atom+xml;

در رابطه با brotli_comp_level باید بدانید که هر چه عدد بالاتر باشد میزان فشرده سازی آن بیشتر می شود و در نتیجه زمان بیشتری را به خود اختصاص می دهد. برای همین اگر از فشرده سازی استاتیک استفاده می نماییم بهتر است از ارزش ۱۱ استفاده کنیم ولی در حالت داینامیک باید از ارزش های کوچکتر مانند ۵ یا ۶ استفاده شود در غیر اینصورت نه تنها استفاده از brotli یک مزیت برای ما نخواهد شد بلکه باعث کندی بیش از حد سایت خواهد شد.

نمایش بیشتر

نوشته های مشابه

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

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

دکمه بازگشت به بالا