Nginx 外网访问内网服务器方案
一、背景与目标
在实际生产环境中,很多公司内部的业务服务部署在内网服务器上:
没有公网 IP
即使有公网 IP,也往往无法开放 80 / 443 端口
但又希望:
用户可以直接通过 域名访问
同时支持 HTTP 和 HTTPS
一个云服务器对外转发多个内网项目
本方案将介绍一种通用、稳定、成本低的实现方式:
通过云服务器 + Nginx 反向代理,将外网请求转发到内网服务,并基于域名实现多项目访问
二、整体架构说明
1️⃣ 架构示意
用户浏览器
│
│ http(s)://xxx.example.com
▼
云服务器(公网 IP)
│ 80 / 443
│
Nginx 反向代理(多域名)
│
▼
内网穿透 / 公网映射 IP:端口
│
▼
内网业务服务器(真实服务)
2️⃣ 核心思想
公网只暴露一台云服务器
云服务器通过 Nginx 占用 80 / 443
内网服务通过 内网穿透或高端口映射
域名 → Nginx → 不同内网服务
三、环境准备
1️⃣ 公网访问能力(二选一)
方案一:运营商公网 IP(较少见)
需要向运营商申请
通常无法开放 80 / 443
方案二:内网穿透(推荐)
常见方案:
FRP(frps / frpc)
ZeroTier
Tailscale
特点:
内网服务器主动建立连接
云服务器可访问内网端口
稳定、成本低
2️⃣ 云服务器
一台普通云服务器(1C1G 即可)
具备:
公网 IP
可使用 80 / 443 端口
安装 Nginx
3️⃣ 域名与 DNS
准备一个或多个域名
将域名解析到 云服务器公网 IP
www.example.com → 公网IP
blog.example.com → 公网IP
四、Nginx 转发内网服务(HTTP)
1️⃣ 为什么不能直接暴露内网端口?
运营商通常封禁 80 / 443
内网穿透端口通常是高端口(如 6000+)
用户访问体验差,不安全
👉 解决方案:云服务器统一接管 80 / 443
2️⃣ upstream 定义内网服务
upstream halo {
server 内网穿透IP:映射端口;
}说明:
halo 为逻辑服务名
实际指向内网服务器
3️⃣ 单域名 HTTP 转发示例
server {
listen 80;
listen [::]:80;
server_name www.example.com;
client_max_body_size 1024m;
location / {
proxy_pass http://halo;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}关键点说明:
server_name:域名匹配
proxy_pass:转发到内网服务
X-Forwarded-*:保留真实客户端信息
五、多域名访问不同内网项目(重点)
当只有一个云服务器、一个 80 端口,却需要访问多个项目时,需要使用:
Nginx Name-based Virtual Host(基于域名的虚拟主机)
1️⃣ 多 upstream 定义
upstream halo {
server 内网IP1:端口1;
}
upstream halo1 {
server 内网IP2:端口2;
}2️⃣ 多 server 配置(同端口,不同域名)
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://halo;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://halo1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}📌 同一个 80 端口,通过 Host 头区分服务
六、HTTPS 支持方案
1️⃣ HTTPS 实现思路
HTTPS 证书 只需要部署在云服务器
内网服务可以继续使用 HTTP
云服务器完成 TLS 终止
浏览器 HTTPS → 云服务器(SSL) → HTTP → 内网服务
2️⃣ HTTPS server 示例
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.pem;
ssl_certificate_key /etc/nginx/ssl/example.key;
location / {
proxy_pass http://halo;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}3️⃣ HTTP 自动跳转 HTTPS(推荐)
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}七、安全与优化建议
1️⃣ 安全建议
云服务器只暴露 80 / 443
内网端口不对公网开放
使用防火墙限制内网穿透来源
2️⃣ 性能与稳定性
启用 keepalive
合理配置 client_max_body_size
upstream 可扩展为负载均衡
八、方案总结
本方案优点
✅ 不依赖内网公网 IP
✅ 支持多域名、多项目
✅ 支持 HTTP / HTTPS
✅ 架构清晰,维护成本低
适用场景
中小公司内网服务对外访问
私有部署博客 / API / 管理系统
无法直接暴露 80 / 443 的环境
九、一句话总结
通过云服务器 Nginx 反向代理,将外网 80/443 请求按域名转发到内网穿透服务,实现安全、稳定、多域名访问内网系统。
默认评论
Halo系统提供的评论