HTTP-komprimeringstærskler bestemmer den størrelse, hvormed din server komprimerer indhold, og styrer dermed direkte TTFB, CPU-belastning og båndbredde. I denne vejledning vil jeg vise dig specifikke tærskler, niveauer og headerindstillinger for hurtig levering samt en klar adskillelse mellem dynamisk og statisk komprimering. Kompression.
Centrale punkter
Jeg opsummerer de vigtigste justeringer først, så du kan komme i gang på en målrettet måde og undgå at spilde unødvendige CPU-cyklusser. Jeg er afhængig af klare tærskler, passende niveauer og rene headere, så browsere, proxyer og CDN'er arbejder korrekt sammen. Jeg skelner mellem dynamiske svar og build-aktiver og holder komprimering pr. hop strengt under kontrol. Jeg minimerer TTFB med moderate niveauer af runtime-komprimering og får maksimal hastighed fra præ-komprimerede filer. Jeg tjekker regelmæssigt målinger og justerer tærskler til belastning, filmix og latenstid i den virkelige verden, så din opsætning bliver mærkbart mere effektiv. hurtigere vil.
- Tærskel 512-1024 B, standard 1024 B
- Brødpind 3-4 dynamisk, 9-11 statisk
- Gzip 5-6 som reserve
- MIME Kun tekstressourcer
- Varierer og ETag pr. kodning
Hvad er HTTP-komprimeringstærskler?
En tærskel bestemmer den størrelse, over hvilken et svar komprimeres, og forhindrer, at header-overhead kunstigt puster små filer op; det er netop her, at Break-even-overvejelser. Med meget små svar kan indholdskodning øge nyttelasten og koste CPU på samme tid. Derfor sætter jeg normalt en nedre grænse på 1024 bytes, eller 512 bytes for højfrekvente API'er med mange små svar. Mindre tærskler øger komprimeringsgraden, men de driver TTFB og CPU, når dynamisk indhold varierer meget. Større tærskler sparer computertid, men risikerer spildt potentiale med mellemstore HTML-, CSS- eller JSON-filer, der er af god kvalitet. Reduktion fordel.
Brotli vs. Gzip: Valg og niveauer
Brotli opnår ofte 15-21 procent bedre hastigheder end Gzip for tekstressourcer, men koster mere CPU pr. anmodning, hvilket jeg tager højde for ved dynamiske svar og med moderate niveauer. pude. Til runtime-komprimering bruger jeg Brotli niveau 3-4, til færdigpakkede aktiver niveau 9-11. Til ældre klienter eller indhold, der ændrer sig meget, bruger jeg Gzip niveau 5-6. HTTP/2 og HTTP/3 drager fordel af god komprimering, så længe serverbufferne og flush-punkterne er indstillet korrekt, og ingen strøm går i stå. Hvis du vil lave en dybere sammenligning, kan du finde mere information i min Sammenligning Gzip vs. Brotli yderligere praktiske værdier og overvejelser, der gør valget i den daglige hosting lette.
Sæt tærskler: Beskyttelseslinjer og break-even
Jeg starter med 1024 bytes som en grundlæggende grænse, fordi header-overhead så klart overkompenseres, og CPU-forbruget forbliver rimeligt, især med HTML og JSON, som er meget forskellige. kondensere gå. Med netværk med meget lav latenstid og mange minimale API-svar kan 512 bytes være nyttigt. Komprimering kan sjældent betale sig under 512 bytes, fordi administrationsomkostningerne ofte overstiger reduktionen af nyttelasten. I tilfælde af stærkt belastede maskiner øger jeg midlertidigt tærsklen, indtil CPU-reservoirerne igen har buffere. Denne gradvise justering holder TTFB lav og bevarer Stabilitet af det samlede system.
Komprimér MIME-typer specifikt
Jeg komprimerer kun tekst-MIME'er som text/html, text/css, application/javascript, application/json og image/svg+xml, fordi de kan bruges af redundansårsager. Gevinster trække. Jeg lader binært indhold som image/*, application/pdf eller font/woff2 være uberørt, da effekten er lille eller negativ. Til skrifttyper bruger jeg WOFF2 direkte, fordi den allerede koder effektivt, og yderligere komprimering ikke er til megen nytte. Jeg opretholder eksplicitte tilladelseslister og undgår wildcards, så ingen binære filer ved et uheld ender i encoderen. På den måde holder jeg komprimeringskæden ren og forhindrer Korruption på grund af fejlklassificering.
Statisk vs. dynamisk: ren adskillelse
Jeg pakker statiske aktiver i byggeprocessen eller på CDN-kanten på forhånd som .br og .gz og lader serveren bruge disse varianter direkte. levere. Ved dynamiske svar indstiller jeg moderate niveauer og holder bufferne små nok til, at den første byteblok flyder hurtigt. Det er vigtigt kun at komprimere ét hop i proxy-kæder, så der ikke sker dobbeltkomprimering. Jeg kan slå komprimering fra på Origin, hvis CDN'et allerede har gjort det og adskiller det korrekt via Vary. Denne adskillelse sparer CPU og sikrer konstant Svartider selv under belastning.
Header management og caching
Jeg sender altid Vary: Accept-Encoding, så cachen kan skelne korrekt mellem varianter, og der ikke er nogen fejl, som gør brugerne langsommere eller forfalsker aktiverne; denne header er afgørende. For statiske filer indstiller jeg indholdskodning (br/gzip) plus indholdslængde, mens dynamiske streams ofte kører med overførselskodning: chunked. ETags skal være kodningsspecifikke, ellers vil cachen levere forkerte versioner. Derudover sætter jeg lange cache-TTL'er for præ-komprimerede aktiver og sikrer dem med cachekontrol: offentlig, uforanderlig, hvis filhashes er i navnet. Jeg giver et kompakt udgangspunkt her: Konfiguration af HTTP-komprimering, der viser dig de vigtigste byggesten i Sekvens viser.
HTTP/2 og HTTP/3: Flush og buffer
Med HTTP/2 og HTTP/3 er jeg opmærksom på tidlige flush-punkter, så kritisk HTML og CSS ikke forsinker starten på gengivelsen. forsinkelse. For store buffere kan gøre multiplexing langsommere, fordi en strøm dominerer planlægningen, og andet indhold venter. Jeg holder de første komprimeringsblokke små og sender hurtigt, og så øger jeg blokstørrelsen for lange filer. Brotli viser gode hastigheder med moderat overhead, så længe niveau 3-4 bruges til dynamiske svar. Det holder interaktiviteten høj, mens store bundter er effektive. krympe.
Øvelse: Apache, Nginx, Caddy
Jeg starter med moderate niveauer og en tærskel på 1024 bytes og tjekker derefter systematisk TTFB og CPU i stedet for blindt at sætte maksimale hastigheder. håndhæve. For Apache aktiverer jeg mod_deflate eller mod_brotli og definerer kun de ønskede MIME-typer. I Nginx sætter jeg gzip_min_length til 1024 og Brotli til on og kombinerer det med brotli_static til forkomprimerede filer. Caddy tilbyder enkle switches med kodningerne gzip zstd br; jeg håndterer dynamiske stier med lave niveauer separat. Erfaringsmæssigt er det værd at tage et kig på CPU-belastning og komprimeringsniveau, fordi kombinationen af andelen af dynamiske svar og antallet af kerner ofte overskrider grænsen. sæt.
Apache Eksempel (mod_deflate/mod_brotli):
.
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml
SætOutputFilter DEFLATE
DeflateCompressionLevel 6
DeflateBufferSize 64k
.
AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript application/json image/svg+xml
BrotliCompressionQuality 4
BrotliWindowSize 22
. Nginx Et eksempel:
gzip på;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
gzip_comp_level 5;
brotli på;
brotli_comp_level 4;
brotli_static on;
brotli_types text/plain text/css application/json application/javascript image/svg+xml;
Overvågning og fejlfinding
Jeg måler TTFB, CPU-brug pr. medarbejder og overførselsstørrelse pr. type, så jeg kan se, hvor komprimering hjælper, og hvor det er nødvendigt. skader. Hvis TTFB stiger efter aktivering, sænker jeg niveauet eller hæver tærsklen. Hvis der er mærkelige effekter, tjekker jeg først for dobbeltkomprimering, manglende Vary-headere eller forkert genkendte MIME-typer. Jeg kigger også på CDN- og WAF-politikker, fordi et andet hop med komprimering flytter belastningen og ofte forværrer tiden til den første byte. Værktøjer som WebPageTest og Browser-DevTools er tilstrækkelige til en indledende kontrol. Revision fuldstændig.
Målepunkter og anbefalede værdier
Jeg holder mig til nogle få, klare parametre, så konfigurationen forbliver overskuelig og stadig opnår et højt kvalitetsniveau. Effekt viser. Følgende tabel opsummerer nyttige tærskler, niveauer og cachelagringsinstruktioner. Den dækker typiske webstakke med HTML, CSS, JS, JSON, SVG og skrifttyper. Juster tærsklen afhængigt af belastningen, CPU-reservoiret og andelen af dynamiske svar. Start konservativt, mål, og flyt iterativt skyderne i små trin. Trin.
| Ressource | Tærskelværdi (bytes) | Dynamisk (niveau) | Statisk (niveau) | Hint til cachen |
|---|---|---|---|---|
| HTML | 1024 | Br 3–4 / Gz 5–6 | Br 9-11 (forkomprimeret) | Lang TTL for hash-navne |
| CSS/JS | 1024 | Sjældent dynamisk | Br 9-11 (forkomprimeret) | uforanderlig, varianter pr. hash |
| JSON (API'er) | 512-1024 | Br 3–4 / Gz 5–6 | ikke almindeligt | Hold overskriften konsistent |
| SVG | 1024 | Sjældent dynamisk | Br 9–11 | Anmodninger om testområde |
| Skrifttyper (WOFF2) | ingen | ingen | ingen | Tryk ikke yderligere sammen |
| Billeder (PNG/JPEG/WEBP) | ingen | ingen | ingen | Separat optimering |
| ingen | ingen | ingen | Undgå kodning |
Zstd i kontekst: hvornår det giver mening, hvornår ikke
Jeg vurderer Zstd uafhængigt, fordi det har fremragende Gennemstrømningshastigheder med god komprimering. I browsermiljøet er understøttelsen dog uensartet, og derfor udruller jeg normalt ikke Zstd som den primære slutbrugerkodning. Mellem interne tjenester eller på CDN-backbone-ruten kan Zstd være meget nyttig til at holde Origin CDN-trafikken effektiv. På kanten holder jeg mig til Brotli (til tekst) og Gzip som reserve, indtil en bredt understøttet klientbase sikrer, at varianterne forhandles korrekt. I Caddy lader jeg Zstd være valgfrit aktiv, men prioriterer Forhandling Brotli før Gzip for at skabe balance mellem kompatibilitet og ydeevne.
Range requests, downloads og præ-komprimerede filer
Jeg tjekker store downloads (f.eks. PDF'er, CSV'er) separat. For binære data slår jeg normalt indholdskodning fra og leverer identitet (identitet), så anmodninger om rækkevidde fungerer korrekt, og genoptage downloads forbliver stabile. For statiske tekstfiler med .br/.gz-varianter sikrer jeg, at serveren vælger den korrekte variant afhængigt af klientens anmodning, og at indholdslængde, indholdskodning og ETag er konsistente. For delvise anmodninger om komprimerede varianter, byte-intervaller for komprimeret længde - hvis stakken ikke håndterer dette robust, leverer jeg den ukomprimerede version til range-anmodninger. Det afbøder edge cases og forhindrer forkerte genstarter.
Sikkerhed: komprimering og datalækager
Jeg tager højde for kompressionsrelaterede sidekanaler som f.eks. BRUD. Hvis svar afspejler hemmelighedsafhængigt indhold (tokens, sessions-ID'er) tæt på input, der kan kontrolleres af angriberen, deaktiverer jeg selektivt komprimering eller afkobler hemmelighederne (padding, adskillelse i separate ukomprimerede felter). For login- og betalingsstier giver det mening at slå komprimering fra ved hjælp af overskrifter eller regler. Cookies med indstillede cookie-overskrifter er ikke kritiske, det, der er vigtigt, er Svar-payload. Jeg har derfor filtre klar, der retter sig mod stien, MIME eller bestemte skabeloner for nemt at kunne håndhæve heuristik.
CDN- og proxy-kæder: én komprimering pr. hop
Jeg definerer klart det hop, hvor komprimeringen finder sted: Enten ved Kant (CDN) eller på Origin, ikke begge dele. Hvis CDN'et komprimerer, udelader jeg indholdskodning på Origin og sender Vary: Accept-kodning, så Edge bygger korrekte varianter. Hvis Origin skal levere præ-komprimerede aktiver (.br/.gz), konfigurerer jeg Edge til at sende disse filer til CDN'et. Gennemsigtig og transformerer det ikke igen. Hvis jeg strengt vil forhindre transformationer af mellemliggende proxyer (f.eks. af hensyn til compliance), indstiller jeg Cache-Control: no-transform - så planlægger jeg komprimering specifikt ved oprindelsen. Til fejlfinding noterer jeg, hvilket hop Kompression og holde målingerne adskilt pr. hop.
Streaming, SSE, gRPC og WebSockets
For server-sendte begivenheder (SSE) og lignende strømme undgår jeg høje niveauer og stor buffer; ellers øges ventetiden mærkbart. Jeg bruger små blokke, hyppige flushes og mere deaktiveret komprimering, hvis interaktivitet har prioritet. gRPC bruger sin egen meddelelseskomprimering og kører via HTTP/2 - her undgår jeg yderligere HTTP-indholdskodning for at forhindre duplikering. Det samme gælder for WebSockets: deflate pr. besked kan være nyttigt, men jeg slår det kun til for virkelig teksttunge kanaler og observerer CPU-effekt præcis.
Applikationsserver: Indstil app-lagets indstillinger specifikt
Jeg foretrækker at styre tærsklerne i edge/reverse-proxyen, men når frameworks komprimeres, indstiller jeg ensartede værdier, så intet modarbejder hinanden.
- Node.js/ExpressJeg sætter en tærskel på 1024 bytes og moderate niveauer. Den statiske handler serverer forkomprimerede statiske aktiver direkte, jeg komprimerer kun dynamiske ruter til tekst-MIME'er.
- GåJeg vælger en klar liste over tilladte MIME'er for hver handler og springer komprimering over under 1 KB. For lange streams holder jeg skriveflushes små for ikke at overbelaste den første maling. forsinkelse.
- Java/TomcatJeg bruger compressionMinSize 1024 og vedligeholder MIME-listen eksplicit; binære typer er udeladt.
Tomcat Eksempel (server.xml Connector):
. Vigtigt: Hvis en upstream-proxy (Nginx, Caddy) allerede komprimerer, deaktiverer jeg applagskomprimering for at Dobbeltarbejde og kun lade ét lag bære ansvaret.
Adaptive tærskler og belastningskontrol
Jeg tænker i politikker i stedet for stive værdier. Under høj CPU-belastning løfter jeg Tærskel midlertidigt (f.eks. fra 1024 til 2048 bytes) eller sænke Brotli-niveauet (f.eks. 4 til 2) for dynamiske svar. Hvis belastningen falder, øger jeg værdierne igen. Dette kan styres via et funktionsflag, Env-variabler eller en simpel genindlæsning. På noder med lidt CPU reserverer jeg komprimering til de vigtigste MIME'er (HTML/JSON), mens CSS/JS næsten udelukkende kommer præ-komprimeret fra storage/CDN. Dette Prioritering holder TTFB stabil i stedet for at tippe over i toppe.
Test playbook: hurtig verifikation
Jeg tjekker effekten med et par reproducerbare trin:
- Forhandling: curl -I -H „Accept-Encoding: br“ https://example.com - tjek Content-Encoding, Vary og Content-Length.
- Tilbagefald: curl -I -H „Accept-Encoding: gzip“ - forventet gzip? ETag forskellig fra Brotli?
- Uden kompressioncurl -I -H „Accept-Encoding: identity“ - Sammenlign størrelsesforskel og TTFB.
- Rækkevidde: curl -I -H „Range: bytes=0-1023“ - accepterer serveren subranges korrekt, og passer Content-Range?
- DevToolsSammenlign størrelse „Over netværket“ vs. „Ressourcestørrelse“ for at bestemme den reelle Besparelser at se.
Kort opsummeret
Sæt tærsklen til 1024 bytes som et hurtigt udgangspunkt, tjek TTFB og CPU, og finjuster dine indstillinger med små Justeringer efter. Brug Brotli 3-4 til dynamisk indhold og 9-11 til præ-komprimerede aktiver, behold Gzip 5-6 som en reserve. Komprimer kun tekst-MIME'er, og lever præ-komprimerede filer direkte for at holde build-aktiver lette og holdbare. Vær opmærksom på Vary: Accept-Encoding, Content-Encoding og kodningsspecifikke ETags, så caches fungerer korrekt. Med korrekt indstillede HTTP-komprimeringstærskler kan du mærkbart fremskynde leveringen uden at belaste maskinen med unødvendigt computerarbejde. blok.


