nginx 反向代理
将请求转发到后端服务器,隐藏真实服务地址
语法
proxy_pass http://backend;
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
proxy_pass |
后端服务地址 | proxy_pass http://localhost:3000; |
常用 |
proxy_set_header |
设置转发请求头 | proxy_set_header Host $host; |
常用 |
proxy_connect_timeout |
连接后端超时时间 | proxy_connect_timeout 60s; |
常用 |
proxy_read_timeout |
读取后端响应超时 | proxy_read_timeout 90s; |
常用 |
proxy_buffering |
是否缓冲后端响应 | proxy_buffering off; |
进阶 |
示例
基本反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
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;
}
}标准反向代理配置
WebSocket 代理
location /ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}WebSocket 需要额外的 Upgrade 头
负载均衡
upstream backend {
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3003;
}
server {
location / {
proxy_pass http://backend;
}
}默认轮询策略
带路径重写
location /api/v1/ {
proxy_pass http://localhost:3000/;
}注意 proxy_pass 末尾的 /,会去掉 location 匹配的前缀
常见错误
502 Bad Gateway
后端服务未启动或地址错误,检查 proxy_pass 地址和后端服务状态
504 Gateway Timeout
后端响应太慢,增加 proxy_read_timeout 值
技巧
- 一定要设置 X-Real-IP 和 X-Forwarded-For,否则后端拿不到真实客户端 IP
- proxy_pass 末尾有 / 会去掉 location 前缀,没有 / 则保留
- WebSocket 代理需要设置 Upgrade 和 Connection 头