nginx反向代理统一暴露内网服务的核心是:以公网nginx为入口,通过server_name按域名、location按路径精准转发请求至内网服务,隐藏真实地址,并集成ssl终止、安全控制与请求头透传。

通过 Nginx 代理统一暴露内部服务,核心是用一台公网可访问的 Nginx 服务器作为反向代理入口,将不同域名、路径或端口的请求精准转发到内网各服务(如 API、Web 应用、管理后台等),同时隐藏后端真实地址、统一处理 SSL、鉴权和限流。
配置基础反向代理:把请求转给内网服务
Nginx 本身不运行业务,只做流量分发。你需要在 server 块中用 proxy_pass 指向内网服务地址(支持 IP+端口 或上游 upstream):
- 确保内网服务已启动且 Nginx 能连通(例如
curl http://192.168.1.10:8080在 Nginx 服务器上能通) - 添加必要代理头,让后端正确识别原始协议、IP 和 Host:
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; - 若后端依赖完整 URL(如重定向、静态资源路径),建议加上:
proxy_redirect off;并按需调整proxy_redirect规则
按域名区分服务:一个 IP 对应多个站点
这是最常用方式。为每个内部服务分配独立子域名(如 api.example.com、admin.example.com),Nginx 根据 server_name 匹配并转发:
- 在
http块外确保已配置 DNS 或 hosts,使域名解析到 Nginx 服务器 IP - 每个
server块监听 80/443,设置对应server_name,再配proxy_pass
示例:server {<br> listen 80;<br> server_name api.example.com;<br> location / {<br> proxy_pass http://192.168.1.20:3000;<br> }<br>} - 多个服务共用 HTTPS 时,用同一份证书(SNI 支持),无需为每个域名单独部署 SSL
按路径前缀路由:单域名下划分不同服务
适合不想申请多个域名或需前端统一入口的场景(如 example.com/api/ → 后端 API,example.com/web/ → Vue 应用):
- 用
location匹配路径前缀,注意末尾斜杠与后端是否一致
例如后端期望请求路径为/user,而你配置location /api/ { proxy_pass http://192.168.1.30:8000/; },Nginx 会自动剥离/api/再转发 - 避免常见错误:
❌proxy_pass http://192.168.1.30:8000;(不带结尾 /)→ 会把/api/user整体传过去
✅proxy_pass http://192.168.1.30:8000/;(带结尾 /)→ 正确剥离前缀 - 前端应用若使用 History 模式(如 Vue Router),需加
try_files $uri $uri/ /index.html;防止刷新 404
增强安全与可用性:不能跳过的几项
仅转发还不够,生产环境需补充关键策略:
-
HTTPS 强制跳转:在 HTTP server 中加
return 301 https://$host$request_uri; - SSL 终结:在 HTTPS server 中配置证书,并关闭后端的 HTTPS(除非有合规要求),减轻后端 TLS 开销
-
简单访问控制:用
allow/deny限制管理后台 IP 段,或配合auth_basic做基础认证 -
超时与缓冲调优:对长连接或大文件服务,增大
proxy_read_timeout、proxy_buffering等参数 - 健康检查(需 Plus 版或开源版搭配第三方模块):避免把请求发到已宕机的后端
不复杂但容易忽略。关键是理清请求流向,每一步都验证 Nginx 能连通后端、响应头传递正确、URL 重写符合预期。上线前用 nginx -t 检查语法,再用 curl -v 实测请求头和返回结果。











