After running nginx on everything from 512 MB VPS instances to multi-socket bare metal, here are the settings I’ve found actually matter.
worker_processes and worker_connections
Start with worker_processes auto;.
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
Keepalive tuning
http {
keepalive_timeout 30s;
keepalive_requests 1000;
upstream backend {
server 10.0.0.1:8080;
keepalive 32;
}
}
Buffer sizes
client_body_buffer_size 128k;
client_max_body_size 50m;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
gzip and brotli
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json;
brotli on;
brotli_comp_level 4;
brotli_types text/plain text/css application/json;
Measurement
None of this matters if you don’t measure. Install nginx-module-vts or expose stub_status, feed metrics to Prometheus, and compare before/after for any changes.