Nginx 注意事项
下面给你一份 真正实用、生产环境级别的《Nginx 注意事项大全》,涵盖安全、性能、部署、反代、静态站点、HTTP2、HTTPS、日志、系统层、限流、缓存等关键点。 非常适合作为 Nginx 项目上线 Checklist。
- worker_processes auto;
- CPU=2 就 2 worker;CPU=16 就 16 worker。
最大并发 ≈ worker_processes × worker_connections
默认值太小必须调大:
worker_connections 65535;
必须确保 Linux 系统也调大:
ulimit -n 200000
use epoll;
multi_accept on;
keepalive 64;
正确:
proxy_set_header Host $http_host;
不要写:
proxy_set_header Host $host;
差别:
- $host -> 域名变化时可能变成 server_name
- $http_host -> 保留客户端真实 Host
proxy_ssl_server_name on;
否则某些服务(如微信 API、云服务)会报 SNI 错。
统一写在 http {} 或 include 文件:
proxy_http_version 1.1;
proxy_set_header Connection "";
root 会拼接路径:
location /admin/
root /data/www;
==> /data/www/admin/xxx
alias 是直接替换路径:
location /admin/
alias /data/www/admin/;
==> /data/www/admin/xxx
SPA 必须:
try_files $uri $uri/ /index.html;
生产不能写 *,必须指定域名:
add_header Access-Control-Allow-Origin https://example.com;
listen 443 ssl; http2 on;
listen 443 ssl http2; # 已过期
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets on;
chmod 600 certificate.key
大量并发会写满磁盘 IO:
access_log off;
error_log /var/log/nginx/error.log warn;
写入 /etc/sysctl.conf:
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.ip_local_port_range = 1024 65000
然后:
sysctl -p
server_tokens off;
location ~ /\.(git|svn|hg) {
deny all;
}
防止上传 .php、.sh:
location ~* \.(php|sh)$ {
deny all;
}
请求限流:
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
limit_req zone=req burst=20 nodelay;
limit_conn conn 20;
}
静态资源缓存(强缓存)
location ~* \.(jpg|png|css|js|svg|woff2)$ {
expires 30d;
access_log off;
}
代理缓存(慎用)
proxy_cache_path /data/cache levels=1:2 keys_zone=cache:100m inactive=7d;
❌ alias 最后必须加 /
否则路径会错。
❌ SPA 应用必须用 try_files,否则 history 路由会 404
❌ proxy_pass 末尾是否带 / 会改变路径匹配
举例:
location /api/ {
proxy_pass http://backend/;
}
和:
proxy_pass http://backend;
结果不同。
❌ Nginx + Node/Java/Python upstream 未设置 keepalive 时会 OOM
❌ error_page 会影响代理行为,必须小心
上线前必须执行:
nginx -t
并优雅 reload:
nginx -s reload
不要把配置写入镜像层
配置放到挂载目录:
-v /etc/nginx/conf.d:/etc/nginx/conf.d
Keepalive 文件描述符一定要调大,否则容器内会被限制