故梦丶
2026-01-09
点 赞
0
热 度
21
评 论
0

Nginx 外网访问内网服务器方案

  1. 首页
  2. 良缘·匠心
  3. Nginx 外网访问内网服务器方案

文章摘要

智阅GPT

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 请求按域名转发到内网穿透服务,实现安全、稳定、多域名访问内网系统。


成功是一时的,但失败和平凡是我们生命的主旋律,我们在平凡的路上,一直和你们相伴!

故梦丶

infj 提倡者

站长

具有版权性

请您在转载、复制时注明本文 作者、链接及内容来源信息。 若涉及转载第三方内容,还需一同注明。

具有时效性

目录

欢迎来到故梦丶的站点,为您导航全站动态

53 文章数
5 分类数
5 评论数
17标签数

热门文章