Nginx Cheatsheet
Reverse Proxy
Use this Nginx reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
Minimal Reverse Proxy
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
}
}If
proxy_passURL has a trailing slash (http://backend/), Nginx strips the location prefix before forwarding.
Essential proxy_pass Variants
# Proxy to localhost port proxy_pass http://127.0.0.1:3000; # Proxy to upstream group (defined separately) proxy_pass http://myapp; # Proxy to Unix socket proxy_pass http://unix:/run/app.sock:; # Strip location prefix (trailing slash on both) location /api/ { proxy_pass http://127.0.0.1:4000/; # /api/users → /users } # Preserve location prefix (no trailing slash) location /api/ { proxy_pass http://127.0.0.1:4000; # /api/users → /api/users }
Headers to Always Set
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}Put these in a shared snippet (/etc/nginx/snippets/proxy-headers.conf) and include it.
Full Recommended Proxy Block
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection ""; # Required for keepalives with upstream
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
proxy_buffers 8 16k;
proxy_buffer_size 16k;
}Timeout Directives
| Directive | Default | What it covers |
|---|---|---|
proxy_connect_timeout | 60s | Time to establish connection to upstream |
proxy_send_timeout | 60s | Time between successive sends to upstream |
proxy_read_timeout | 60s | Time between successive reads from upstream |
Buffering
| Directive | Recommended | Effect |
|---|---|---|
proxy_buffering on | on | Buffer upstream response in memory/disk |
proxy_buffers 8 16k | — | Number and size of per-request buffers |
proxy_buffer_size 16k | — | Buffer for the first part of the response (headers) |
proxy_max_temp_file_size 0 | — | Disable temp file overflow |
Turn buffering off for streaming / SSE / WebSocket responses:
proxy_buffering off;
WebSocket Proxying
location /ws/ {
proxy_pass http://ws_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s; # Keep long-lived connections alive
}Proxy Cache (Basic)
http {
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m max_size=1g
inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
}
}
}Hiding Upstream Info
proxy_hide_header X-Powered-By; # Drop leaky upstream headers server_tokens off; # Server: nginx (no version) more_clear_headers Server; # Remove Server entirely (headers-more module)
Nginx always replaces the upstream Server header with its own, so proxy_hide_header Server does nothing — use server_tokens off to hide the version, or headers-more to strip the header.
Passing Request Body
client_max_body_size 50m; # Max upload size (default 1m) client_body_buffer_size 128k; # Buffer before writing to disk proxy_request_buffering on; # Buffer full request before sending upstream