前言:
在上一篇中,我们成功给 VPS 装上了 Docker,还部署了一个 Portainer 面板。现在的你,可能正对着浏览器地址栏里的 http://1.2.3.4:9000 发呆。
这串数字有三个问题:
1. 难记: 谁能记得住那么多端口号?
2. 难看: 发给朋友显得很不专业。
3. 不安全: HTTP 明文传输,密码随时可能被监听。
今天,我们要请出 Docker 界最受欢迎的“看门大爷”——Nginx Proxy Manager (NPM)。
它能把复杂的反向代理配置变成简单的图形化操作,并免费帮你申请 SSL 证书(HTTPS)。从此以后,你的服务将拥有漂亮的域名和安全的小绿锁。
1. 什么是反向代理?
别被专业名词吓到了。想象一下:
- 没有反向代理: 客人(用户)去住酒店,必须自己爬窗户进对应的房间(端口),比如爬进 9000 号房。
- 有了反向代理: 酒店门口站了个大堂经理(NPM)。客人只要说“我要去 Portainer 厅”,经理就会优雅地把他领到 9000 号房,客人根本不需要知道房间号。
2. 准备工作
在开始之前,你需要准备两样东西:
- 一个域名: 如果没有,去腾讯云、阿里云或者 NameSilo 买一个便宜的(几块钱一年)。
- 做好解析: 去你的域名服务商后台,把域名(比如
https://www.google.com/search?q=panel.%E4%BD%A0%E7%9A%84%E5%9F%9F%E5%90%8D.com)的 A 记录解析到你 VPS 的 IP 地址。
3. 安装 Nginx Proxy Manager
还是用我们熟悉的 Docker Compose 来安装。这回我们要稍微小心一点,因为它需要占用 80 和 443 端口。
第一步:创建目录
mkdir -p ~/docker-data/npm cd ~/docker-data/npm
第二步:创建配置文件
vim docker-compose.yml
粘贴以下内容(注意:数据库密码 DB_PASSWORD 可以自己改复杂点):
version: '3' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' # HTTP 默认端口 - '81:81' # NPM 管理后台端口 - '443:443' # HTTPS 默认端口 volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
只要是 Docker,我就不推荐用 SQLite,还是用个正经数据库稳
db: image: 'jc21/mariadb-aria:latest' restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 'npm' MYSQL_DATABASE: 'npm' MYSQL_USER: 'npm' MYSQL_PASSWORD: 'npm' volumes: - ./mysql:/var/lib/mysql
第三步:启动!
docker compose up -d
第四步:放行防火墙
这一步至关重要,否则外面进不来:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 81/tcp
4. 第一次登录与配置
打开浏览器,访问 http://你的IP:81。你会看到 NPM 的登录界面。
默认账号密码(进去后必须立刻修改):
Email: admin@example.com
Password: changeme
5. 实战:给 Portainer 加上域名和 SSL
现在我们拿上一节课装好的 Portainer 练手。假设你已经把 https://www.google.com/search?q=portainer.yourdomain.com 解析到了服务器 IP。
步骤 A:添加代理主机
- 点击界面上方的 Hosts -> Proxy Hosts。
- 点击右上角的 Add Proxy Host。
- 填写基本信息:
Domain Names:
https://www.google.com/search?q=portainer.yourdomain.com(按回车确认)Scheme:
httpForward Hostname / IP: 这里的坑最大!不要填 127.0.0.1,因为 NPM 在容器里,访问不了宿主机的 127。要填 Docker 的网关 IP(通常是
172.17.0.1)或者直接填你 VPS 的公网/内网 IP。Forward Port:
9000 - 把 Block Common Exploits 打开(多一层安全防护)。
步骤 B:申请 SSL 证书(HTTPS)
- 不要急着点 Save,点击上方的 SSL 标签页。
- 在 SSL Certificate 下拉框中选择 Request a new SSL Certificate。
- 打开 Force SSL(强制跳转 HTTPS)。
- 勾选 I Agree to the Let’s Encrypt Terms of Service。
- 点击 Save。
如果一切顺利,稍微转几圈后,列表里就会出现你的配置,并且 Status 显示为绿色。
现在,在浏览器里输入 https://portainer.yourdomain.com,看看是不是直接进去了?而且地址栏里有一个漂亮的小绿锁!
6. 避坑指南(新手必看)
- 申请证书失败? 99% 的原因是你的域名解析还没生效,或者你填的域名是错的。先自己在电脑上
ping一下你的域名,看能不能通。 - 502 Bad Gateway? 这说明 NPM 连不上你的服务。检查 Forward IP 和 Port 填对没。再次提醒,Docker 容器之间互相访问,最好不要用
localhost。 - Cloudflare 用户注意: 如果你的域名托管在 Cloudflare 并且开了“小黄云”(CDN),申请证书时可能会报错。建议先把小黄云关掉(仅 DNS 模式),申请好证书后再打开,或者在 SSL 选项里使用 DNS Challenge 模式(进阶玩法)。
7. 小结
这一篇的内容非常实战。你搭建了一个互联网的“交通枢纽”。
从此以后,你想部署什么新服务(博客、网盘、密码库),只需要两步:
1. docker compose up 跑起来。
2. 去 NPM 后台加个域名转发。
就是这么简单!
下一步预告: 基础设施(系统+Docker+NPM)全部搭建完毕!下一篇,我们终于要搭建第一个真正属于你自己的内容平台——WordPress 个人博客。