多个内网服务怎么统一入口?部署 Nginx Proxy Manager 配置反向代理与 SSL

如果一台服务器上同时运行着几个 Web 服务,最开始通常不会觉得有什么问题。

比如 Nginx Proxy Manager 管理页面在 81 端口,另一个应用运行在 3080,还有一个服务监听 9090。在局域网里使用时,直接记住 IP:端口 就能打开。但服务越来越多以后,访问方式也会越来越碎:这个地址后面加 81,另一个换成 3080,某个项目还需要单独配置 HTTPS。

Nginx Proxy Manager 解决的其实不是"怎么启动这些服务",而是怎么给这些已经运行起来的服务建立一个统一入口。

它建立在 Nginx 之上,但把常见的反向代理配置做成了 Web 管理界面。原来需要在 nginx.conf 中编写 server_nameproxy_pass、证书路径以及重定向规则,现在可以通过 Proxy Host 页面填写域名、目标 IP 和端口来完成。

整个访问关系可以先理解成:

访问域名 → Nginx Proxy Manager → 根据规则转发 → 实际运行的内网服务。

例如某个应用实际运行在 192.168.52.213:3080,外部用户并不需要知道这个 IP 和端口。只要请求进入 Nginx Proxy Manager,它就可以根据对应的域名规则,把流量转发到这台机器的 3080 端口。

这样做以后,域名和后端服务就被分成了两层。

后端应用继续按照原来的 IP 和端口运行,NPM 专门负责外部入口。以后应用换端口、换服务器,很多情况下只需要修改代理目标,而不必让使用者重新记一组新的访问地址。

HTTPS 也可以放在这一层统一处理。

Nginx Proxy Manager 集成了 Let's Encrypt 证书管理。在 Proxy Host 中配置好域名后,可以继续申请 SSL 证书,并根据需要开启强制 HTTPS。这样后面的应用本身不一定需要分别维护一套证书配置,公网访问时的 HTTPS 可以集中交给代理层处理。

本文使用 Docker Compose 部署 NPM,并同时使用 MariaDB 保存相关配置。容器对外开放 8044381:80 用于 HTTP,443 用于 HTTPS,81 则是 Nginx Proxy Manager 自己的 Web 管理页面。

但这里还有一个前提:如果 NPM 部署在家庭网络或其他没有直接公网入口的环境中,外部请求首先得能够到达这台机器。

本文采用 cpolar 给 NPM 的 80 端口建立固定公网地址,再由 Nginx Proxy Manager 继续完成后面的反向代理。这样整个链路就变成了:外部请求先通过公网入口进入 NPM,NPM 再根据配置把请求分发给实际的内网服务。

除了按域名转发,原文还演示了另一种很实用的方式:按路径转发。

比如访问:

复制代码
https://域名/app/

可以通过自定义 Location 和 rewrite 规则,把 /app/ 后面的请求转交给 192.168.50.213:9090。这样同一个域名下面也可以继续挂载不同应用,而不一定每增加一个服务都准备一个新的入口。

所以这篇教程可以按照三个层次来看:Docker 负责把 Nginx Proxy Manager 跑起来;NPM 负责域名、反向代理、路径规则和 SSL;公网入口则负责让外部请求真正抵达这套代理系统。

先把这三层关系分清楚,后面的 Proxy Host、SSL 和 /app/ 路径配置就不会只是照着界面填参数,而是能知道每一个设置到底改变了哪一段访问路径。效、更可视化的方式掌控你的网络入口。

1.什么是Nginx Proxy Manager?

Nginx Proxy Manager(简称 NPM) 是一个基于 Nginx 的开源反向代理管理工具,它提供了一个简单易用的 Web 图形界面,让你无需手动编写复杂的 Nginx 配置文件,就能轻松实现:

  • 域名反向代理(将 <yourdomain.com> 指向内网服务如 192.168.1.100:3000)
  • 自动申请和续期 Let's Encrypt 免费 SSL 证书(一键启用 HTTPS)
  • 强制 HTTPS、HTTP/2、HSTS 等安全设置
  • 访问控制(IP 白名单、基础认证)
  • 多用户支持与权限管理

它解决了什么问题?

传统使用 Nginx 做反向代理时,你需要:

