تفعيل Brotli في Nginx بيقلّل حجم الـ bundle المنقول للمستخدم 20 إلى 25 بالمية فوق ما بيعمله gzip، بدون أي تغيير في الكود. النتيجة: TTFB أقل، LCP أسرع، وفاتورة CDN أقل بمئات الدولارات في الشهر على المواقع المتوسطة الحجم.
المشكلة باختصار
الـ gzip بيضغط استجابات HTTP من سنة 1992، وكل المتصفحات بتدعمه. المشكلة إنه واقف عند نسبة ضغط حوالي 70 بالمية للنصوص. Brotli — اللي طلع من Google سنة 2015 — بيوصل لـ 80 بالمية أو أكثر على نفس الملف، لأن عنده dictionary مدمج بـ 120KB من أنماط الـ web الشائعة. لو سيرفرك بيخدم 10TB JavaScript شهريًا، الفرق بين gzip و brotli بيتحوّل لـ 2TB بندويث موفّر، أو ~170 دولار شهريًا على CloudFront بأسعار 2025.
الـ Brotli مدعوم في 96.8 بالمية من المتصفحات حسب Can I Use في 2026. مفيش سبب تقني تستمر فيه على gzip لوحده.
مثال للمبتدئين: ليه نسبة الضغط بتفرق فعلاً؟
تخيّل إنك بتشحن كتاب في صندوق. الـ gzip بيلف الكتاب مرتين بشريط لاصق ويحطه في صندوق صغير. الـ brotli بيعرف إن صفحات الكتاب فيها كلمات بتتكرّر زي function و const و <div>، فبيستبدلها برمز مختصر قبل ما يلفّه. النتيجة: نفس الكتاب بيوصل في صندوق أصغر بـ 25 بالمية، والمستلم بيعرف يفك الرمز لأن نفس القاموس عنده.
على HTTP، اللي بيحصل بالظبط: المتصفح بيبعت Accept-Encoding: gzip, br في كل request، والسيرفر بيختار أحسن واحد متوفر. لو ما عملتش enable لـ brotli في Nginx، السيرفر بيرجع gzip بشكل افتراضي حتى لو المتصفح كان مستعد لـ brotli، والـ payload بيكون أكبر بدون داعي.
التعريف العلمي الدقيق
Brotli خوارزمية ضغط lossless مبنية على LZ77 و Huffman coding، بس مع context modeling من الدرجة الثانية وقاموس ثابت بـ 13,504 كلمة شائعة في الـ web (HTML tags، CSS properties، JavaScript keywords، إلخ). الـ RFC 7932 بيحدّد التفاصيل. على مستوى الضغط الأعلى (level 11)، Brotli بيعطي نسبة ضغط أحسن من gzip بحوالي 14 إلى 25 بالمية للنصوص و~21 بالمية للـ HTML تحديدًا، حسب قياس Google لـ Alexa Top 1000.
الافتراض المهم: Brotli مفيد للـ text-based content فقط. الصور المضغوطة مسبقًا (JPG، PNG، WebP) والفيديو (MP4) ما هتستفيدش من ضغط إضافي.
تفعيل Brotli في Nginx خطوة بخطوة
- ثبّت module الـ
ngx_brotli. مش متضمن في Nginx افتراضيًا، لكن في Nginx Plus وفي حزم Ubuntu 22.04+ متاح كـlibnginx-mod-http-brotli-staticوlibnginx-mod-http-brotli-filter. - عدّل ملف
nginx.confبإضافة الإعدادات اللي تحت في الـhttpblock. - فعّل static precompression: اضغط ملفاتك مرة واحدة وقت الـ build بدل ما السيرفر يضغطها مع كل request.
- تحقّق من الـ response headers بـ
curl -I -H "Accept-Encoding: br" https://yoursite.com/app.jsوشوفContent-Encoding: br.