Skip to content

⚡ Performance Tuning

worker_processes and worker_connections

Nginx performance depends heavily on these two parameters. worker_processes is the number of worker processes, and worker_connections is the maximum number of connections each process can handle.

nginx
# Auto-match CPU core count (recommended)
worker_processes auto;

# Max connections per worker
events {
    worker_connections 4096;
    # Linux 2.6+ uses epoll (best performance)
    use epoll;
    # A worker can handle multiple connections simultaneously (must enable)
    multi_accept on;
}

http {
    # Max open files per worker (should be greater than worker_connections)
    worker_rlimit_nofile 65535;

    # ... other config
}

💡 Tip: 💡 Max concurrency = worker_processes × worker_connections. For example, a 4-core CPU + 4096 connections = theoretically 16,384 concurrent connections. Reaching about 80% in practice is very good.

keepalive Connection Reuse

nginx
http {
    # Client-side keepalive
    keepalive_timeout 65;
    keepalive_requests 1000;  # Max requests per connection

    # Upstream server keepalive (reverse proxy scenario)
    upstream backend {
        server 10.0.0.1:8080;
        server 10.0.0.2:8080;

        # Keep 32 idle connections to upstream
        keepalive 32;
        keepalive_requests 100;
        keepalive_timeout 60s;
    }

    server {
        location /api/ {
            proxy_pass http://backend;

            # These headers are required to enable keepalive
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
}

💡 Tip: 💡 Effect: with keepalive enabled, Nginx doesn't need to re-establish a TCP connection to the backend every time. For high-frequency API calls, latency can drop by 30–50%.

Buffer Tuning

nginx
http {
    # Client request buffering (large file upload scenarios)
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    client_max_body_size 100m;    # Max upload size
    large_client_header_buffers 4 8k;

    # Proxy buffering (reverse proxy scenarios)
    proxy_buffer_size 4k;
    proxy_buffers 8 16k;
    proxy_busy_buffers_size 32k;

    # Backend response buffering
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 32k;
    proxy_max_temp_file_size 1024m;

    # File sending optimization (sendfile + tcp_nopush)
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
}

💡 Tip: 💡 sendfile + tcp_nopush: lets the kernel transfer data directly between disk and NIC without going through user space. Large file transfer performance improves 2–3x.