shell 复制代码
server {
    listen 80;
    server_name app.example.com;
    location / {
        proxy_pass http://192.168.1.50:8080;
        proxy_set_header Host $host;
    }
}

还要手动配置 HTTPS、申请证书、处理自动续期......对新手极不友好。

而 Nginx Proxy Manager 把这些操作全部图形化:

填域名 → 填内网地址 → 勾选"申请 SSL 证书" → 点保存

几秒钟就完成一套带 HTTPS 的反向代理!

核心功能

功能 说明
可视化代理主机管理 添加/编辑/删除代理规则,支持 WebSocket、自定义头部等
自动 SSL 证书 集成 Let's Encrypt,支持 HTTP 和 DNS 两种验证方式
强制 HTTPS 自动将 HTTP 请求重定向到 HTTPS
访问控制 可为每个代理设置 Basic Auth(用户名/密码)或 IP 限制
Docker 原生支持 官方提供 Docker 镜像,一键部署

典型应用场景

  • 给家里的 NAS、Home Assistant、Pi-hole 添加域名和 HTTPS
  • 在一台云服务器上托管多个 Web 服务(如博客、Wiki、监控系统),通过不同域名区分
  • 快速为测试环境暴露公网地址(配合内网穿透)

注意事项

  • 服务器需有 公网 IP 才能自动申请 Let's Encrypt 证书(除非使用 DNS Challenge)
  • 端口 80 和 443 必须开放(用于证书验证和 HTTPS 服务)
  • 初始密码务必修改!

它让反向代理和 HTTPS 配置变得像填表一样简单,特别适合个人开发者、家庭实验室用户或小型团队,是现代轻量级网关的理想选择。

2.安装Nginx Proxy Manager

创建一个目录来存放Docker Compose文件和相关配置文件:

shell 复制代码
mkdir nginx-proxy-manager

cd nginx-proxy-manager

方法一:在项目目录中创建一个名为docker-compose.yml的文件,并添加以下内容:

shell 复制代码
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Nginx Proxy Manager还可以使用MySQL来进行数据存储。

方法二:Nginx Proxy Manager使用MySQL进行数据存储的示例,创建一个名为docker-compose.yml的文件,并添加以下内容(我采用的这个办法):

shell 复制代码
version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # Mysql/Maria connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
      MARIADB_AUTO_UPGRADE: '1'
    volumes:
      - ./mysql:/var/lib/mysql

在项目目录中运行以下命令启动Nginx Proxy Manager,这将下载所需的Docker镜像并启动容器:

shell 复制代码
docker-compose up -d

docker compose up -d

部署完成后,在浏览器中输入 http://IP:81 就能看到Nginx Proxy Manager的Web界面:

登录时,记得记住登录账号及密码:

登录成功:

负载均衡工具:

3.配置Domain Names

"Domain Names"(域名)是互联网上用于标识网站、服务或资源的人类可读的地址,用来替代难以记忆的数字IP地址。

举个例子:

  • 你访问 https://www.google.com,其中 <google.com> 就是一个域名。
  • 实际上,你的电脑会通过 DNS(域名系统)把 <google.com> 转换成一个 IP 地址(比如 142.250.185.206),然后连接到 Google 的服务器。

域名的核心作用:

  • 方便记忆
  • 比如 <baidu.com> 比 220.181.38.148 容易记多了。
  • 标识品牌或服务
  • 公司、个人、组织通过域名建立在线身份(如 <apple.com>、<github.com>)。
  • 支持网站和邮件服务

跟我一起操作吧!我们用cpolar来打造。

3.1 什么是cpolar?

cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。

3.2 部署cpolar

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

shell 复制代码
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

3.3 配置Domain Names

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我使用的是npm1,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理------创建隧道:

  • 隧道名称:可自定义,本例使用了:nginx,注意不要与已有的隧道名称重复
  • 协议:http
  • 本地地址:80
  • 域名类型:固定二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区:选择China Top

打开在线隧道列表,此时可以看到公网地址名称变成了保留和固定的二级子域名名称,这样一个永久不会变化的二级子域名公网网址即设置好了(即Domain Names )。

4.配置反向代理

4.1 添加Proxy Host

