Nginx 反向代理
反向代理(Reverse Proxy)指 Nginx 接收客户端请求,转发给后端服务(Node/Java/Go/PHP 等)再把响应原样返回。客户端只跟 Nginx 通信、看不到后端,因此 Nginx 常被称为"流量入口"或"网关"。
最小反向代理
把 80 端口的请求全部转给本机 8080 端口的应用:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:8080; # 后端地址:IP:端口 或域名
}
}
sudo nginx -t && sudo systemctl reload nginx
curl -I http://app.example.com/
# 输出:HTTP/1.1 200 OK ... Server: nginx
proxy_pass 带不带 URI 的区别
proxy_pass 的值是否含路径,直接决定转发给后端的 URI:
location /api/ {
proxy_pass http://127.0.0.1:8080; # 不含 URI:原样转发 /api/users → /api/users
}
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 含 URI(/):替换匹配前缀 /api/users → /users
}
规律:不带 URI 时把原始请求 URI 整个传给后端;带 URI(含路径部分)时,用 proxy_pass 里的路径替换掉 location 匹配到的那段前缀,例如写成 proxy_pass http://127.0.0.1:8080/v2/ 时,/api/users 会被改写成 /v2/users。
常用的 proxy_set_header
后端需要知道客户端真实信息,必须显式传递以下请求头:
location / {
proxy_set_header Host $host; # 保持原始 Host
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理链路 IP
proxy_set_header X-Forwarded-Proto $scheme; # 原始协议 http/https
proxy_pass http://127.0.0.1:8080;
}
$proxy_add_x_forwarded_for 等价于"原 X-Forwarded-For 值 + 客户端 IP",多级代理时逐级追加。
HTTP/1.1 与 keepalive
默认 Nginx 以 HTTP/1.0 向后端发请求;开启长连接需显式切到 1.1 并清空 Connection 头(配合 upstream 的 keepalive 使用,见第 10 章):
location / {
proxy_http_version 1.1;
proxy_set_header Connection ""; # 清空,交给后端按 keepalive 处理
proxy_pass http://127.0.0.1:8080;
}
常用超时参数
| 指令 | 默认值 | 作用 |
|---|---|---|
| proxy_connect_timeout | 60s | 与后端建立 TCP 连接的超时时间 |
| proxy_read_timeout | 60s | 两次读后端响应数据之间的间隔超时 |
| proxy_send_timeout | 60s | 两次向后端发送数据之间的间隔超时 |
| proxy_buffering | on | 是否缓冲后端响应再发给客户端 |
后端处理慢(如导出大文件)时,按需调大 read/send 超时,否则容易 504。
常见后端反代示例
Node、Java(Tomcat)、Go 的反代写法一致,只改端口与 upstream 策略即可:
server {
listen 80;
server_name api.example.com;
location / {
proxy_http_version 1.1;
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_pass http://127.0.0.1:3000; # Node 默认 3000;Java/Tomcat 改 8080 等
}
}
WebSocket 长连接代理需要额外处理 Upgrade 头,将在第 19 章专门讲解。
小结:反向代理围绕三个点——proxy_pass 指向后端、proxy_set_header 传递真实客户端信息、超时与 HTTP 版本保证连接稳定。若后端有多台机器,把它升级为 upstream 负载均衡即可,见下一章。