前言
每次使用nginx做反向代理都需要进入服务器, 使用命令行操作配置文件, 非常麻烦,且时间一久很容易忘记.
Nginx Proxy Manager(后面简称npm)为用户提供一个易于使用的web界面,用于管理虚拟主机、反向代理、SSL证书和访问控制等功能.
查看官方文档
![Image [9]](https://cdn.kejipp.cn/images/202401221510854.webp)
也有第三方基于npm制作了中文版查看DockerHub 查看GitHub
在下面的docker-compose.yml文件中将 'jc21/nginx-proxy-manager:latest' 改为 chishin/nginx-proxy-manager-zh:release 即可
本教程使用
docker-compose安装,如果没有安装docker及docker-compose请查看 Docker 系列 基础系列 docker 及 docker-compose 安装
一、安装
npm需要使用到mysql, 再加上redis三者皆是常见项目需要用到的服务, 故放在一个docker-composer文件里创建, 统一部署, 方便之后复用没有
redis需求的, 可以在docker-compose.yml的代码中删除redis及其之后的代码
1. 安装位置
个人习惯所有docker项目文件, 都在/root/docker目录下, 以项目命名文件夹.方便管理统一管理
例如:

2. 安装
在npm目录下创建docker-composer.yml文件
mkdir -p /root/docker/npm
cd /root/docker/npm
vi docker-compose.yml
输入:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web npm 后台的端口
environment:
DB_MYSQL_HOST: "db" # 数据库容器名
DB_MYSQL_PORT: 3306 # 数据库容器端口
DB_MYSQL_USER: "npm" #用户名
DB_MYSQL_PASSWORD: "npm" #密码
DB_MYSQL_NAME: "npm" #数据库
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: mysql:5.7
container_name: db
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root # 管理员密码
MYSQL_DATABASE: npm # npm用到的数据库
MYSQL_USER: npm # npm用到的用户名
MYSQL_PASSWORD: npm # npm用到的密码
command:
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ../mysql/data:/var/lib/mysql #mysql数据
- ../mysql/conf.d:/etc/mysql/conf.d #mysql配置文件
redis:
image: redis:alpine
container_name: redis
restart: always
volumes:
- ../redis/data:/data
container_name: 容器名, 有大用, 可以在大部分地方使用容器名连接, 而不是难记的ip地址
保存退出
启动
docker-compose up -d
二、基本使用
-
安装好npm后, 登录, 根据提示修改账户密码
-
完成域名解析
-
回到npm设置代理
-
基本的nginx认证【让网站更安全!开启NginxProxyManager网站访问登陆限制功能】
-
反向代理的三种地址设置方式
-
推荐 使用容器名+容器端口 (容器名就是上面
docker-composer中的container_name优点无需开放宿主机端口, 无需记录ip) -
不推荐 使用容器ip+端口 (可能在重启容器后ip改变, 不方便)
-
不推荐 使用宿主机ip+映射的外部端口 (需要服务器开放对应端口, 不安全)
-
三、申请泛域名 SSL 证书
视频教程, 申请 Let’s Encrypt 泛域名 SSL 证书, 后面就无需每个二级域名都要申请ssl证书了
根据你们的域名解析商选择合适的申请入口
我这里是用的DNSPOD,点击去申请 APIKEY
记住下图中5和6, 单独备份好

回到Nginx Proxy Manager


图中1, 记得使用通配符
*图中2填写账户邮箱
图中3选择
DNSPod图中4填写
DNSPod的邮箱账户图中5填写上面申请的
DNSPOD的APIKEY的ID和token
点击Save如果出现zope报错

可以进入容器内部
docker exec -it <容器名> /bin/bash
安装zope就行
sudo apt install python3-zope
或者
pip install zope
再点击Save重新保存一下即可
- 如果还不行, 中文版的 GitHub 仓库中也有解决方式, 可以参考

![Image [4]](https://cdn.kejipp.cn/images/202401221516245.webp)
![Image [6]](https://cdn.kejipp.cn/images/202401221516309.webp)
![Image [5]](https://cdn.kejipp.cn/images/202401221517170.webp)
![Image [7]](https://cdn.kejipp.cn/images/202401221517348.webp)