前言
在现代Web应用架构中,反向代理不仅是提升性能与安全性的关键组件,更是实现多服务共用一个公网IP、统一入口管理的必备工具。然而,对于许多初学者或小型项目团队来说,手动配置Nginx实现HTTPS、虚拟主机、端口转发等功能,往往意味着繁琐的配置文件编写、证书申请流程以及潜在的语法错误风险。
Nginx Proxy Manager正是为解决这一痛点而生。它提供了一个简洁直观的 Web 界面,让你无需记忆复杂的 Nginx 指令,即可轻松完成:
- 域名代理主机的创建与管理
- 自动申请并续期Let’s Encrypt免费SSL证书
- 强制HTTPS、HTTP/2、HSTS等安全策略一键启用
- 内网服务的安全暴露与访问控制
本文将带你从零开始,在一台干净的 CentOS 7 或 Ubuntu 服务器上,完整部署 Nginx Proxy Manager,并逐步配置 HTTPS 加密与反向代理规则。无论你是想为家庭实验室中的 Home Assistant、Portainer、Nextcloud 等服务添加域名访问,还是为生产环境搭建轻量级网关,这篇指南都将为你提供清晰、可复现的操作路径。
让我们一起告别手写 nginx.conf 的时代,用更高效、更可视化的方式掌控你的网络入口。
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 做反向代理时,你需要:
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文件和相关配置文件:
mkdir nginx-proxy-manager
cd nginx-proxy-manager
方法一:在项目目录中创建一个名为docker-compose.yml的文件,并添加以下内容:
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的文件,并添加以下内容(我采用的这个办法):
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镜像并启动容器:
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)。
- 支持网站和邮件服务
- 网站:https://yourname.com
- 邮箱:you@yourname.com
跟我一起操作吧!我们用cpolar来打造。
3.1 什么是cpolar?
cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。
3.2 部署cpolar
cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh
安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar
Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。
3.3 配置Domain Names
使用cpolar为其配置二级子域名(cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站),该地址为固定地址,不会随机变化。
点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我使用的是npm1,大家可以自定义。填写备注信息,点击保留。
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,本例使用了:nginx,注意不要与已有的隧道名称重复
- 协议:http
- 本地地址:80
- 域名类型:固定二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区:选择China Top
打开在线隧道列表,此时可以看到公网地址名称变成了保留和固定的二级子域名名称,这样一个永久不会变化的二级子域名公网网址即设置好了(即Domain Names )。
4.配置反向代理
4.1 添加Proxy Host
在Web界面中,可以添加新的代理主机来管理反向代理配置,点击Proxy Hosts(依次点击 Hosts → Proxy Hosts → Add Proxy Host):
配置Details:
配置说明:
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上,让外界可以通过公网域名访问你本地部署的应用。
点击如图所示位置:
添加下列数据,使用正则重写规则处理路径:
rewrite ^/app/?(.*)$ /$1 break;
点击如图所示:
添加下列数据:
location = /app {
return 301 https://$host/app/;
}
访问https://npm1.cpolar.top/app/,即可跳转到目标页面。
总结
Nginx Proxy Manager(NPM)是一个基于Web界面的反向代理管理工具,简化了Nginx配置、SSL证书申请与域名代理的流程。
文章详细介绍了如何在Linux系统(如Ubuntu或Debian)上通过Docker一键部署NPM,初始化管理员账户,添加代理主机(将公网域名请求转发到内网服务),并利用其集成的Let’s Encrypt功能自动申请和续期免费HTTPS证书。同时强调了端口映射(80/443)、防火墙设置及本地 DNS 解析等关键注意事项。
一句话总结:通过Docker快速部署Nginx Proxy Manager,用图形界面轻松实现反向代理与自动HTTPS,安全暴露本地服务到公网。
感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站


































