Nginx 反向代理配置与性能调优记录
2026年5月 · 约10分钟 · 标签:Nginx · 反向代理 · 性能调优
Nginx 是目前最流行的反向代理和 Web 服务器之一。在最近的项目中,使用 Nginx 作为多个后端服务的统一入口,涉及负载均衡、SSL 终止、HTTPS 跳转、限流等配置。本文记录相关的配置要点和调优经验。
一、基本反向代理配置
最基础的反向代理配置,将请求转发到后端服务:
upstream backend {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name example.com;
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_set_header 这几行很重要。后端应用通常需要获取客户端的真实 IP 和协议信息,如果不传递这些头信息,后端看到的请求来源全是 Nginx 的内网地址。
二、HTTPS 配置与强制跳转
使用 Let's Encrypt 或云厂商提供的免费 SSL 证书,为网站开启 HTTPS 访问:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://backend;
}
}
配置要点:
- 开启 http2 可以提升现代浏览器的加载性能。
- TLS 1.0 和 TLS 1.1 已不再安全,建议只启用 TLS 1.2 和 1.3。
- SSL 证书需要定期续期,建议使用 acme.sh 或 certbot 自动化。
三、请求限流配置
为了防止恶意请求或突发流量打垮后端,可以使用 Nginx 的 limit_req 模块做请求限流:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
这里 rate=10r/s 表示每 IP 每秒最多 10 个请求,burst=20 允许瞬间超过 20 个请求的突发,nodelay 表示突发请求不延迟处理,超出 burst 的请求直接返回 429。生产环境中 API 接口和静态页面的限流策略可以分开设置。
四、性能调优参数
以下是经过实际压测调整的一些参数:
- worker_processes:建议设置为 CPU 核心数,默认 auto 即可自动检测。
- worker_connections:单个 worker 的最大连接数,Linux 系统需要同时调整 ulimit 限制。
- keepalive 连接:upstream 配置中使用 keepalive 指令复用后端连接,减少三次握手开销。
- sendfile + tcp_nopush:启用零拷贝和 TCP 推送,提升静态文件传输性能。
- gzip 压缩:对文本类资源开启 gzip 压缩,减少传输体积。
http {
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
五、日志配置与排查
合适的日志格式对排查问题很有帮助:
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$upstream_addr $upstream_status $upstream_response_time';
access_log /var/log/nginx/access.log main;
}
增加 $upstream_response_time 可以查看后端服务的响应耗时,便于定位性能瓶颈。如果发现大量 499 状态码,通常是因为客户端在 Nginx 转发请求之前断开了连接,可能需要调整 proxy_read_timeout 或排查后端响应是否过慢。
六、踩坑记录
- proxy_buffer 大小:默认值可能不够大,如果后端返回的响应头较大(如设置了很多 Cookie),需要适当增大 proxy_buffer_size。
- WebSocket 代理:需要设置 Upgrade 和 Connection 头部,否则 WebSocket 连接会失败。
- HTTPS 回源:如果后端也是 HTTPS,需要配置 proxy_ssl_verify 或关闭证书验证(测试环境)。
七、总结
Nginx 配置灵活强大,但参数繁多。建议以"最小配置、迭代优化"的思路进行,先让服务跑起来,再根据监控数据逐步调优。另外,每次修改配置后记得执行 nginx -t 检查语法,避免配置错误导致服务中断。