Gzip helps most when you scope it to compressible text types and skip anything already compressed. I turn gzip on at the http or server level, set a sensible gzip_min_length so tiny responses are not inflated, and list types explicitly (HTML, CSS, JS, JSON, SVG) rather than relying on defaults. For reverse-proxied apps I also decide who compresses: either nginx or the upstream, not both — double gzip wastes CPU and can break content-length assumptions. After enabling, verify with a request that asks for gzip and compare Content-Encoding plus body size on a static asset and an API JSON path. Watch CPU on the edge under concurrent large text responses; if workers peg while HIT ratios look fine, raise gzip_comp_level carefully or offload brotli only where clients negotiate it. One footgun: compressing already-gzipped downloads or image payloads — keep those types out of gzip_types and confirm Vary includes Accept-Encoding when you also cache at a CDN in front.