时间: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实测不符时,说明数据库记录与磁盘文件已不同步,需要重点排查挂载路径