Nginx 除了能当 Web 服务器,更常见的角色是反向代理:把用户请求转发到后端应用,统一做 HTTPS、缓存、限流和负载均衡。无论是 WordPress、Node.js、Java 应用,还是多台服务器做高可用,反向代理都是绕不开的一环。这篇按配置顺序把常用场景一次讲清。
一、什么情况下需要反向代理
- 后端程序跑在 127.0.0.1:8080,不想直接暴露给公网;
- 多台后端服务器需要统一入口和负载均衡;
- 希望在 Nginx 层统一做 SSL 终止、缓存、限流;
- 迁移服务器时,用代理做平滑切换和灰度。
二、最小可用配置
一个能直接跑的反向代理配置如下,核心是 proxy_pass 和四个透传头:
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
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_connect_timeout 10s;
proxy_read_timeout 60s;
}
}
少了 X-Forwarded-For,后端拿到的客户端 IP 全是代理服务器;少了 Host,部分程序会生成错误的回调地址。
三、负载均衡策略怎么选
默认是轮询,适合后端性能一致的场景。其他几种按需求选择:
- weight:给配置高的机器更大权重,例如
server 10.0.0.1 weight=3; - ip_hash:同一 IP 固定落到同一台机器,适合有本地 session 的老应用。
- least_conn:优先转发给当前连接数最少的机器,适合请求耗时差异大的场景。
开源版 Nginx 的健康检查依赖 max_fails 和 fail_timeout,属于被动检查;需要主动探测可以上商业版或改用 OpenResty + lua-resty-healthcheck。
四、缓存与压缩
对更新不频繁的接口或页面,可以在 Nginx 层加一层缓存,显著降低后端压力:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=webcache:100m inactive=60m;
location / {
proxy_cache webcache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 10m;
proxy_cache_use_stale error timeout updating;
add_header X-Cache-Status $upstream_cache_status;
}
响应头里的 X-Cache-Status 能直接看到 HIT/MISS,方便验证缓存是否生效。压缩统一在 Nginx 打开 gzip,避免后端重复压缩。
五、HTTPS 统一在代理层处理
推荐把证书装在 Nginx 上,后端只跑 HTTP,内网通信更简单。配置要点:启用 TLS 1.2/1.3、开启 HTTP/2、加 HSTS,并把 80 端口 301 到 443。代理到后端的请求头里保留 X-Forwarded-Proto,程序才能正确识别用户走的是 HTTPS。
六、WebSocket 代理
普通代理配置会断开长连接,WebSocket 需要单独加三行:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s;
如果应用同时有普通 HTTP 和 WebSocket,可以把 Connection 写成 map 映射,避免影响普通请求。
七、限流与真实 IP
防刷接口用 limit_req,限制并发连接用 limit_conn:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
location /api/ {
limit_req zone=api burst=20 nodelay;
limit_conn perip 10;
}
如果 Nginx 前面还有 CDN 或四层代理,必须配置 set_real_ip_from 和 real_ip_header,否则限流会按代理 IP 统计,误伤所有用户。
八、502 与 504 排查清单
- 后端服务是否在监听:
ss -lntp | grep 8080; - 代理地址和端口是否写错,upstream 名称是否对应;
- 502 多为后端拒绝连接或进程崩溃,504 多为后端处理超时;
- 检查 SELinux、防火墙和内网安全组是否放行;
- 看 Nginx error.log 和后端应用日志,而不是只看 access.log。
总结
反向代理的配置并不复杂,难点在于细节:透传头、超时时间、缓存键、真实 IP、WebSocket 升级。先把最小配置跑通,再逐项加缓存、限流和负载均衡,出问题时按“Nginx 日志 → 后端服务 → 网络策略”的顺序排查,基本都能定位。