配置文件里 ssl_certificate 都写好了,nginx -t 也通过,浏览器访问 https 直接连接被拒绝,curl 报 Connection refused。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

ss -lntp | grep ':443'
# 没有输出说明没监听
nginx -T | grep -n 'listen 443'

server 块里只写了 listen 80,或者 listen 443 后面漏了 ssl 参数,端口根本没进监听列表。配置语法没错,nginx 不会报错。这一点先确认清楚,后面就不用反复试。

碰到「443 未监听」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,用 ss -lntp 看 443 在不在监听列表里,先分清是没监听还是被防火墙拦了;回到 server 块把 listen 443 ssl 补齐,缺 ssl 参数时端口会按明文处理;reload 之后再用 curl -I 请求一次,看返回头对不对。

改完照着核一遍,ss 输出里出现 443,curl 返回 200 或 301,不再是连接被拒。

作者 9823189