本文摘要
最崩溃的不是网站挂了,而是1Panel里的OpenResty一直“重启中”,你连后台网站设置都进不去,想修都没入口。很多人这时候先怀疑端口、镜像、配置,结果越查越乱。真正把容器拖进死循环的,往往只是一个早被忽略的证书文件:配置还在,文件没了,Nginx连启动资格都没有。这篇排查记最有价值的,不是报错本身,而是当面板也失灵时,怎么绕开它把服务先救回来。你猜最省事的那一步,删的是配置,还是补的是证书?
— AI 生成,仅供参考
起因
1Panel 面板里 OpenResty 容器状态一直是”重启中”,所有依赖它的网站全部打不开。更烦人的是——因为 OpenResty 没启动,面板里网站设置页面也操作不了,鸡生蛋蛋生鸡。

排查
第一步当然是看日志:
docker logs $(docker ps -a --filter "name=openresty" -q) --tail 100
日志里满屏都是同一行报错:
cannot load certificate "/www/sites/example.yourdomain.com/ssl/fullchain.pem":
BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory)
原因很直白:example.yourdomain.com 这个站点配置了 HTTPS,但证书文件不存在。Nginx 启动时加载配置 → 找不到证书 → 启动失败 → Docker restart 策略让它再试 → 又失败 → 无限循环。
为什么证书会丢?
几种可能:
- 站点创建时申请了证书,后来手动删除了证书文件
- 用 Let’s Encrypt 自动续期,但续期失败后旧证书过期被清理
- 迁移或备份恢复时漏掉了证书目录
- 手动清理磁盘时误删
不管哪种,结果一样:Nginx 配置里引用了一个不存在的文件,直接炸。
解法
因为 OpenResty 起不来,1Panel 面板里的网站管理页面也用不了,所以得直接在服务器上操作。
方式一:生成自签证书占位(推荐)
让证书文件”存在”就行,Nginx 不关心证书内容是否正确,只要文件在就能启动。启动后回到面板再正式申请正式证书。
# 确认证书目录路径,通常在:
ls /opt/1panel/apps/openresty/openresty/www/sites/example.yourdomain.com/ssl/
# 如果 ssl 目录不存在就创建
mkdir -p /opt/1panel/apps/openresty/openresty/www/sites/example.yourdomain.com/ssl/
# 生成自签证书占位
openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /opt/1panel/apps/openresty/openresty/www/sites/example.yourdomain.com/ssl/privkey.pem
-out /opt/1panel/apps/openresty/openresty/www/sites/example.yourdomain.com/ssl/fullchain.pem
-subj "/CN=example.yourdomain.com"
# 重启 OpenResty
docker restart $(docker ps -a --filter "name=openresty" -q)
好处是保留了站点配置,启动后可以回到面板正常管理,再替换成正式证书。
方式二:删掉站点配置文件
如果暂时不需要这个站点,或者想回到面板重新配置,直接删掉对应的 Nginx 配置文件。
# 找到站点配置文件
ls /opt/1panel/apps/openresty/openresty/conf/conf.d/
# 先备份
cp /opt/1panel/apps/openresty/openresty/conf/conf.d/example.yourdomain.com.conf ~/站点配置备份.conf.bak
# 删除
rm /opt/1panel/apps/openresty/openresty/conf/conf.d/example.yourdomain.com.conf
# 重启
docker restart $(docker ps -a --filter "name=openresty" -q)
我这次用的方式二,删完重启,OpenResty 立刻正常。后续需要时再在面板里重新创建站点。
复盘
| 环节 | 要点 |
|---|---|
| 现象 | OpenResty 容器不断重启 |
| 根因 | 站点开了 HTTPS 但证书文件不存在 |
| 关键 | docker logs 一眼看穿 |
| 坑点 | 面板操作依赖 OpenResty,必须绕过面板手动修 |
| 预防 | 别手动删证书文件;Let’s Encrypt 续期失败要及时处理 |
1Panel OpenResty 重启的常见原因速查
如果日志里不是证书问题,还有这些可能:
- 端口冲突:80/443 被其他进程占,
ss -tuln | grep ':80 '检查 - 镜像不完整:特别是 ARM 架构,重新
docker pull - 配置语法错误:
docker exec进容器跑nginx -t - 磁盘满:
df -h看一眼
但说实话,碰到 OpenResty 无限重启,十次有八次是证书文件的问题。
【文武哥日常】原创文章,作者:【文武哥】,如若转载,请注明出处
打赏文武哥
评论列表(26条)
我也遇到过这问题,折腾了半天才发现是证书文件丢了,坑爹😤
docker logs真是排查神技啊
@NightmareDancer:一查一个准,省太多时间了
自签证书这招太救命了
@袋鼠快递员:能帮到你就好,这个方法挺省心的。
证书一丢直接雪崩,这谁顶得住
@Dark暗:是,一丢就连锁反应,后来我直接用自签占位先顶着,面板起来再补正式证书。
删配置文件重启,简单粗暴有效
nginx一炸,全家都得等修
@羽觞:太真实了,网关一挂全完
自签证书确实稳,省得折腾
这直接把配置删掉重启就行?站点配置备份了后面重建方便吗?
@星空鹿:重建很方便的,1Panel里重新添加站点填下域名就行了
方式二的备份思路不错,下次留个心眼先cp备份一下
自签证书占位这招确实省事
@寂夜客:是的,但别忘了后面要换正式证书,不然浏览器的警告烦死了
还可以看看是不是磁盘满了,我上次就是/var/lib/docker满了导致证书写不进去
自签证书占位后,面板里能直接换正式证书吗?需要手动改配置吗?
openssl生成自签证书时-subj参数可以随便填吗?
@Nova星:自签证书生成的私钥用完之后要记得删掉吧,不然安全起见?
删配置太粗暴了,自签证书方案最好,保留站点配置
又是证书问题,Nginx这玩意一生气就罢工 😤
我之前也被这个loop搞崩溃,发现是letsencrypt续期失败证书过期了😭
我之前也是遇到证书问题,最后发现是letsencrypt续期失败旧证书被清除了,坑😭