nginx反向代理需显式配置proxy_set_header以确保后端获取真实ip、协议、host等关键头信息,并支持websocket需添加upgrade和connection头及设置http_version为1.1,macos下配置路径为/usr/local/etc/nginx/,修改后须nginx -t校验并-s reload重载。

在 macOS 下使用 Nginx 做反向代理时,proxy_set_header 是控制转发请求头的关键指令,它决定了后端服务接收到的 HTTP 头信息是否完整、准确。常见问题如后端拿不到真实客户端 IP、WebSocket 连接失败、HTTPS 识别异常等,往往就出在这里。
必须设置的几个关键 header
以下是最常用且建议始终显式配置的几项(尤其当后端依赖这些字段做鉴权、日志或跳转逻辑时):
-
Host:默认会被 Nginx 覆盖为 upstream 的域名,应设为原始请求的 Host:
proxy_set_header Host $host;或更严谨地用$http_host -
X-Real-IP:传递客户端真实 IP(适用于直连或单层代理):
proxy_set_header X-Real-IP $remote_addr; -
X-Forwarded-For:追加客户端 IP 到已有的头中(支持多级代理链):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;(注意不是$remote_addr) -
X-Forwarded-Proto:让后端知道原始请求是 http 还是 https:
proxy_set_header X-Forwarded-Proto $scheme;
WebSocket 和长连接需要额外头
如果代理的是 WebSocket(如前端 dev server、Socket.IO),必须透传升级协议相关的 header,否则握手会失败:
proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";- 同时确保
proxy_http_version至少为 1.1:proxy_http_version 1.1;
避免覆盖或丢失原始 header
Nginx 默认不会自动转发所有客户端 header,未显式设置的会被丢弃。例如 Authorization、Content-Type 等通常需要手动透传:
- 若后端需要认证头:
proxy_set_header Authorization $http_authorization; - 若需保留原始内容类型:
proxy_set_header Content-Type $content_type; - 注意:Nginx 不会自动小写变量名,
$http_x_custom_header对应请求头X-Custom-Header
macOS 特别提醒:配置路径与重载方式
macOS 上通过 Homebrew 安装的 Nginx,配置文件通常在:
/usr/local/etc/nginx/nginx.conf 或站点配置在 /usr/local/etc/nginx/servers/ 下。
修改后务必执行:sudo nginx -t(验证语法)sudo nginx -s reload(热重载)
不要直接 kill 进程或用 brew services restart nginx,可能跳过配置校验。










