证书不肯续期、777 权限和一个找不到的 socket
这周我准备了一份清单。
不是服务器的,是韩国签证的。护照原件要 6 个月以上有效期,白底 3.5×4.5 照片要近 6 个月内拍的,申请表、信息保护告知书、身份证正反面复印件、学信网认证备案表、毕业证复印件,一样一样列着,勾完才能交。
有意思的是,同一周,我的服务器也给我递了一份差不多的”清单”。只不过上面三项全是我没预料到的坑。
坑一:证书说自己还不想续
周二收到告警:SSL 证书跌破 30 天线。例行公事,三个月一轮,我照旧跑 certbot renew。
结果它说 “not yet due”,还不到续期的时候。
证书明明快到期了,为什么不肯续?查了一下,是 ACME ARI(Renewal Info)在起作用。这是 ACME 协议的一个扩展,CA 可以告诉客户端”你的续期窗口被推迟到某天之后”,目的是把续期请求错峰,避免所有人都在到期那一刻挤爆服务器。
设计上挺合理,就是把我这个盯着 30 天告警线的人给卡住了。
解决办法也简单:--force-renewal 强制续期,新证书到手,有效期到 2026-11-15。
教训:自动化的告警和自动化的行为是两套系统。告警看的是结果(还剩几天),行为听的是规则(ARI 窗口)。两者对不上的时候,得有人拍板。
坑二:更新完主题,权限变成 777
周日例行周维护,把 twentysixteen 主题从 3.8 更新到 3.9,一切顺利。顺手做了权限检查,发现新主题目录全是 777,属主还是 root。
原因是更新用 root 跑 wp-cli,root 的默认 umask 比较宽松,解压出来的文件就成了 777。
777 意味着任何用户都能写这个目录。对一个网站来说,这是恶意脚本最喜欢落脚的地方。
修复:属主改回 www-data,目录 755,文件 644,WordPress 的标准配置,两分钟的事。
教训:root 跑完更新,记得回头看一眼权限。方便不能以留洞为代价。
坑三:mysqldump 找不到 socket
同样是周日,跑每周全量数据库备份,报错了:连不上 MySQL socket。
奇怪,数据库明明在跑。查了一圈,MySQL 是跑在 Docker 里的,端口映射到宿主机 3306。wp-config.php 里 DB_HOST 写的是 127.0.0.1,但 mysqldump 不指定 host 时默认走 Unix socket——那个 socket 文件在宿主机上根本不存在。
修复:加 -h127.0.0.1 强制走 TCP,备份顺利完成。
教训:默认行为是隐藏的假设。环境一变(比如把数据库搬进 Docker),默认行为就不再成立。
清单
韩国签证的清单,是怕”交材料的时候缺东西”。
服务器这周递给我的三个坑,全是”正常运行,但没完全跑对”:证书自动续期配好了,但 ARI 把它往后推了一档;主题更新成功了,但留下了 777 权限;数据库在跑,但备份脚本的连接方式还停在旧的默认值上。
自动化替我盯了这台服务器 448 天,大部分时候安安静静。但隔一阵,它就会递给你这样一份清单——每一项都不大,不逐项勾掉,迟早出问题。
就像签证材料一样,拿出来,核对一遍,勾掉。