在Web界面中,可以添加新的代理主机来管理反向代理配置,点击Proxy Hosts(依次点击 HostsProxy Hosts → Add Proxy Host):

配置Details:

配置说明:

tex 复制代码
Domain Names :填写网站域名,需要上面做好DNS解析,把域名绑定到服务器IP

Scheme : 选择HTTP或HTTPS。默认http即可,除非有自签名证书

Forward Hostname/IP :填写要代理到的目标主机名或IP地址,或者Docker容器内部IP(NPM和程序服务在同一台服务器上)

Forward Port:填写目标主机的端口号,这里是NPM管理界面81端口

Cache Assets :缓存,根据需求选择打开

Block Common Exploits: 阻止常见的漏洞,根据需求选择打开

Websockets Support :WS支持,根据需求选择打开

Access List: NPM自带的一个限制访问功能

将一个域名(如 npm1.cpolar.top)通过反向代理,转发到你内网的一台服务器(IP: 192.168.42.140,端口 81)上,从而实现从公网访问你的本地服务。

点击"save"后,保留成功:

点击如图所示:

即可访问到Nginx Proxy Manager的管理界面:

将一个域名(如 npm1.cpolar.top)通过反向代理,转发到你内网的一台服务器(IP: 192.168.52.213,端口 3080)上,从而实现从公网访问你的本地服务。

即可访问到192.168.52.213:3080的界面:

4.2 一键申请SSL证书

现在网页显示的是不安全:

选择创建一个新的证书,勾选强制SSL,填写邮件、同意条款,点击Save即可申请SSL证书:

刷新后,恢复正常:

4.3 设置/app的请求

将外部访问https://npm1.cpolar.top/app/的请求,反向代理到内网服务器192.168.50.213:9090上,让外界可以通过公网域名访问你本地部署的应用。

点击如图所示位置:

添加下列数据,使用正则重写规则处理路径:

shell 复制代码
rewrite ^/app/?(.*)$ /$1 break;

点击如图所示:

添加下列数据:

shell 复制代码
location = /app {
    return 301 https://$host/app/;
}

访问https://npm1.cpolar.top/app/,即可跳转到目标页面。

总结

Nginx Proxy Manager 的价值,最终还是在"统一入口"这四个字上。后端的应用继续运行在各自的 IP 和端口上,NPM 放在它们前面,根据域名或路径规则决定请求应该去哪里,同时集中处理 HTTPS、访问控制以及相关代理配置。

本文通过 Docker Compose 完成 NPM 与数据库部署,再通过 cpolar 给代理入口提供公网访问地址,之后分别完成了 Proxy Host、SSL 证书和 /app/ 路径转发。几部分组合以后,原本需要记忆多个 IP:端口 的服务,就可以逐渐整理成更统一的访问方式。

这种方案尤其适合家庭实验室、NAS、多 Docker 服务或者小型自托管环境。服务数量很少时,直接用端口访问并没有问题;当应用越来越多,域名、HTTPS 和访问入口开始变得难以维护时,再把 Nginx Proxy Manager 放到最前面统一管理,会更能体现它的作用。

相关推荐
FIT2CLOUD飞致云1 小时前
智能运维如何落地?WorkBuddy+ JumpServer Skills给你答案
运维·开源·1panel·运维面板
蜀道山老天师1 小时前
Zabbix监控MySQL与Redis应用实践完整指南
linux·运维·redis·mysql·zabbix
fiveym2 小时前
05 - 黄金镜像与全自动还原
运维·服务器·架构
画中有画11 小时前
软件架构中质量属性(性能、安全、可扩展性)的权衡设计
java·运维·安全
NJCloud12 小时前
Ansible(三)——Zabbix 监控系统部署与敏感信息加密
linux·运维·chrome·信息可视化·ansible·zabbix
NJCloud12 小时前
TiDB 集群部署与 MySQL 兼容性适配实战
linux·运维·数据库·mysql·tidb
2401_8685347812 小时前
UNIX常用命令英文全称与中文解释整理
linux·运维
lsh曙光16 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
ly768916 小时前
Docker 从入门到实践:镜像、容器、Dockerfile 与 Docker Compose 详解
运维·docker·容器