现象
站点走 Cloudflare 代理,HTTP 能访问,HTTPS 一直返回 521 Web Server Is Down。第一反应是防火墙没放行 443,但检查后发现系统 firewalld 是 inactive,云厂商安全组也已经放行了 443。
排查过程
从外部探测端口:
timeout 8 bash -c "echo > /dev/tcp/1.2.3.4/443" && echo OPEN || echo TIMEOUT
结果是 TIMEOUT。但到服务器上执行 ss -lntp | grep 443,什么都没有。
关键点在这里:防火墙拦截通常表现为「连接被拒绝」或超时,而端口没有进程监听,在某些网络环境下同样会超时。两者从外部看起来几乎一样,但根因完全不同。
根因
Nginx 配置里只有 80 端口的 server 块,压根没有 listen 443 ssl。Nginx 不会为空想的端口开监听——没配置就不监听,端口自然是关闭状态。
所以「防火墙已放行 443」这句话,在有服务监听之前毫无意义。
正确顺序
- 先配好 443 的 server 块和证书,让 Nginx 真的监听
- 再确认云厂商安全组放行 443 入站
- 最后验证外部可访问
顺序搞反的话,会花大量时间在错误的方向上排查。
记忆点
521 是 Cloudflare 说「我连不上你的源站」,原因可能是:端口没监听、证书无效、源站 IP 错了、源站服务挂了。别一上来就怪防火墙。
评论