开端:周日的“午夜凶铃”
本来是一个惬意的周日,直到导师突然发来一条消息:“ssl 没有了吗”
看到这条消息,我心里“咯噔”一下。

背景是这样的: 课题组的网站一直挂在一台“祖传”服务器上。这台机器堪称“电子考古现场”:
历史成分复杂:上面跑着好几届师兄师姐传下来的多个项目,环境错综复杂。
文档全无:没人知道具体的部署架构,哪里配了反代,哪里走了 CDN,全靠猜。
环境失真:Nginx、Apache、OpenLiteSpeed 的配置文件混在一起,充斥着各种硬编码。
工具陌生:使用的是我并不太熟悉的宝塔面板。
前段时间,网站 SSL 证书快过期了,师姐已经去腾讯云后台申请并维护了新的证书。按理说,这事儿应该已经结了。但导师现在的反馈说明——事儿没完,还“诈尸”了。

迷局:明明换了证书,为何还是过期?
我赶紧打开电脑,输入主域名 sedst.org。 果然,大红字警告! 浏览器提示“不安全”。
我点开证书详情一看,眉头紧锁:显示的竟然还是那个两周前就过期的旧证书!
奇怪了:
师姐明明说她已经更新过了。
我也登录到腾讯云后台确认了一下,新的 SSL 证书确实已经签发了,有效期是一年。
我登录宝塔面板检查 Nginx 配置,路径似乎也没问题。
难道是 Nginx 没重启? 我尝试重启 Nginx,甚至强行 Kill 进程重启。 结果: 依然报红。
难道是配置文件写死? 我怀疑是不是 nginx.conf 里有硬编码的旧路径覆盖了宝塔的配置。我又是一通 grep 搜索,把配置文件里里外外翻了一遍,虽然发现了很多乱七八糟的旧配置,但似乎都不是核心原因。
折腾了整整三个小时,我看着屏幕上顽固的“不安全”,心态有点崩。明明新证书就在手边,这服务器怎么就是“吃”不进去呢?
漫长而曲折的排查之路(踩坑现场)
面对这个灵异现象,我开始了一轮又一轮的“内科手术”式排查,但这其实都是弯路。
1. 怀疑 Nginx 配置冲突(内部排查)
第一反应是 Nginx 配置文件写挂了。 通过 grep 搜索,我惊恐地发现服务器里的配置文件乱成了一锅粥:
nginx.conf主文件里被人为硬写了一套server配置(这是大忌)。vhost目录下又有宝塔生成的配置文件。Apache 和 OpenLiteSpeed 的配置文件里也有这个域名的影子。
我怀疑是 Nginx 读取了旧配置,于是我尝试了:
手动修改配置文件路径。
强行
killall nginx重启。甚至写脚本把新证书物理覆盖到旧证书的目录下(狸猫换太子)。
结果: 依然我行我素,报着“证书过期”。

2. 怀疑缓存与混合内容
我又怀疑是不是浏览器缓存了 HSTS 状态,或者是页面里有 HTTP 的图片导致了 Mixed Content。
开启 Nginx
upgrade-insecure-requests。换无痕模式,换手机流量。
结果: 依然无效。
转折:一次无意的点击
就在我对着宝塔面板发呆,准备把 Nginx 卸载重装(下下策)的时候,鬼使神差地,我无意间点击了面板里“网站”列表下的一个测试链接。
宝塔默认生成的这个链接带了 www 前缀,是 www.sedst.org。

神奇的一幕发生了: 网页秒开!而且地址栏里赫然挂着绿色的安全锁! 我赶紧点开证书详情:颁发者 TrustAsia,有效期到4月。 这不就是师姐申请的那张新证书吗?!

我瞬间愣住了,赶紧又手动输入了一下平时习惯用的 sedst.org(不带 www)。 结果:红色不安全,证书过期。
那一刻,由于这个无意的点击,我终于抓住了问题的尾巴:
同一个网站,
www.sedst.org是好的,sedst.org是坏的。 这意味着,这根本不是服务器内部配置的问题,而是流量入口的问题!
真相:消失的“边缘节点”
顺着这个线索,我立马去终端 ping 了一下:
# Ping www (正常,显示新证书)
ping www.sedst.org
> PING www.sedst.org (129.226.xxx.xx): 56 data bytes
# 结果:指向了我们实验室自己的服务器 IP
# Ping 主域名 (异常,显示旧证书)
ping sedst.org
> PING sedst.org.eo.dnse2.com (43.169.xxx.xx): 56 data bytes
# 结果:指向了一个完全陌生的 IP,后缀是 dnse2.com (腾讯云/DNSPod 的转发服务器)
案情彻底还原:
在这套“祖传”架构里,前辈们为了图省事(或者是为了加速),并没有把主域名直接解析到服务器:
www域名:老老实实做了 A 记录 解析到源站。所以师姐更新证书后,源站生效了,www也就好了。主域名:配置了 “URL 转发”(或者 CDN 边缘加速)。流量被劫持到了腾讯云的边缘节点。
关键在于: HTTPS 连接是在边缘节点“终结”的。 师姐虽然申请了新证书,甚至可能在服务器上也部署了。但是,边缘节点(那个大门口的保安)手里拿的还是过期的旧证书! 无论我在源站怎么折腾,边缘节点都“听不到”,它依然忠实地向用户展示那个错误的旧证书。
终局:物归原主
既然找到了原因,解决起来就非常简单了,而且不需要什么骚操作,因为我们用的就是腾讯云的全家桶。
登录腾讯云控制台,边缘安全加速平台。

点击域名管理之后点击HTTPS配置

点击配置找到师姐前几天申请好的那张新证书。
点击 部署
点击确定。
三分钟后,再次访问主域名,红色警告消失!

复盘与教训
这次排错经历,简直是一场“盲人摸象”。如果不是那次误点 www 链接,我可能还在 Nginx 的屎山配置文件里打转。
给接手遗留项目的兄弟们几点建议:
排错格局要大:当出现“部分域名行,部分不行”时,不要只盯着服务器内部(内科),要第一时间检查 DNS 解析 和 Ping IP(外科)。
警惕“中间商”:如果服务器上有 CDN、WAF 或 URL 转发,HTTPS 是在边缘节点终结的。源站更新了证书,不代表边缘节点也更新了。这是初学者最容易掉进的陷阱。
乱点有奇迹:当逻辑走不通时,试着点点那些你平时忽略的链接,说不定 Bug 的入口就在那里。
关于“祖传”项目:没有文档的项目就是一颗雷。虽然我们不敢大改代码,但搞清楚流量是从哪进来的,是维护的第一步。