1. 什么是 Nginx Proxy Manager?
Nginx Proxy Manager(简称 NPM)是一款基于 Nginx 的开源反向代理管理工具,它提供了一个简洁、直观的 Web 用户界面,让你无需手动编写复杂的 Nginx 配置文件,即可轻松地为你的多个 Web 服务配置反向代理、SSL 证书(支持 Let's Encrypt 免费证书自动签发)、访问控制等高级功能。
主要特性:
图形化界面:告别命令行和 nginx.conf,通过浏览器轻松管理。
一键 SSL:集成 Let's Encrypt,几分钟内为你的域名启用 HTTPS。
反向代理:将不同域名或子域名指向本地不同端口的服务(如 WordPress、Nextcloud、Home Assistant 等)。
访问控制:设置密码保护、IP 白名单等安全策略。
多用户支持:可创建管理员和普通用户账户。
Docker 友好:官方提供 Docker 镜像,部署简单。
💡 适用场景:家庭服务器、开发测试环境、小型企业应用网关。
2. 部署 Nginx Proxy Manager
我们将使用 Docker 或 Docker Compose 来快速部署 Nginx Proxy Manager。这种方式便于管理容器、持久化数据,并能轻松升级。
2.1 准备工作
创建目录
# 创建安装目录
mkdir nginx-proxy-manager && cd nginx-proxy-manager
# 创建挂载目录
mkdir -p data letsencrypt
请确保在运行命令的当前目录下创建所需目录,否则会出现挂载失败错误。
2.2 Docker部署
docker run -d \
--name nginx-proxy-manager \
--restart unless-stopped \
-p 80:80 \
-p 81:81 \
-p 443:443 \
-v ./data:/data \
-v ./letsencrypt:/etc/letsencrypt \
docker.io/jc21/nginx-proxy-manager:latest
2.3 Docker Compose 部署
2.3.1 docker-compose.yml (带数据库)
services:
# 主应用服务:Nginx Proxy Manager
app:
# 使用官方 Nginx Proxy Manager 镜像
image: 'jc21/nginx-proxy-manager:latest'
# 自定义容器名称
container_name: nginx-proxy-manager
# 重启策略:除非手动停止,否则自动重启(适合生产环境)
restart: unless-stopped
# 端口映射
ports:
- '80:80' # HTTP 流量入口
- '443:443' # HTTPS 流量入口
- '81:81' # Web 管理界面访问端口(通过 http://your-ip:81 访问)
# 数据卷挂载,实现数据持久化
volumes:
- ./data:/data # 持久化 NPM 配置和数据库
- ./letsencrypt:/etc/letsencrypt # 持久化 Let's Encrypt SSL 证书
# 环境变量:配置数据库连接信息
environment:
DB_HOST: mysql # 数据库主机名(对应下方 mysql 服务名)
DB_USER: npm # 数据库用户名
DB_PASS: your_secure_password_here # 数据库用户密码(请替换为强密码!)
DB_NAME: npm_db # 使用的数据库名称
DB_PORT: 3306 # MySQL 默认端口
# 依赖关系:确保 mysql 服务启动完成后再启动 NPM
depends_on:
- mysql
# 数据库服务:MySQL 8.0(稳定版本,广泛支持)
mysql:
# 使用 MySQL 8.0 官方镜像
# 8.0 版本性能更好,安全性更高,且长期支持
image: 'mysql:8.0'
# 自定义容器名称
container_name: npm-mysql
# 自动重启策略
restart: unless-stopped
# 环境变量:MySQL 初始化配置
environment:
MYSQL_ROOT_PASSWORD: your_root_password_here # root 用户密码(请务必修改!)
MYSQL_DATABASE: npm_db # 初始化时创建的数据库(需与 NPM 配置一致)
MYSQL_USER: npm # 创建的普通用户
MYSQL_PASSWORD: your_secure_password_here # 该用户的密码(必须与 DB_PASS 一致)
# 数据持久化:将 MySQL 数据目录挂载到本地
volumes:
- ./mysql-data:/var/lib/mysql # 确保数据库数据在容器重建后不丢失
# 可选:如果需要自定义 MySQL 配置(如编码、性能调优),可挂载配置文件
# volumes:
# - ./mysql-data:/var/lib/mysql
# - ./mysql-config/my.cnf:/etc/mysql/my.cnf
2.3.2 docker-compose.yaml(不带数据库)
services:
# 定义一个名为 'app' 的服务,用于运行 Nginx Proxy Manager
app:
# 镜像地址:从 Docker Hub 拉取官方镜像
# 使用完整域名 docker.io 表示来自官方镜像仓库(等同于不写也可,但更明确)
# 'jc21/nginx-proxy-manager' 是 Nginx Proxy Manager 的官方镜像
# ':latest' 标签表示使用最新稳定版本(建议生产环境指定具体版本号以确保稳定性)
image: 'docker.io/jc21/nginx-proxy-manager:latest'
# 容器重启策略
# unless-stopped:除非手动停止容器,否则在 Docker 启动时自动运行
# 适合长期运行的服务,保证异常退出后能自动恢复
restart: unless-stopped
# 端口映射(Host:Container)——将宿主机端口映射到容器内部端口
ports:
- '80:80' # 将宿主机的 80 端口映射到容器的 80 端口
# 用途:接收并处理 HTTP 请求(如 http://your-domain.com)
- '81:81' # 将宿主机的 81 端口映射到容器的 81 端口
# 用途:访问 Nginx Proxy Manager 的 Web 管理界面(http://your-ip:81)
- '443:443' # 将宿主机的 443 端口映射到容器的 443 端口
# 用途:接收并处理 HTTPS 请求(如 https://your-domain.com)
# 数据卷挂载(Volume Mounts)——实现数据持久化,防止容器删除后配置丢失
volumes:
- ./data:/data # 将当前目录下的 ./data 映射到容器内的 /data
# 用途:存储 NPM 的数据库、配置文件、会话等核心数据
- ./letsencrypt:/etc/letsencrypt # 将当前目录下的 ./letsencrypt 映射到容器内的 /etc/letsencrypt
# 用途:持久化 Let's Encrypt 签发的 SSL 证书
# 避免因容器重建导致证书失效或频繁重签
2.4 启动服务
docker-compose up -d
首次启动可能需要几分钟下载镜像并初始化数据库。
3. 登录
打开浏览器,访问:http://你的服务器IP:81
默认登录的用户名:[email protected] 密码:changeme
第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 其他 Web 应用做反向代理了。
4. 配置反向代理
登录系统后,我们就可以来给 Halo 来添加一个反向代理了。
点击 Proxy Hosts,接着点击 Add Proxy Host,我们只要用到其中的几个功能即可,这边稍微解释一下:
Domain Names :填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上
Scheme :默认 http 即可,除非你有自签名证书
Forward Hostname/IP :填入服务器的 IP,或者 Docker 容器内部的 IP(如果 NPM 和 Halo 搭建在同一台服务器上的话)
Forward Port:填入 Halo 映射出的端口,这边默认是 8090
Cache Assets :缓存,可以选择打开
Block Common Exploits:阻止常见的漏洞,可以选择打开
Websockets Support :WS 支持,可以选择打开
Access List:这个是 NPM 自带的一个限制访问功能
以下是一个样列:因为样例的 NPM 和 Halo 搭建在同一台 VPS 上,所以这边的 IP,图中填的是 172.17.0.1,为 Docker 容器内部的 IP 地址,
可以通过下面的命令查询:
ip addr show docker0
4: docker0:
这边的 IP 是 172.17.0.1,填入这个 IP,可以不用打开防火墙的 8090 端口。
当然,如果你的 NPM 和 Halo 不在同一台服务上,你需要在 IP 部分填入 你的 Halo 所在的服务器的 IP,并在服务商(部分服务商如腾讯、阿里)的后台打开 8090 端口。
5. 一键申请 SSL 证书
接着我们来申请一张 SSL 证书,让我们的网站支持 https 访问。记得打开强制 SSL,
申请证书需要你提前将域名解析到 NPM 所在的服务器的 IP 上;
如果你使用的是国内的服务器,默认 80 和 443 端口是关闭的,你需要备案之后才能使用;
如果你使用了 CloudFlare 的 DNS 服务,记得把小黄云关闭(即不开启 CDN)。
不出意外,你将成功申请到 SSL 证书,证书会三个月自动续期。
再次点开配置,查看一下,将强制 SSL 打开。至此,你已经成功完成了 Halo 的反向代理,快尝试使用域名访问一下看看吧!