سال‌هاست که Gzip استاندارد پیش‌فرض فشرده‌سازی در وب بوده. قدیمی، پایدار، و تقریباً همه‌جا پشتیبانی‌شده. ولی گوگل در سال ۲۰۱۵ یک الگوریتم جدید معرفی کرد که در بسیاری از سناریوها از Gzip بهتر عمل می‌کند: Brotli. اسم عجیبی است — از نام یک نان سوئیسی گرفته شده — ولی پشت این اسم، یک پیشرفت فنی واقعی نهفته است.

Brotli چیست؟

Brotli یک الگوریتم فشرده‌سازی lossless (بدون افت کیفیت) است که گوگل آن را ابتدا برای فونت‌های وب طراحی کرد، سپس گستراند تا تمام محتوای متنی وب را پوشش دهد. در پاییز ۲۰۱۵ به صورت عمومی منتشر شد و IETF آن را به عنوان RFC 7932 استانداردسازی کرد.

بر اساس الگوریتم LZ77 و Huffman coding کار می‌کند — پایه‌ای مشابه Gzip — ولی یک تفاوت اساسی دارد: یک دیکشنری استاتیک از پیش تعریف‌شده با بیش از ۱۳۰۰۰ کلمه و عبارت رایج در محتوای وب. کلماتی مثل html، class، function، return، document.getElementById همگی در این دیکشنری هستند. مرورگر آن‌ها را از قبل می‌شناسد و نیازی نیست هر بار از صفر decode شوند.

Brotli در مقابل Gzip: مقایسه واقعی

ویژگیGzipBrotli
نسبت فشرده‌سازی HTMLمبنا۲۰-۲۶٪ بهتر
نسبت فشرده‌سازی CSSمبنا۱۷-۱۸٪ بهتر
نسبت فشرده‌سازی JavaScriptمبنا۱۴-۱۷٪ بهتر
سرعت decompressسریعمشابه یا سریع‌تر
سطوح فشرده‌سازی۱-۹۰-۱۱
پشتیبانی HTTPSHTTP و HTTPSفقط HTTPS
پشتیبانی مرورگرهمهبالای ۹۶٪

عدد مهم همین ۲۰-۲۶٪ بهبود روی HTML است. فرض کنید صفحه شما بعد از Gzip 80 کیلوبایت بود — با Brotli به حدود ۶۰ کیلوبایت می‌رسد. برای کاربران موبایل یا شبکه‌های کند، این تفاوت محسوس است.

چرا Brotli بهتر فشرده می‌کند؟

سه عامل اصلی دارد:

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

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

سوم، ۱۲ سطح فشرده‌سازی (صفر تا یازده) که انعطاف بیشتری برای تنظیم trade-off بین سرعت و نسبت فشرده‌سازی می‌دهد.

سطوح فشرده‌سازی Brotli

انتخاب سطح درست مهم است:

  • سطح ۰-۲: سریع‌ترین، کمترین فشرده‌سازی. برای محتوای کاملاً داینامیک که هر request متفاوت است
  • سطح ۳-۵: تعادل خوب بین سرعت و نسبت فشرده‌سازی. برای اکثر کاربردها مناسب
  • سطح ۶-۹: فشرده‌سازی بیشتر، کندتر. برای فایل‌های استاتیک که از پیش فشرده می‌شوند
  • سطح ۱۰-۱۱: بهترین نسبت فشرده‌سازی، بسیار کند. فقط برای pre-compression آفلاین مناسب است

توصیه عملی: برای محتوای داینامیک (HTML پاسخ‌های PHP) سطح ۴-۵، و برای فایل‌های استاتیک (CSS، JS) سطح ۱۱ با pre-compression.

چطور Brotli را فعال کنیم؟

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

Nginx

ابتدا بررسی کنید ماژول ngx_brotli نصب است یا نه:

nginx -V 2>&1 | grep brotli

اگر نصب بود، در بلوک http یا server تنظیمات را اضافه کنید:

brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types text/plain text/css application/json
             application/javascript text/xml application/xml
             application/xml+rss text/javascript image/svg+xml;

Apache

LoadModule brotli_module modules/mod_brotli.so

<IfModule brotli_module>
    AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css
    AddOutputFilterByType BROTLI_COMPRESS application/javascript application/json
    BrotliCompressionLevel 5
</IfModule>

LiteSpeed / OpenLiteSpeed

LiteSpeed از Brotli به صورت بومی پشتیبانی می‌کند. اگر از LiteSpeed Cache Plugin برای وردپرس استفاده می‌کنید، Brotli را به صورت خودکار مدیریت می‌کند — فقط در تنظیمات افزونه فعالش کنید.

