Nginx 最佳实践
下面是一份 真正能落地、覆盖架构/配置/部署/监控/安全的 Nginx 最佳实践大全,适用于生产环境(反向代理 / 静态站点 / API 网关场景)。
/etc/nginx/
├── nginx.conf # 主配置
├── conf.d/ # 各服务独立配置
│ ├── api.conf
│ ├── web.conf
│ └── ssl.conf
├── mime.types
├── modules-enabled/ # 动态模块
└── snippets/ # 公用片段(例如 SSL、proxy)
- 不推荐把所有配置堆在 nginx.conf
- 推荐按应用拆分,保证可维护性。
worker 配置(自适应 CPU)
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 200000;
事件调优
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
HTTP 全局优化
http {
sendfile on;
sendfile_max_chunk 512k;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
keepalive_requests 10000;
client_max_body_size 50m;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
include mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
推荐写法(你已经纠正过的:http2 on; 分行写)
server {
listen 443 ssl;
http2 on;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
强加密套件建议
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:...';
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
通用 proxy 配置(建议放 snippets)
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_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
proxy_buffering on;
proxy_buffers 32 32k;
proxy_busy_buffers_size 64k;
支持 SPA history 模式
location / {
try_files $uri $uri/ /index.html;
}
静态文件缓存
location ~* \.(css|js|png|jpg|jpeg|gif|svg|ico)$ {
expires 30d;
access_log off;
}
防止点击劫持
add_header X-Frame-Options SAMEORIGIN;
防止 XSS
add_header X-XSS-Protection "1; mode=block";
强制 HSTS(仅在 HTTPS 完全稳定后开启)
add_header Strict-Transport-Security "max-age=63072000" always;
隐藏 Nginx 版本
server_tokens off;
| 项目 | 推荐值 | 说明 |
|---|---|---|
| worker_processes | auto | 自适应 CPU |
| worker_connections | 65535 | 高连接负载 |
| worker_rlimit_nofile | 200000 | 文件句柄 |
| sendfile | on | 零拷贝 |
| gzip | on | 流量优化 |
| keepalive_timeout | 15s | 可持续连接 |
| proxy_buffering | on | 降低后端压力 |
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
建议配合 ELK / Loki 收集。
检查配置
nginx -t
平滑重载(不中断服务)
nginx -s reload
- HTTPS 证书是否续期
- gzip 是否压缩 js/css
- history 模式是否配置 try_files
- error_page 是否正常
- proxy 超时是否符合服务 SLA
- 是否忘记设置 client_max_body_size
Nginx 主线版本每天都优化 HTTP/2 & QUIC
建议使用:
- 稳定版:1.24.x
- 主线版:1.27.x(支持 HTTP/3)