体育站群SSL证书批量申请与部署:实操流程和踩坑经验分享
但凡手里管着几十个体育类域名的站长,心里都有数:HTTPS改造这事,单个站搞起来不难,一上批量就头疼。体育站群通常是主域名带一帮子站,栏目域名、二级域名、备用跳转域名全算上,轻松破百。挨个申请证书、挨个上传、挨个配Nginx,续期的时候更是要命。今天我就围绕体育站群批量申请SSL证书,把自己踩过坑、也跑通过的那套流程完整捋一遍,给同样折腾站群的朋友做个参考。

一、证书类型怎么定:泛域名还是多域名
体育站群的域名结构通常比较规整,主域名底下挂team1.xxx.com这种二级域名,或者按赛事、按地区拆成独立域名。这种结构用泛域名证书(Wildcard)最省心,一张证书管住*.xxx.com,后面新增子站也不用重新申请。但泛域名只覆盖一级,碰上a.b.xxx.com这种二级子域,就得另想办法。
多域名证书(SAN)则适合域名分散在不同主域下的站群,一张证书能塞进去几十个域名,代价是每加一个域名都得重新签发,后期维护不如泛域名灵活。我自己的做法是混着用:主域和常用二级域走泛域名,零散的独立域名用多域名证书补上。体育站群还有个特殊情况,部分赛事专题页会临时启用新域名做活动落地,这类域名最好提前纳入证书规划,不然活动上线当天才发现证书没覆盖,临时申请DV证书虽然快,但节奏容易被打乱。
二、批量申请的技术路线
证书类型敲定后,就该考虑申请方式了。手动去CA后台一个个填域名显然不现实,站群场景基本都走ACME协议自动化。我用的是acme.sh,搭配DNS-01验证方式,原因挺实际:体育站群很多域名解析放在Cloudflare或DNSPod上,DNS验证不依赖服务器80端口,批量跑起来不会互相干扰。
操作上,先把所有需要证书的域名整理成清单文件,一行一个,泛域名写成*.xxx.com的形式。接着写个循环脚本调用acme.sh的issue命令,DNS API的密钥提前配好环境变量。这里有个实操细节:acme.sh默认对同一主域的泛域名和裸域是分开签发的,建议签发时把xxx.com和*.xxx.com写进同一张证书,减少证书数量,后续部署也方便。批量跑的时候注意控制并发,CA对同一账户的请求频率有阈值,几十个域名分两三批跑完更稳当。
站群规模要是到了几百个域名,单机acme.sh跑起来会慢,可以考虑把签发任务拆到多台机器,或者用lego这类支持并发的工具。证书私钥统一存放在一台管理机上,通过配置管理工具分发到各业务服务器,避免私钥散落在几十台机器上不好审计。
三、部署与Nginx配置
证书签下来只是开了个头,部署才是体力活。体育站群的Web层基本是Nginx,我的做法是每台服务器上跑一个同步脚本,从管理机拉取最新的证书文件,然后nginx -t校验通过再reload。别直接覆盖正在使用的证书文件再reload,中间有极短的时间窗口可能读到不完整的文件,稳妥做法是先写临时文件再原子替换。
Nginx配置上,站群建议抽一个公共的SSL配置文件,用include引入,各站点vhost只改server_name和证书路径。TLS版本锁定1.2和1.3,加密套件按Mozilla的中间兼容配置来,体育站群访问来源杂,老设备不少,套件太激进会丢流量。HSTS头建议先不开或者开短max-age,等所有子域都确认HTTPS可用再逐步加长,站群里只要有一个子域没配好证书,HSTS就会把用户挡在门外。
四、续期与监控不能省
Let's Encrypt证书有效期90天,批量站群靠人记续期迟早出事。acme.sh自带cron续期任务,但续期成功不等于部署成功,我额外加了一层监控:每天定时检查各站点证书的剩余天数,低于20天就在告警群里推消息。检查脚本直接用openssl拉取线上证书的notAfter字段,比看本地文件靠谱,能发现部署环节断掉的情况。
另外提醒一点,体育站群如果用了CDN,证书要在CDN侧也同步更新,源站证书换了CDN没换,用户看到的还是旧证书。Cloudflare这类支持自定义证书的平台,可以把acme.sh签发的证书通过API推上去,写进同一套自动化流程里。
五、体育站群特有的几个注意点
体育类内容站群在国内运营,域名备案是绕不开的,HTTPS改造前先确认域名备案状态,未备案域名走国内CDN或服务器会被拦,证书配了也白配。赛事直播类子站如果用到第三方播放器,确认播放器支持HTTPS混合内容加载,不然页面挂锁但播放器报错,体验很糟。还有一类是体育数据接口,部分老接口只支持HTTP,站群全站HTTPS后要检查接口调用是否被浏览器拦截,该升级的升级,该走服务端转发的走服务端转发。
整套流程跑顺之后,新增一个体育子站从申请证书到上线HTTPS,脚本化操作十分钟内能完成,续期和监控全自动,人只需要处理告警。站群运维的价值就在这儿,把重复动作沉淀成流程,剩下的精力留给内容和流量。