kita / notes

约 2 分钟

HTTP 通、HTTPS 超时,问题不在 nginx

同一台服务器、同一个 nginx,把 http 换成 https,就是一个活一个死。

  • http://我的域名 —— 秒开
  • https://我的域名 —— 超时

网站上线那天就撞上这个。

我先在服务器上看服务在不在:

systemctl is-active kita-blog nginx     # active / active
ss -lnt | grep -E ':80 |:443 '
# LISTEN 0.0.0.0:443
# LISTEN 0.0.0.0:80

都在听。然后我在服务器自己身上请求自己的 443:

curl -k -o /dev/null -w 'code=%{http_code}\n' https://127.0.0.1/ -H 'Host: 我的域名'
# code=200

200。证书、443 那段 nginx 配置、反代,全都是好的。

这两步做完其实已经能得出一个结论了:服务端没问题,问题在"外网的包到不了服务器"。 范围一下就缩到网络入口那一层。

我又换了一台机器测(这一步不能省,在服务器自己身上自测会绕过所有网络链路):

入口 结果
http://域名/ 200,0.2 秒
http://IP/ 200,0.16 秒
https://域名/ 超时
https://IP/ 超时

80 通、443 全堵。到这里基本就是安全组的事了。

我盯着规则列表看了半天,觉得它明明开着

去腾讯云控制台打开安全组,规则里躺着一条 443,看着一切正常。

问题在于:云端防火墙里 IPv4 和 IPv6 是各自独立的规则。

IPv4 的规则,来源要写 0.0.0.0/0;IPv6 的规则,来源写 ::/0。它们是两条完全不相干的东西。

我这边的情况是——IPv6 的 443 默认放开了,IPv4 的 443 没放。所以规则列表里那条 443 管的是 IPv6,而我走的是 IPv4。

补一条入站规则就好:协议 TCP、端口 443、来源 0.0.0.0/0。

加完立刻生效。不用重启 nginx,不用等生效时间,什么都不用改。

这个坑还坑了别人

办备案的时候,工作人员反复跟我说"你的网站打不开"。我一直以为是他那边操作有问题,还暗暗觉得他不专业。

现在回头看,他没搞错。他那边的网络多半是纯 IPv4 的,撞的就是这堵墙。同一条规则,在我这儿表现成"https 打不开、http 能用",在他那儿可能就是"整个网站都打不开"。

同一件事,两个人看到的现象不一样,然后互相觉得对方在胡说。

顺手记两个发现

一个是速度。我从远端测 HTTPS 要一两秒,一度以为站点做得慢。在服务器本机实测:nginx 处理 HTTP 是 5–7ms,HTTPS 10–13ms(其中 TLS 握手 5ms),直连 Node 4–6ms。慢的是远端到我这里的网络路径,跟服务器没关系。服务器快不快,要在服务器自己身上量。

另一个是备案。核验期间 80 端口要能直接访问,别顺手配个 HTTP 强制跳转 HTTPS。我这次是刻意让 80 直出的,不然备案那边就是自己给自己找麻烦。

← 回到全部笔记