Nginx通过proxy_pass实现反向代理,核心是正确配置路径拼接(末尾斜杠决定是否剥离location前缀)和透传关键请求头(Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto),以确保后端获取真实客户端信息并正常响应。

用 Nginx 的 ngx_http_proxy_module 把内网接口暴露给外网,核心是反向代理配置,关键在 proxy_pass 和请求头传递是否正确。只要后端服务能被 Nginx 访问,再配好转发规则和 header,基本就能通。
明确 proxy_pass 路径处理逻辑
路径拼接容易出错,必须分清 proxy_pass 末尾斜杠有无:
- 如果
location /api/ { proxy_pass http://192.168.1.20:3000/; }—— 斜杠结尾,Nginx 会把/api/去掉,只转发/及后续路径(如/api/user→http://192.168.1.20:3000/user) - 如果
location /api/ { proxy_pass http://192.168.1.20:3000; }—— 无斜杠,Nginx 会原样拼接,变成http://192.168.1.20:3000/api/user - 正则匹配的 location(如
location ~ ^/v1/.*$)后面proxy_pass不能带 URI,否则语法报错
必须设置的关键请求头
不加这些 header,后端可能拿不到真实 IP、协议或域名,导致鉴权失败、重定向异常或日志失真:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
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;—— 支持多层代理时链式传递 IP -
proxy_set_header X-Forwarded-Proto $scheme;—— 告诉后端当前是 http 还是 https,影响生成跳转链接
适配常见后端行为
有些服务对路径或 host 敏感,需针对性调整:
- Spring Boot 默认不支持 context path 透传,若内网服务部署在
/app下,proxy_pass应指向http://192.168.1.20:8080/app/,且 location 匹配去掉前缀 - 前端 Vue/React 单页应用常依赖 HTML5 History 模式,需在 Nginx 配置 fallback:在 location 块中加
try_files $uri $uri/ /index.html;(仅适用于静态资源代理场景) - 若后端返回 302 重定向,且 Location 头是相对路径,一般没问题;若是绝对路径(如
Location: http://localhost:3000/login),需让后端改用相对路径,或用proxy_redirect重写(如proxy_redirect http://localhost:3000/ /;)
验证与调试要点
配置完别急着 reload,先检查再测试:
- 运行
nginx -t确保语法无误,再nginx -s reload - 用
curl -v http://外网IP/api/test查看响应头和状态码,确认是否 200 且内容来自内网服务 - 查 Nginx error log(通常
/var/log/nginx/error.log),常见错误如 “upstream refused” 表示连不上内网地址,“no resolver defined” 是用了域名但没配 resolver - 登录内网服务器,用
curl http://192.168.1.20:3000/test确认服务本身可访问,排除网络或防火墙问题

















