本文摘要
最崩溃的不是网站挂了,而是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 无限重启,十次有八次是证书文件的问题。
【文武哥日常】原创文章,作者:【文武哥】,如若转载,请注明出处
打赏文武哥
评论列表(57条)
我也遇到过这问题,折腾了半天才发现是证书文件丢了,坑爹😤
docker logs真是排查神技啊
@NightmareDancer:一查一个准,省太多时间了
自签证书这招太救命了
@袋鼠快递员:能帮到你就好,这个方法挺省心的。
证书一丢直接雪崩,这谁顶得住
@Dark暗:是,一丢就连锁反应,后来我直接用自签占位先顶着,面板起来再补正式证书。
删配置文件重启,简单粗暴有效
nginx一炸,全家都得等修
@羽觞:太真实了,网关一挂全完
自签证书确实稳,省得折腾
这直接把配置删掉重启就行?站点配置备份了后面重建方便吗?
@星空鹿:重建很方便的,1Panel里重新添加站点填下域名就行了
方式二的备份思路不错,下次留个心眼先cp备份一下
自签证书占位这招确实省事
@寂夜客:是的,但别忘了后面要换正式证书,不然浏览器的警告烦死了
还可以看看是不是磁盘满了,我上次就是/var/lib/docker满了导致证书写不进去
自签证书占位后,面板里能直接换正式证书吗?需要手动改配置吗?
openssl生成自签证书时-subj参数可以随便填吗?
@Nova星:自签证书生成的私钥用完之后要记得删掉吧,不然安全起见?
删配置太粗暴了,自签证书方案最好,保留站点配置
又是证书问题,Nginx这玩意一生气就罢工 😤
我之前也被这个loop搞崩溃,发现是letsencrypt续期失败证书过期了😭
我之前也是遇到证书问题,最后发现是letsencrypt续期失败旧证书被清除了,坑😭
还可以检查下nginx -t看看配置语法,有时候多了个分号也炸
虽然没看懂具体操作,但感觉运维都好强啊
又是docker restart loop,烦死了
@荒芜:搞过几次就习惯了,docker restart loop真是经典故障
虽然看不懂,但感觉好厉害
自签证书这招真香,比删配置稳妥多了
其实方式一也挺麻烦,自签后面还得换,不如直接删配置重建
如果站点多一个个删太慢,有批量处理的方法吗?
1Panel确实好用,小毛病需要慢慢磨合
这波操作可以写到运维血泪史里
证书问题真是老生常谈了,我上次也是被这个坑惨了😭
自签证书那招我试过,确实能让服务先跑起来,就是后面记得换正式证书
方法确实实用
想问下,用自签证书占位后,1Panel面板里的证书管理页面能正常申请正式证书吗?
感觉这文章就是写给像我这种小白看的,步骤够详细👍
为啥不直接在配置里把HTTPS先关了?那样不是更简单?
之前搞过类似排查,docker logs真的是第一手线索,比啥都好使
删配置备份一步到位,我一般也这么干,省得自签证书还得手动换
这种无限重启真是气死人,每次排查心累!
ssl目录下的证书是1Panel自动管理的吗?还是自己放进去?
我就吃个瓜,虽然没遇到过,但感觉运维真不容易
折腾这些玩意还是得靠命令行,面板一崩啥都干不了
@春分燕子:面板方便是方便,但关键时刻还是命令行靠谱
hhh,搞运维的谁还没被证书坑过呢
1Panel的开发者们加油啊,看好你们
是不是可以加个自动检查证书存活的脚本,提前预警啊?
那个openssl命令里的-subj参数能随便填吗?会不会影响后面正式证书?
这无限重启的loop真心烦人,看到就头大🤯
方式一保留站点配置更优雅,不过要是站点多的话生成自签也得写脚本吧
我选方式二,简单粗暴,反正重建站点也不麻烦
@古巷深幽:哈哈我也喜欢方式二,不过记得先备份配置
技术文章最喜欢这种有实操步骤的,比那些纯理论的好多了
那个,ssl目录下的证书是1Panel自动管理的吗?还是手动放的?