Nginx Proxy Manager在Linux下通过Docker容器部署,依赖docker和docker-compose,需配置两个挂载卷(./data、./letsencrypt)和三个端口映射(80、81、443),所有服务集成于单镜像,无需宿主机Nginx或MySQL。

nginx-proxy-manager 在 Linux 下部署非常轻量,核心就是 Docker 容器 + 两个挂载卷 + 三个端口映射。它不依赖宿主机的 Nginx 或 MySQL,所有服务(包括 Web 管理界面、反向代理逻辑、证书存储)都打包在单个镜像里。
确认 Docker 环境是否就绪
没装 docker 和 docker-compose 就别往下走——nginx-proxy-manager 本质是容器化应用,离了 Docker 就跑不起来。
- 运行
docker --version和docker-compose --version,两者都得有输出;缺一个就得先装(Ubuntu/Debian 推荐用apt install docker.io docker-compose,CentOS/RHEL 用yum install docker-ce docker-compose-plugin) -
systemctl is-active docker返回active才算真正运行着;如果没启动,执行sudo systemctl start docker && sudo systemctl enable docker - 别跳过权限检查:普通用户要能执行
docker命令,得加进docker用户组:sudo usermod -aG docker $USER,然后重新登录终端
用 docker-compose.yml 启动服务
直接写配置比 docker run 命令更可控,尤其涉及卷挂载和端口映射时。注意路径、权限、镜像标签三处最容易出错。
- 新建目录并进入:
mkdir -p ~/npm && cd ~/npm(避免中文路径,也别放在/root下——Docker 默认不信任 root 目录的挂载) - 创建
docker-compose.yml,内容必须严格对齐缩进(YAML 很敏感):
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt-
./data和./letsencrypt会自动创建,但宿主机对应目录需有读写权限(chmod 755 ./data ./letsencrypt) - 如果 80/443 端口已被占用(比如已运行 Apache),把左边端口改成其他未用端口,例如
'8080:80',管理界面仍用81,但访问地址变成http://ip:8080(HTTP 流量)和https://ip:8443(HTTPS 流量) - 中文用户建议直接拉
chishin/nginx-proxy-manager-zh:latest镜像,避免界面乱码,其余配置完全一样
启动后打不开 81 端口?查这三件事
容器起来了,docker ps 能看到 app_1,但浏览器访问 http://服务器IP:81 白屏或拒绝连接——90% 是以下原因。
- 防火墙拦住了:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-all(CentOS),确认81/tcp在放行列表里;没放行就执行sudo ufw allow 81或sudo firewall-cmd --add-port=81/tcp --permanent && sudo firewall-cmd --reload - SELinux 没关(尤其 CentOS):
getenforce返回Enforcing就得临时禁用:sudo setenforce 0,或永久关闭(修改/etc/selinux/config中SELINUX=disabled) - 容器日志报错:
docker logs npm_app_1(容器名取决于你启动时的目录名),常见错误如failed to connect to mysql——说明你误用了需要外部 MySQL 的旧版配置;新版jc21/nginx-proxy-manager自带 SQLite,不需要额外数据库
首次登录后必须立刻做的事
默认账号 admin@example.com / changeme 只能用一次。登录后界面会强制跳转到密码修改页,但很多人以为改完就完了,其实还有两处关键设置漏掉。
- 进【Settings】→【Proxy Hosts】→【SSL】选项卡,勾选
Force SSL和HTTP/2,否则代理站点不会自动跳 HTTPS - 进【Access List】→ 新建一个 IP 白名单规则,限制仅允许你办公室或家庭公网 IP 访问 81 端口(管理界面暴露在公网极其危险)
-
./data目录下有 SQLite 数据库文件database.sqlite,定期cp备份它,比导出配置更可靠——重装时直接替换就能恢复全部代理规则和证书
容器启动后前 30 秒可能返回 502,这是正常现象;docker logs -f npm_app_1 看到 Starting Nginx Proxy Manager 之后再刷新页面。真正麻烦的不是部署,而是后续让 Let’s Encrypt 成功签发证书——那得确保 80 和 443 端口对外可访问,且域名 DNS 已解析到该服务器 IP。


















