How to Optimize NGINX Settings to Slash Bandwidth Usage
This guide explains how to enable gzip compression, set cache headers, activate HTTP/2, fine‑tune logging, and apply rate‑limiting in NGINX to dramatically reduce bandwidth consumption while improving site performance and server efficiency.
Enable Gzip Compression for HTML, CSS, and JavaScript
Large text assets such as HTML, CSS, and JavaScript can be compressed on the fly by NGINX, reducing the amount of data transferred over the network. Verify that compression is active with the browser’s developer tools (Network tab) by checking the Content‑Encoding: gzip response header.
gzip on;
gzip_types application/xml application/json text/css text/javascript application/javascript;
gzip_vary on;
gzip_comp_level 6; # reasonable trade‑off between CPU and compression ratio
gzip_min_length 500; # only compress responses larger than 500 bytesSet Cache Headers
Static assets (fonts, images, icons) can be cached locally by browsers for extended periods. Setting a long Expires value and a Cache‑Control: public header reduces repeat HTTP requests.
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2)$ {
expires 1M; # 1 month
add_header Cache-Control "public";
}Enable HTTP/2 Support
HTTP/2 multiplexes multiple streams over a single TCP connection, decreasing latency and improving bandwidth utilization. NGINX 1.9.5+ (and NGINX Plus R7+) supports HTTP/2. The protocol requires TLS in most browsers, so add the http2 flag to the SSL listen directive.
listen 443 ssl http2;Optimize Logging
Reducing unnecessary log entries saves disk space, CPU cycles, and I/O bandwidth, which is especially valuable in cloud or container environments.
Method 1: Disable logging for static resource requests
location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
access_log off;
}Method 2: Log only error responses (non‑2xx/3xx)
Define a variable with a map block that evaluates to 0 for successful responses and 1 otherwise, then use the variable in the access_log directive.
map $status $loggable {
~^[23]0 0; # 2xx and 3xx → do not log
default 1; # everything else → log
}
access_log /var/log/nginx/access.log combined if=$loggable;Method 3: Buffer logs to minimize I/O
Enable buffered logging so NGINX writes to disk only after a 512 KB buffer is filled or one minute has elapsed, whichever occurs first.
access_log /var/log/nginx/access.log combined buffer=512k flush=1m;Limit Bandwidth for Specific URLs
When serving large or popular files, throttling download speed preserves bandwidth for critical application paths. Use limit_rate for a fixed ceiling and limit_rate_after to exempt the initial portion of a file.
# Limit every file under /download/ to 50 KB/s
location /download/ {
limit_rate 50k;
}
# For all other requests, allow the first 500 KB unrestricted, then cap at 50 KB/s
location / {
limit_rate_after 500k;
limit_rate 50k;
}Rate limiting applies per HTTP connection; download managers that open multiple connections can bypass a single‑connection limit. Additional controls such as limit_conn or limit_req can be added to restrict concurrent connections or request rates.
Open Source Tech Hub
Sharing cutting-edge internet technologies and practical AI resources.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
