在宝塔面板中删除了一个 Node 项目,过了一两个月后重启服务器或升级 Nginx,却突然遇到下面的报错:
nginx: [emerg] cannot load certificate "/www/server/panel/vhost/cert/old-project/fullchain.pem": BIO_new_file() failed
No such file or directory
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed
即使重新安装 Nginx,问题依然存在。原因通常不是 Nginx 程序损坏,而是旧项目的虚拟主机配置没有被清理:项目和证书已经删除,但宝塔生成的 .conf 文件仍被 Nginx 加载,其中继续引用不存在的 fullchain.pem 或 privkey.pem。

一、为什么重装 Nginx 也解决不了?
宝塔的网站、Node 项目和反向代理配置通常保存在 /www/server/panel/vhost/ 下。重装 Nginx 主要替换程序文件,不一定会删除这些业务配置,所以残留的虚拟主机文件还会被重新加载。
Nginx 官方文档说明,nginx -t 不只是检查语法,还会尝试打开配置中引用的文件。因此,只要任意一份正在加载的配置引用了不存在的证书,整个配置检测就会失败,Nginx 也无法正常启动或重载。
二、先看清错误,不要反复重装
宝塔安装的 Nginx 通常可以使用下面的完整路径检测配置:
/www/server/nginx/sbin/nginx -t
重点看错误里的三项信息:
cannot load certificate:无法读取证书;No such file or directory:配置指向的文件已不存在;- 证书路径中的目录名:通常能反推出残留项目名称。
三、定位是哪份配置仍在引用旧证书
假设报错证书目录是 old-project,执行:
grep -R -n "old-project/fullchain.pem" /www/server/panel/vhost/nginx /www/server/nginx/conf
输出会显示配置文件和行号,例如:
/www/server/panel/vhost/nginx/node_old-project.conf:31: ssl_certificate ...
如果担心不止一个项目存在同类问题,可以一次扫描所有正在加载、但证书文件已经不存在的配置:
for f in /www/server/panel/vhost/nginx/*.conf; do cert=$(awk '$1=="ssl_certificate"{gsub(";","",$2);print $2}' "$f"); [ -n "$cert" ] && [ ! -f "$cert" ] && echo "$f -> $cert"; done
这条命令只检查,不会修改或删除文件。

四、先确认项目是否还在使用
不要看到报错就直接删除配置。先查看它绑定的域名及证书路径:
grep -nE 'server_name|ssl_certificate|ssl_certificate_key' /www/server/panel/vhost/nginx/node_old-project.conf
情况 A:项目已经废弃
将配置改成 .bak 后缀,让 Nginx 的 *.conf 加载规则不再读取它:
mv /www/server/panel/vhost/nginx/node_old-project.conf /www/server/panel/vhost/nginx/node_old-project.conf.bak
这是可恢复操作,没有直接删除文件。以后需要恢复项目时,重新部署正确证书,再将文件改回 .conf 即可。
情况 B:项目仍在使用
进入宝塔面板对应的网站或 Node 项目,为实际绑定的域名重新申请并部署 SSL 证书。不要复制其他域名的证书来临时顶替,否则会产生证书域名不匹配问题。
五、检测通过后再启动或重载
处理完所有缺失证书后,再检测:
/www/server/nginx/sbin/nginx -t
看到以下两行才表示配置可以使用:
syntax is ok
test is successful
接着确认 Nginx 是否已有 master 进程:
ps -ef | grep '[n]ginx'
如果有 Nginx master 进程,执行平滑重载:
/www/server/nginx/sbin/nginx -s reload
如果没有任何 Nginx 进程,直接启动:
/www/server/nginx/sbin/nginx
六、遇到 invalid PID number 怎么办?
如果配置检测已经成功,但重载时出现:
invalid PID number "" in "/www/server/nginx/logs/nginx.pid"
这通常表示当前没有可接收重载信号的 Nginx master 进程,或者 PID 文件为空。先用前面的 ps 命令确认;没有进程时应执行启动命令,而不是继续执行 -s reload。
七、验证服务是否恢复
ss -lntp | grep -E ':80|:443'
curl -I http://127.0.0.1
最后再逐个访问主要域名,检查 HTTP、HTTPS、反向代理及 CDN 回源是否正常。
八、避免再次发生
- 删除网站或 Node 项目后,检查
/www/server/panel/vhost/nginx/是否仍有同名配置; - 删除证书前先搜索哪些配置仍在引用该路径;
- 升级或重启 Nginx 前先运行
nginx -t; - 优先把废弃配置改成
.bak,确认稳定后再决定是否永久删除; - 不要通过创建空证书文件或借用其他域名证书来绕过检测。
总结
遇到 BIO_new_file() 和 cannot load certificate 时,核心排查顺序是:找到缺失证书路径 → 定位引用它的配置 → 判断项目是否仍使用 → 重新部署证书或移出废弃配置 → 通过检测后启动 Nginx。
这类问题看起来像 Nginx 安装失败,实际上多半是控制面板遗留配置造成的。抓住报错中的证书路径,通常几分钟就能定位。
参考资料:Nginx 命令行参数、Nginx 进程控制、Nginx HTTPS 配置。
你认为这个网站怎么样?
-人
-人
-人
-人
-人
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...