Cloudflare

اگر از Cloudflare استفاده می‌کنید، Brotli از پنل با یک کلیک فعال می‌شود: Speed → Optimization → Content Optimization → Brotli. Cloudflare این فشرده‌سازی را در edge server خود انجام می‌دهد و سرور اصلی شما اصلاً درگیر نمی‌شود.

چک کردن Brotli روی سایت

برای تایید اینکه Brotli فعال است، چند روش وجود دارد:

  • DevTools مرورگر: تب Network را باز کنید، یک درخواست را انتخاب کنید، در Headers به دنبال content-encoding: br بگردید. اگر دیدید، Brotli فعال است.
  • curl: با دستور curl -H "Accept-Encoding: br" -I https://your-site.com هدر پاسخ را بررسی کنید
  • ابزار آنلاین: سایت tools.keycdn.com/brotli-test URL سایت شما را بررسی می‌کند

Brotli و امنیت: چرا فقط HTTPS؟

یک نکته مهم: Brotli فقط روی HTTPS کار می‌کند. این یک تصمیم عمدی در طراحی است. آسیب‌پذیری‌هایی مثل CRIME و BREACH نشان داده‌اند که ترکیب فشرده‌سازی با اتصال رمزنگاری‌نشده می‌تواند خطرات امنیتی ایجاد کند. اگر هنوز SSL ندارید، اول SSL راه‌اندازی کنید، سپس Brotli.

Pre-compression: بهترین روش برای فایل‌های استاتیک

برای فایل‌های CSS و JavaScript که تغییر نمی‌کنند، بهترین رویکرد pre-compression است: فایل را یک بار با سطح ۱۱ فشرده کنید و کنار اصل ذخیره کنید. وقتی Nginx گزینه brotli_static on داشته باشد، اگر فایل .br وجود داشته باشد، آن را مستقیم ارسال می‌کند — بدون هیچ overhead CPU:

brotli -q 11 -o style.css.br style.css
brotli -q 11 -o app.js.br app.js

این روش CPU overhead را به صفر می‌رساند چون فشرده‌سازی از قبل انجام شده است.

Brotli و Core Web Vitals

گوگل Core Web Vitals را به عنوان یکی از فاکتورهای رتبه‌بندی SEO در نظر می‌گیرد. یکی از معیارهای مهم LCP (Largest Contentful Paint) است که اندازه می‌گیرد چقدر طول می‌کشد تا بزرگ‌ترین عنصر قابل مشاهده صفحه رندر شود. فایل‌های CSS و JavaScript بزرگ اغلب مسدودکننده رندر هستند و LCP را تحت تاثیر می‌گذارند.

وقتی Brotli یک فایل JavaScript 200 کیلوبایتی را به 150 کیلوبایت کاهش می‌دهد، این ۵۰ کیلوبایت کمتر یعنی زمان کمتر برای دانلود. برای کاربران موبایل روی شبکه‌های کندتر، هر کیلوبایت حساب می‌شود. پس Brotli نه فقط یک بهینه‌سازی فنی، بلکه یک ابزار مستقیم برای بهبود SEO است.

Brotli در CDNها

اگر از CDN استفاده می‌کنید، باید بررسی کنید CDN شما Brotli را در edge server خود انجام می‌دهد یا صرفاً فایل‌های فشرده‌شده توسط سرور اصلی را forward می‌کند:

  • Cloudflare: Brotli را خودش در edge انجام می‌دهد. سرور اصلی شما درگیر نمی‌شود
  • BunnyCDN: Brotli پشتیبانی می‌شود، باید از پنل فعال کنید
  • KeyCDN: Brotli از طریق تنظیمات Zone قابل فعال‌سازی است
  • Fastly: Brotli پشتیبانی کامل دارد

نکته مهم: اگر CDN Brotli را در edge انجام می‌دهد، مطمئن شوید که هم نسخه Brotli و هم نسخه Gzip را cache می‌کند. CDN باید بر اساس هدر Accept-Encoding کاربر، نسخه درست را ارائه دهد.

سوالات متداول

آیا Brotli روی همه مرورگرها کار می‌کند؟

تمام مرورگرهای مدرن — Chrome، Firefox، Edge، Safari، Opera — از Brotli پشتیبانی می‌کنند. بیش از ۹۶٪ کاربران اینترنت مرورگری دارند که Brotli را می‌فهمد. برای آن درصد کوچکی که مرورگر قدیمی دارند، سرور به Gzip fallback می‌کند.

آیا Brotli CPU بیشتری مصرف می‌کند؟

