011 / 服务器
1Panel OpenResty 无限重启排查记
起因
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 无限重启,十次有八次是证书文件的问题。