问题背景
某日,部门同事反馈多个网站域名访问失败,浏览器报错“此网站无法提供安全连接”,错误码为ERR_SSL_PROTOCOL_ERROR。
作为运维人员,第一反应是 HTTPS 证书可能存在问题,比如过期或加载失败。环境使用的是 APISIX+ETCD部署的代理,且上一任维护者未留下任何维护文档,这让问题的排查变得更加复杂。
初步检查:证书过期的可能性排除
登录 APISIX 的 Dashboard管理界面,发现证书的过期时间为2025年,可以排除证书过期的可能性。但浏览器依然报错,提示无法建立安全连接。
为了进一步确认证书问题,直接通过 ETCD 查询证书的 Key 值:
etcdctl get / --prefix --keys-only | grep -i ssl
/apisix-user/ssl/
/apisix-user/ssls/585922421492811006
/apisix/ssl/
通过 etcdctl get /apisix-user/ssls/585922421492811006
查看证书内容,与 Dashboard 上的证书完全一致。这表明 ETCD 数据没有问题,但问题依然没有找到。
深入分析:查看 APISIX 日志
通过查看 APISIX 的日志,发现以下报错信息
2024/12/13 06:04:00 [error] 21399#21399: *223993 [lua]
radixtree_sni.lua:145: match_and_set(): failed to find any
SSL certificate by SNI: test2.hello.cn,
context: ssl_certificate_by_lua*,
client: 120.183.123.80, server: 0.0.0.0:443
这提示 APISIX 在通过 SNI 加载 SSL 证书时,未能找到对应的证书。
此时我突发奇想,在dashboard界面删除证书,重新上传
提交后,域名既然可以正常访问了,奇怪的是刚开心不到几秒,再次出现“此网站无法提供安全连接”现象,真让人崩溃
查看apisix服务状态,发现服务既然重启过,这是一个异常点,怀疑可能是 APISIX 服务不断重启导致加载失败。
于是检查系统定时任务:
[root@etcd-apixi ~]# crontab -l
* * * * * /opt/apisix-cleandisk.sh
此定时任务在每分钟运行一次
问题发现:定时任务引发服务中断
查看脚本内容:
#!/bin/bash
threshold=50
usage=$(df -h /| awk 'NR==2{print $5}'| cut -d'%'-f1)
if["$usage"-gt "$threshold"];then
echo "Disk usage is above $threshold%. Cleaning up logs..."
sudo systemctl stop apisix
sudo rm -f /usr/log/apisix/logs/*
sudo systemctl start apisix
echo "Log cleanup complete."
else
echo "Disk usage is below $threshold%. No cleanup needed."
fi
这个脚本每分钟检查磁盘使用率是否超过 50%,若超过,则停止 APISIX 服务以清理日志文件,再重启服务。
[root@etcd-apisix logs]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 425M 3.5G 11% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda1 100G 51G 50G 51% /
tmpfs 783M 0 783M 0% /run/user/0
检查磁盘空间为51%,符合清理条件,定时任务的执行频率为 每分钟一次,即便磁盘使用率低于阈值,APISIX 的日志清理逻辑也会被频繁触发apisix重启。
APISIX 需要一定时间完成启动过程,包括证书和路由的加载。频繁重启会造成启动尚未完成,新的重启操作已开始,此时访问就会出现失败。
注释定时任务后,问题果然解决,此次问题排查并没有深入的理论知识,很多运维问题没有头绪时,要留意定位过程中的异常现象。