فشرده‌سازی آنلاین Brotli در سطوح بالا از Gzip کندتر است. راه‌حل این است که برای فایل‌های استاتیک از pre-compression استفاده کنید و برای محتوای داینامیک از سطح ۴-۵ استفاده کنید. اگر از Cloudflare استفاده می‌کنید، این مشکل اصلاً به شما مربوط نمی‌شود.

آیا Brotli برای تصاویر هم مفید است؟

تصاویر معمولی (JPEG، PNG، WebP، GIF) از قبل با الگوریتم‌های خودشان فشرده شده‌اند. فشرده‌سازی اضافه روی آن‌ها تاثیر کمی دارد یا حتی ممکن است حجم را کمی بیشتر کند. Brotli بیشترین تاثیر را روی فایل‌های متنی دارد: HTML، CSS، JavaScript، JSON، SVG، و XML.

آیا می‌توان Brotli را بدون Gzip فعال کرد؟

از نظر فنی بله، ولی توصیه نمی‌شود. همیشه باید Gzip هم به عنوان fallback فعال باشد تا کاربران با مرورگرهای قدیمی‌تر از فشرده‌سازی محروم نشوند. هر دو را با هم فعال نگه دارید و بگذارید وب‌سرور بر اساس هدر Accept-Encoding مرورگر تصمیم بگیرد.

آیا Brotli جایگزین Gzip می‌شود؟

نه به صورت کامل، حداقل فعلاً. مرورگرهای قدیمی هنوز Brotli نمی‌فهمند، برخی CDNها و proxy های قدیمی هم ممکن است با آن مشکل داشته باشند. توصیه درست این است که هر دو را فعال کنید: سرور از هدر Accept-Encoding مرورگر چک می‌کند که آیا br پشتیبانی می‌شود، اگر بله Brotli ارسال می‌کند، اگر نه به Gzip fallback می‌کند. این negotiation خودکار است.

تنها جایی که ممکن است به مشکل بخورید CDNهایی هستند که Vary header را درست مدیریت نمی‌کنند. اگر CDN نسخه Brotli را برای یک کاربر cache کند و بعد برای مرورگری که Brotli نمی‌فهمد همان نسخه را ارسال کند، صفحه شکسته نمایش داده می‌شود. بنابراین همیشه مطمئن شوید CDN شما هدر Vary: Accept-Encoding را احترام می‌گذارد.

Brotli و آینده فشرده‌سازی در وب

الگوریتم‌های فشرده‌سازی وب متوقف نشده‌اند. در حال حاضر Zstandard (یا Zstd، ساخته شده توسط Meta/Facebook) دارد توجه بیشتری جلب می‌کند. Zstd در سرعت از Brotli جلوتر است ولی در نسبت فشرده‌سازی معمولاً کمی ضعیف‌تر است. برخی مرورگرها و سرورها شروع به آزمایش آن کرده‌اند.

اما فعلاً، برای اکثر وب‌سایت‌ها، Brotli بهترین انتخاب موجود است. پشتیبانی مرورگری قوی دارد، استاندارد شده است، و ابزارهای فعال‌سازی آن در اکثر وب‌سرورها وجود دارد. جای نگرانی برای آینده نیست — اگر روزی Zstd یا الگوریتم دیگری جای Brotli را گرفت، مرورگرها و وب‌سرورها هر دو را پشتیبانی خواهند کرد، درست مثل همین الان که Gzip و Brotli با هم کار می‌کنند.

تجربه کاربری، نه فقط بهینه‌سازی فنی

یک نکته که اغلب در بحث‌های فنی نادیده گرفته می‌شود: فشرده‌سازی بهتر مستقیماً به تجربه کاربر ترجمه می‌شود. صفحه‌ای که ۲۰٪ سبک‌تر است، سریع‌تر لود می‌شود. کاربری که سریع‌تر محتوا می‌بیند، دیرتر سایت را ترک می‌کند. نرخ bounce کمتر یعنی فرصت بیشتر برای تبدیل بازدیدکننده به مشتری.

برای مخاطبان ایرانی که روی شبکه‌های موبایل با محدودیت پهنای باند استفاده می‌کنند، هر کیلوبایت کمتر معنا دارد. سایتی که با Brotli یک فایل JavaScript 300KB را به 230KB می‌رساند، برای این کاربران ملموس‌تر احساس می‌شود.

جمع‌بندی

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

بهترین رویکرد: هم Brotli و هم Gzip را فعال کنید تا برای همه کاربران پوشش کامل داشته باشید. برای فایل‌های استاتیک از pre-compression با سطح ۱۱ استفاده کنید. اگر از LiteSpeed یا Cloudflare استفاده می‌کنید، کار چند دقیقه‌ای است که نتیجه‌اش برای همیشه می‌ماند.