Nginx反向代理核心是proxy_pass指令,末尾斜杠决定路径重写;必须透传Host、X-Real-IP等请求头,并配置proxy_redirect处理重定向及HTTP/1.1+Upgrade支持WebSocket。

在 Nginx 的 location 块中配置反向代理,核心是使用 proxy_pass 指令,把匹配到的请求转发给后端服务。关键在于路径拼接、请求头传递和代理行为控制,稍不注意容易出现 404、重定向失败或静态资源加载异常。
基础反向代理写法(带路径重写)
最常见场景:把 /api/ 开头的请求转发到 http://backend:8000/,且自动剥离前缀:
location /api/ {
proxy_pass http://backend:8000/;
}注意:proxy_pass 末尾的 / 很重要。它表示“把 /api/ 替换为空”,请求 /api/users 会转发为 /users。如果写成 proxy_pass http://backend:8000;(无尾部斜杠),Nginx 会原样拼接,变成 /api/users,后端可能无法识别。
必须设置的关键代理头
后端服务常依赖原始请求信息(如真实 IP、协议、Host),需手动透传:
-
proxy_set_header Host $host;—— 保持原始 Host,避免后端因 Host 不匹配拒绝请求 -
proxy_set_header X-Real-IP $remote_addr;—— 传递客户端真实 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多层代理链 -
proxy_set_header X-Forwarded-Proto $scheme;—— 告诉后端当前是 http 还是 https
处理后端重定向和 WebSocket
如果后端返回 302 重定向,响应头中的 Location 是内部地址(如 http://backend:8000/login),浏览器无法访问。需用 proxy_redirect 重写:
location /api/ {
proxy_pass http://backend:8000/;
proxy_redirect http://backend:8000/ /api/;
}WebSocket 需额外支持:
proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
完整示例(含错误处理)
upstream backend {
server 127.0.0.1:8000;
}
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">location /api/ {
proxy_pass http://backend/;
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_redirect http://backend/ /api/;
# 可选:超时调优
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}}
配置完记得 nginx -t 测试语法,再 nginx -s reload 生效。不复杂但容易忽略路径斜杠和 Header 透传,这两点出问题最多。


















