直接用curl模拟Nginx上游行为最有效:用-k跳过证书验证,--resolve指定IP和SNI,如curl -k --resolve 'example.com:443:10.0.1.5' https://example.com:443/health,可快速复现TLS握手、证书过期或DNS解析等问题。

直接用 curl 模拟 Nginx 上游行为是最有效的方式,而不是等页面报 502 才排查。
用 curl 模拟 Nginx 的上游 TLS 请求
Nginx 在 proxy_pass 到 https 后端时,会以客户端身份发起 TLS 连接。你可以用 curl 命令复现这个过程,关键是要匹配 Nginx 的行为逻辑:
- 使用
-k(即--insecure)跳过证书验证,对应proxy_ssl_verify off - 显式指定 SNI 名称,对应
proxy_ssl_name和proxy_ssl_server_name on,例如:curl -k --resolve 'example.com:443:10.0.1.5' https://example.com:443/health - 若后端证书 SAN 是 IP 地址(如
IP:10.0.1.5),则用 IP 直连并加-k:curl -k https://10.0.1.5:8443/health - 观察是否返回 HTTP 状态码(如 200)、是否有 TLS 握手失败(
SSL connect error)或证书过期提示
检查 Nginx 自身能否解析并抵达后端地址
确保网络层和 DNS 层没有阻断:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 在 Nginx 服务器上执行
ping 10.0.1.5或telnet 10.0.1.5 8443(或nc -zv 10.0.1.5 8443),确认 TCP 可达 - 若
proxy_pass使用域名(如https://backend.internal),运行getent hosts backend.internal或nslookup backend.internal验证解析结果 - 注意:Nginx 不走系统代理,也不读取
/etc/hosts以外的本地 DNS 缓存,需确保其运行环境能直连
启用 Nginx debug 日志快速定位失败环节
临时开启详细 SSL 日志,比反复 reload 配置更高效:
- 在
nginx.conf的events或http块中添加:error_log /var/log/nginx/debug.log debug; - 重载配置:
nginx -s reload - 触发一次请求,查看日志中是否出现类似以下线索:
SSL_do_handshake() failed → TLS 握手失败(协议/密码套件不兼容)
certificate has expired → 证书过期(即使proxy_ssl_verify off也可能在握手阶段被拒)
no suitable protocol →proxy_ssl_protocols设置太严格
验证 proxy_pass 协议与指令作用域是否匹配
常见低级但致命的错误:
-
proxy_pass http://backend;→ 不会触发任何proxy_ssl_*指令,必须是https:// -
proxy_ssl_verify off写在server块而非location或upstream块 → 不生效(该指令只在 location/upstream 中起作用) - 多个
location共享同一 upstream,但只有部分 location 设置了proxy_ssl_verify off→ 未设置的 location 仍会校验

















