Nginx’da Gzip va Brotli siqishni qanday yoqish mumkin
Amaliyot3 daqInnovialabs tahririyati
Qisqacha
Gzip o‘rnatilgan gzip on va gzip_types direktivalari bilan yoqiladi, Brotli uchun ngx_brotli moduli kerak; matnli formatlarni o‘rta darajada siqing, statikani oldindan siqing va natijani Content-Encoding sarlavhasi orqali tekshiring.
Siqish qanday ishlaydi
Brauzer har bir so‘rovda qaysi algoritmlarni tushunishini bildiradi: Accept-Encoding: gzip, deflate, br. Server mosini tanlab, javobni siqadi va uni Content-Encoding sarlavhasi bilan belgilaydi. Brauzer ma’lumotni o‘zi ochadi.
Eng ko‘p matnli formatlar yutadi: HTML, CSS, JavaScript, JSON, SVG. Brotli odatda matnni gzip’dan zichroq siqadi, gzip esa deyarli barcha mijozlar tomonidan qo‘llab-quvvatlanadi. Shuning uchun ikkalasini ham yoqish oqilona: zamonaviy brauzerlar uchun Brotli, zaxira variant sifatida gzip.
Gzip’ni sozlash
Gzip Nginx’ga o‘rnatilgan. http blokiga qo‘shing:
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_vary on;
gzip_proxied any;
gzip_types
text/plain
text/css
text/xml
application/javascript
application/json
application/xml
image/svg+xml;
Bu yerda nima muhim:
- gzip_comp_level — 1 dan 9 gacha. Daraja qanchalik yuqori bo‘lsa, hajmdagi kichik yutuq uchun shuncha ko‘p CPU sarflanadi. Tezkor siqish uchun odatda o‘rta qiymatlar tanlanadi.
- gzip_min_length — juda kichik javoblarni siqishning ma’nosi yo‘q.
- gzip_vary —
Vary: Accept-Encodingqo‘shadi, shunda CDN va proxy’lar siqilgan nusxani uni tushunmaydigan mijozga bermaydi. - gzip_proxied any — proxy yoki CDN orqali kelgan so‘rovlarga javoblarni ham siqish.
- text/html ni
gzip_typesda ko‘rsatish shart emas: u har doim siqiladi.
Brotli’ni sozlash
Brotli Nginx’ning standart yig‘masiga kirmaydi. ngx_brotli moduli kerak: ba’zi distributivlarda u paket ko‘rinishida bor, aks holda Nginx versiyangiz uchun dinamik modul sifatida yig‘iladi. O‘rnatgandan keyin modullar nginx.conf boshida ulanadi:
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
Va http blokida:
brotli on;
brotli_comp_level 5;
brotli_types
text/plain
text/css
text/xml
application/javascript
application/json
application/xml
image/svg+xml;
Mijoz ikkala algoritmni qo‘llab-quvvatlasa, Brotli ishlaydi; faqat gzip’ni qo‘llasa — gzip.
Nimani siqish kerak emas
JPEG, PNG, WebP, AVIF, MP4, WOFF2 va arxivlar allaqachon siqilgan. Ularni qayta siqish CPU’ni behuda sarflaydi va hajmni deyarli kamaytirmaydi. Shuning uchun hammasini emas, turlarni aniq ko‘rsating.
Oldindan siqilgan fayllar
Statika uchun (yig‘ilgandan keyingi JS va CSS) fayllarni oldindan maksimal darajada siqib qo‘yish foydaliroq, Nginx esa tayyor natijani beradi:
gzip -k -9 dist/assets/*.js dist/assets/*.css
brotli -q 11 dist/assets/*.js dist/assets/*.css
app.js yonida app.js.gz va app.js.br paydo bo‘ladi. Ularni berishni yoqing:
gzip_static on;
brotli_static on;
Nginx kerakli kengaytmali fayl bor-yo‘qligini tekshiradi va uni tezkor siqishsiz beradi. gzip_static uchun ngx_http_gzip_static_module kerak; u sizning yig‘mangizda bor-yo‘qligini nginx -V ko‘rsatadi.
Qanday tekshirish mumkin
sudo nginx -tvasudo systemctl reload nginx.- Kerakli sarlavha bilan so‘rov yuboring:
curl -s -o /dev/null -D - -H "Accept-Encoding: br" https://example.com/assets/app.js
curl -s -o /dev/null -D - -H "Accept-Encoding: gzip" https://example.com/assets/app.js
Javobda content-encoding: br yoki content-encoding: gzip ni qidiring.
- Brauzer DevTools’ida Network yorlig‘ida Content-Encoding ustunini yoqing va fayllarning uzatilgan hamda haqiqiy hajmini solishtiring.
Ko‘p uchraydigan xatolar
- Kerakli MIME turi yo‘q. Masalan, API
application/jsonqaytaradi, lekin ugzip_typesda yo‘q. - Brotli moduli yuklanmagan. Modulsiz
brotlidirektivasinginx -tda xato beradi. - Tezkor siqishda maksimal daraja. Har bir so‘rovda CPU’ni yuklaydi; maksimumni oldindan siqilgan statika uchun qoldiring.
- Ikki marta siqish. Agar backend javoblarni allaqachon siqsa va oldida CDN tursa, siqish qayerda bo‘layotganini tekshiring va bitta joyda qoldiring.