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 直出的,不然备案那边就是自己给自己找麻烦。