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 端口,不暴露任何信息
Redirect301 重定向到指定 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 里但页面没生效,检查两个地方:

  1. docker-compose.yml 的 volume 路径写对了没 —— 容器内路径是 /data/nginx/default_www,不是 /data/nginx/custom(那是 404 host 自定义路径)
  2. NPM Settings → Default Site 确实选了 Custom Page(也就是 HTML 模式),不是 Congratulation 也不是 404

总结

改掉默认页面的操作本身很简单,但很多人(包括我自己)部署完就忘了这事。一个暴露服务类型的欢迎页,比 404 更危险。花五分钟改掉,反代入口干净很多。

顺带一提,如果你连 443 端口的 444 都不想用(毕竟它还是会暴露一个端口可连),可以在 NPM 容器前再加一层防火墙只开放 443,让 80 端口走 CDN 或者直接关掉。