Nginx Proxy Manager 升级后证书失效故障记录

Nginx Proxy Manager 升级后证书失效故障记录

__

时间:2026-06-21
环境:华为云 ECS,1Panel 管理面板,Docker 部署 Nginx Proxy Manager 2.15.1


故障现象

升级 NPM 到 2.15.1 后:

  • NPM web 界面(:81)无法访问
  • 所有反代站点返回 SSL 错误
  • 容器陷入无限重启循环

此外,在升级之前就已存在一个隐性问题:NPM web 界面显示证书还有数月有效期,但用命令实际查询时证书已经过期notAfter=Jun 21 11:52:59 2026 GMT),两者不一致。推测是某次历史升级导致数据目录路径变更后,NPM 数据库中记录的证书信息与磁盘上实际加载的证书文件不同步,web 界面读取的是数据库中的旧记录,而 nginx 实际加载的是另一份已过期的证书文件。


根本原因

1Panel 在升级 NPM 时重建了容器,letsencrypt 数据目录的卷挂载路径发生了变更

旧路径(升级前) 新路径(升级后)
宿主机目录 .../nginx-proxy-manager/letsencrypt/ .../nginx-proxy-manager/data/ssl/
容器内挂载点 /etc/letsencrypt /etc/letsencrypt(不变)

证书文件仍留在旧的宿主机路径,新容器挂载的是空的新路径,导致 nginx 启动时找不到证书文件。


错误日志特征

nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/npm-12/fullchain.pem":
BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory)

排查步骤

确认线上证书实际状态

echo | openssl s_client -connect www.lymo.xin:443 -servername www.lymo.xin 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer
# notAfter=Jun 21 11:52:59 2026 GMT  → 已过期

查看容器状态与日志

docker ps -a
docker logs 1Panel-nginx-proxy-manager-f5z7 --tail 100

确认容器卷挂载路径

docker inspect 1Panel-nginx-proxy-manager-f5z7 | grep -A 20 '"Mounts"'
# 确认 /etc/letsencrypt 挂载到了 data/ssl/,而非旧的 letsencrypt/

查找证书文件实际位置

find / -path "*/letsencrypt/live/npm-*" -name "fullchain.pem" 2>/dev/null
# 输出:.../nginx-proxy-manager/letsencrypt/live/npm-12/fullchain.pem
# 证书在旧路径,未被挂载进容器

修复步骤

第一步:将证书数据复制到新挂载路径

cp -r /opt/1panel/apps/nginx-proxy-manager/nginx-proxy-manager/letsencrypt/. \
      /opt/1panel/apps/nginx-proxy-manager/nginx-proxy-manager/data/ssl/

第二步:验证文件已到位

ls /opt/1panel/apps/nginx-proxy-manager/nginx-proxy-manager/data/ssl/live/npm-12/
# cert.pem  chain.pem  fullchain.pem  privkey.pem  README

第三步:重启容器

docker restart 1Panel-nginx-proxy-manager-f5z7
docker logs 1Panel-nginx-proxy-manager-f5z7 --tail 20

第四步:在 NPM web 界面手动触发证书续签(因证书当天到期)

第五步:验证续签结果

echo | openssl s_client -connect www.lymo.xin:443 -servername www.lymo.xin 2>/dev/null \
  | openssl x509 -noout -dates
# notAfter=Sep 19 13:29:00 2026 GMT  ✓

续签配置验证

cat /opt/1panel/apps/nginx-proxy-manager/nginx-proxy-manager/data/ssl/renewal/npm-12.conf

配置中路径使用容器内路径 /etc/letsencrypt/... 是正常的,certbot 在容器内运行,由 Docker 卷挂载保证宿主机路径映射正确。


注意事项

  • NPM 自带自动续签,certbot 定时任务由容器内部管理,无需在 1Panel 中额外配置证书续期,两套机制不要混用
  • 升级 NPM 前务必备份以下两个目录:
    • data/ssl/(证书数据)
    • data/data/(NPM 数据库与配置)
  • 升级后第一件事是检查卷挂载路径是否有变化,可用 docker inspect <容器名> | grep -A 20 Mounts 确认
  • 发现 web 界面证书到期时间与 openssl 实测不符时,说明数据库记录与磁盘文件已不同步,需要重点排查挂载路径

思源笔记 MCP 接入 Hermes-Agent 完整排查总结 2026-06-20
Obsidian Docker 容器浏览器访问完整部署记录 2026-06-22

评论区