Nginx通过proxy_pass实现反向代理,将外网请求转发至内网服务,并透传请求头、处理路径重写、配置超时与缓冲、启用被动健康检查及安全控制。

用 Nginx 的 proxy_pass 把内网服务暴露到外网,核心是让 Nginx 充当反向代理:外部请求先打到 Nginx(通常有公网 IP 或已备案域名),Nginx 再把请求转发给内网机器上的服务(比如 192.168.1.100:8080),并将响应原路返回。
基础配置:最简 proxy_pass 示例
假设你有一台内网 Web 服务运行在 192.168.1.100:8080,想通过 https://app.example.com 访问它。Nginx 配置大致如下:
server {
listen 443 ssl;
server_name app.example.com;
<pre class='brush:php;toolbar:false;'>ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://192.168.1.100:8080;
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后面的地址必须可被 Nginx 所在服务器直接访问(确保网络连通、防火墙放行) -
proxy_set_header系列用于透传原始请求信息,避免后端服务误判来源或协议 - 若后端是 HTTP 但 Nginx 用 HTTPS 接入,务必设置
X-Forwarded-Proto,否则后端可能生成错误的跳转链接
路径重写:处理 URL 前缀与后端不一致
如果希望用 /api/ 访问内网服务,但后端本身没有 /api 这层路径(比如它只认 /),就需要去掉前缀:
location /api/ {
proxy_pass http://192.168.1.100:8080/; # 注意末尾的 /
}
说明:
-
proxy_pass末尾带/,表示将/api/xxx替换为/xxx再发给后端 - 如果不加
/(如proxy_pass http://192.168.1.100:8080;),则整个原始路径(含/api/)都会透传过去 - 路径重写只发生在
proxy_pass阶段,不影响浏览器地址栏显示
进阶要点:超时、缓冲与健康检查
生产环境需避免默认值带来的问题:
- 后端响应慢或卡住?调大超时:
proxy_connect_timeout 10s;、proxy_read_timeout 60s;、proxy_send_timeout 60s; - 返回大文件或流式响应?禁用缓冲:
proxy_buffering off;,或调大缓冲区:proxy_buffer_size 128k;、proxy_buffers 4 256k; - 需要自动剔除故障节点?Nginx 开源版不支持主动健康检查,可用
proxy_next_upstream error timeout http_500;配合多个 upstream 实现被动容错;如需主动探测,需升级到 Nginx Plus 或用第三方模块(如 nginx-upstream-check-module)
安全提醒:别忽略访问控制与协议一致性
单纯映射不等于安全上线:
- 禁止直接暴露管理接口(如
/admin、/actuator),可用location+deny all或结合 IP 白名单限制 - 若后端强制跳转 HTTP → HTTPS,而 Nginx 是 HTTPS 入口,会导致跳转死循环 —— 后端需识别
X-Forwarded-Proto并据此判断是否跳转 - 建议开启
proxy_redirect default;,让后端返回的 302 跳转地址自动重写为外网可见的域名,而不是内网地址










