Nginx 博客配置 Let’s Encrypt SSL 证书及 DNS 踩坑记录

前两天刚把服务器的 80 端口理顺,用 Nginx 做了反向代理,实现了“域名访问博客,IP 访问 OJ”的分流。但是发现我的网站只能用浏览器的无痕模式访问,查了一下大概是普通模式会自动使用https,但是由于没有配置SSL证书,所以无法访问。

去国内某云厂商的控制台看了一眼,好家伙,最基础的单域名 DV 证书现在居然卖到了 500 多块钱一年。果断关闭页面,拥抱开源世界最良心的方案:Let’s Encrypt 免费证书 + Certbot 自动化工具

这里记录一下整个配置过程,以及中间遇到的一个非常经典的“网络灵异”大坑。

1. 极简安装与申请

因为我的服务器是 Ubuntu 系统,Web 服务器是 Nginx,所以直接用 apt 一键安装 Certbot 和它的 Nginx 插件:

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

安装完之后,理论上只需要执行下面这一行命令,Certbot 就会自动帮我验证域名、申请证书、甚至连 Nginx 的配置文件都帮我改好:

sudo certbot --nginx -d duziks.top

本来以为敲下回车就能顺利喝茶了,结果现实狠狠打脸。

2. 踩坑:全世界都不认识我的域名?

终端直接甩给我一段无情的报错: Detail: no valid A records found for duziks.top

大意是发证机构找不到我域名的 A 记录,验证失败。这就见鬼了,我明明在域名控制台配好了指向我服务器 IP 的解析,并且在自己本地的 Windows 电脑上 ping duziks.top,也能准确返回 111.228.45.41

为什么我本地能 Ping 通,Certbot 却说找不到?

排查了一圈,破案了。原因出在 “全球 DNS 同步时间差(DNS Propagation)” 上。

Let’s Encrypt 的发证服务器主要在国外。我刚刚修改了域名解析,国内的宽带运营商同步速度非常快,立刻就认识了这个新 IP。但是跨越国际网络后,国外的 DNS 节点还没有收到这份“更新通知”,在它们眼里,我的域名依然是个空号。

3. 验证与解决

为了印证这个猜想,我打开了全球 DNS 检测工具 dnschecker.org,输入域名一查——果然,除了国内的几个节点,欧美地区的节点全部飘红 ❌。

既然路还没修通,疯狂重试也没用(甚至可能会触发 Let’s Encrypt 的防刷机制被关小黑屋)。

唯一的解决方案就是:等。

去喝了杯水,刷了会儿视频。大概等了半个多小时,再次去 dnschecker 上刷新,看到美国的几个关键节点终于变成了绿色的 ✅。

回到终端,再次执行:

sudo certbot --nginx -d duziks.top

这一次畅通无阻!同意了协议,终端立刻弹出了绿色的 Congratulations! You have successfully enabled HTTPS

4. 意外之喜:一劳永逸的续签

之前一直嫌弃免费证书只有 90 天有效期,每隔三个月就要手动弄一次很麻烦。

这次用 Certbot 发现,它在安装证书的同时,已经默默在 Ubuntu 系统的后台加了一个定时任务(可以通过 systemctl list-timers | grep certbot 查看)。以后每次快过期时,它会在后台自动帮我续签,完全不需要人工干预。

总结

  1. 别买基础版付费证书:个人网站用 Let’s Encrypt 完全足够,底层加密算法和几百块钱的商业 DV 证书一模一样。
  2. 警惕 DNS 缓存延迟:刚改完域名解析,如果申请证书报错,别急着改服务器配置。先用检测工具看看国外节点生效了没,让子弹飞一会儿。