说起这个话题,我这周末刚经历了一场"惊魂时刻"。大半夜的正准备睡个安稳觉,手机报警短信炸了,监控显示服务器上的 OpenResty 容器一直在疯狂重启。那种感觉,就像你明明关了煤气灶,却总觉得哪里还在冒烟,心里七上八下的。
遇到这种情况,很多人的第一反应是重启大法好,或者干脆重装容器。千万别冲动!这种无限重启的死循环,99% 都是因为配置文件里引用了不存在的东西。
这时候,最稳的操作就是直接看 Docker 日志。一条命令 docker logs 敲下去,真相往往就在最后几行。
我这回看到的报错信息非常直白:cannot load certificate ... No such file or directory。说白了,就是 Nginx 启动时要加载某个站点的 HTTPS 证书,结果文件找不着了。这就像你出门穿鞋,左脚鞋不见了,肯定走不了路,只能原地报错。
这种情况在 1Panel 或者类似的面板环境里特别常见。有时候是手动清理磁盘空间,手一抖把证书目录给删了;有时候是 Let's Encrypt 自动续期失败,旧证书过期被清理,新证书没下来。
最搞人心态的是,OpenResty 起不来,面板的网页管理端也跟着瘫痪——这就是典型的死锁。你想在面板上修复,面板告诉你它依赖的服务没启动;你想直接修服务,又得绕过面板操作。
既然知道了病根是缺证书,那就好办了。咱们得绕过面板,直接进服务器操作。
既然它要证书,咱们就给它造一个"假的"。
用 OpenSSL 生成一套自签名证书,扔到报错提示的那个目录里。Nginx 启动时只检查文件存不存在,不检查证书是不是正规机构签发的。只要文件在,它就能跑起来。等容器正常了,回到面板再申请正式的 Let's Encrypt 证书覆盖掉就行。
这个方法的好处是保留了原有的站点配置,不用折腾 Nginx 的 conf 文件,属于微创手术。
如果你一时半会儿找不到正确的证书路径,或者这个站点暂时不需要了,直接把对应的 .conf 配置文件删掉或者移走备份。
没有了配置文件的引用,Nginx 就不会去加载那个不存在的证书,自然也就不会报错。这一招虽然简单粗暴,但后续你得重新在面板里配置站点,稍微麻烦点。
这次折腾完我也反思了一下,其实 OpenResty 无限重启,除了证书问题,端口冲突也是个高频原因。特别是 80 和 443 端口,很容易被其他进程抢走。这时候用 ss -tuln 看一眼端口占用,往往能发现意外惊喜。
以后大家碰到这种事,稳住心态,先看日志,别急着删库跑路。毕竟,只要日志还在,真相就藏不住。
参与讨论
半夜报警那种感觉,真的血压直接上来。
证书丢了把整个面板一起带崩,这设计也太坑了吧。