nginx的proxy_pass实现内网穿透本质是反向代理:外网请求经nginx(需对外可访问)转发至内网服务(如192.168.1.50:8080),无需修改内网设备或依赖路由器端口转发,仅需确保nginx可达、内网服务可连、防火墙放行端口,并通过proxy_pass及配套header/timeout等指令完成协议转发与请求处理。

用 Nginx 的 proxy_pass 实现内网服务穿透代理,本质是让外网用户通过 Nginx 服务器(具备公网或可访问 IP)反向代理访问你局域网内部的服务,比如一个运行在 192.168.1.50:8080 的 Web 应用。它不改变内网设备的网络结构,也不依赖路由器端口转发(但若 Nginx 本身在内网,仍需确保其能被外网访问)。
前提条件要确认清楚
• Nginx 所在服务器必须对外可访问:要么它本身有公网 IP,要么它部署在云服务器上,或者你的家用/办公路由器已将该服务器的某个端口(如 80/443)做了端口转发;
• 内网服务已正常运行且可被 Nginx 服务器直连(例如在 Nginx 机器上执行 curl http://192.168.1.50:8080 能返回内容);
• 防火墙(系统防火墙、云厂商安全组、路由器)放行了 Nginx 监听的端口(如 80 或 443);
• 不需要在内网设备上装额外工具(如 ngrok),Nginx 自身完成协议转发和请求头处理。
基础 proxy_pass 配置写法
编辑 Nginx 配置文件(如 /etc/nginx/conf.d/myapp.conf),添加一个 server 块:
server {
listen 80;
server_name example.com; # 可填域名,也可用 IP(如 203.0.113.10)
location /api/ {
proxy_pass http://192.168.1.50: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;
}
}
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
注意:proxy_pass 结尾的 / 很关键——带斜杠表示路径重写,/api/xxx 会变成 /xxx 发给后端;不带则完整传递路径(如 /api/xxx → 后端也收 /api/xxx)。
常见问题与增强配置
• 后端服务返回绝对 URL(如重定向、CSS 中的链接)出错? 加上:
proxy_redirect http://192.168.1.50:8080/ /api/;(适配重定向地址)
或更通用:proxy_redirect ~^http://[^/]+(/.*)$ $1;
• WebSocket 支持? 需显式透传升级头:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
• 超时或大文件上传失败? 补充:
proxy_connect_timeout 30s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
client_max_body_size 100m;
HTTPS 场景下怎么配?
如果用域名 + SSL,先配置好证书(可用 Certbot 自动申请),再把 listen 80 换成:
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
其余 location 和 proxy_pass 逻辑完全不变。建议同时加个 80 → 443 强制跳转:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}










