Nginx Proxy Manager 自定义默认站点页面,别再用默认的 Congratulations 了
事情是这样的。前两天有人直接输了我服务器的 IP 进了浏览器,然后就看到一个绿色大横幅 ——「Congratulations! You’ve successfully started the Nginx Proxy Manager」。
说实话那一刻有点尴尬,就像家里大门上贴了张「欢迎小偷光临」的告示。
NPM 这个默认页面本意是告诉你安装成功了,但对外暴露就等于告诉扫描器:「这里是 Nginx Proxy Manager,可以针对性攻击」。还好改掉它比想象中简单。
NPM 的四种默认站点模式
在 NPM Web UI 里,进 Settings → Default Site,有四个选项:
| 模式 | 行为 | 推荐场景 |
|---|---|---|
| Congratulations | 显示 NPM 默认欢迎页 | ❌ 安装验证后尽快关掉 |
| 404 | 返回 404 Not Found | ✅ 最安全,假装没有服务 |
| 444 | 直接关闭连接,无响应 | ✅ 用于 443 端口,不暴露任何信息 |
| Redirect | 301 重定向到指定 URL | 可以跳转到你的主站 |
| Custom HTML | 展示自定义页面 | ✅ 本文重点 |
注意 HTTPS 端口的默认站点行为:NPM 维护者 jc21 明确表示 443 端口默认返回 444(直接掐断连接),不支持 HTTPS 重定向。理由也合理:如果连 SSL 证书验证都能跳过,那 HTTPS 就没意义了。所以如果你希望 443 端口也展示自定义页面,需要建一个通配符代理主机(*.你的域名.com)+ SSL 证书,走正常的代理逻辑。
我的选择是:HTTP(80 端口)用 Custom HTML → 展示一个干净的状态页;HTTPS(443 端口)用 444 → 直接掐断。
自定义 HTML 怎么配
选 Custom HTML 后,NPM 会从容器内的 /data/nginx/default_www/index.html 读取页面。
Docker 部署的话,在 docker-compose.yml 里加一行 volume 映射:
services: npm-app: image: 'jc21/nginx-proxy-manager:latest' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt - ./default_www:/data/nginx/default_www # 新增这行然后在 default_www/ 目录下放一个 index.html,重启容器就生效。
我的模板:GitHub 暗色风
设计上几个考量:
- 纯单文件,零外部依赖 —— 不加载 CDN 字体、图标库,离线也完整
- 暗色主题,跟终端、IDE、Dashboard 风格统一,不突兀
- 动态信息:页面会显示请求域名、访问者 IP(通过 ipify API)、服务器时间
- 状态指示灯:绿色脉冲动画,表明反代服务在线
- 给管理员看的提示:「去 NPM → Hosts → Proxy Hosts 添加」
模板已经放在 ~/Documents/npm-default-page.html,直接改名为 index.html 丢进 volume 就能用。
一个小坑
如果你把自定义页面放在 volume 里但页面没生效,检查两个地方:
docker-compose.yml的 volume 路径写对了没 —— 容器内路径是/data/nginx/default_www,不是/data/nginx/custom(那是 404 host 自定义路径)- NPM Settings → Default Site 确实选了 Custom Page(也就是 HTML 模式),不是 Congratulation 也不是 404
总结
改掉默认页面的操作本身很简单,但很多人(包括我自己)部署完就忘了这事。一个暴露服务类型的欢迎页,比 404 更危险。花五分钟改掉,反代入口干净很多。
顺带一提,如果你连 443 端口的 444 都不想用(毕竟它还是会暴露一个端口可连),可以在 NPM 容器前再加一层防火墙只开放 443,让 80 端口走 CDN 或者直接关掉。