Nginx代理HTTP转HTTPS报ssl3_get_record:wrong version number错误如何解决
问题根因
你遇到的SSL握手错误核心原因是upstream配置未指定上游HTTPS服务的端口,Nginx默认会使用80端口对接上游,而你用proxy_pass https://stage指定了用HTTPS协议请求上游,相当于用HTTPS协议访问上游的HTTP 80端口,握手自然失败,错误日志里的upstream: "https://IP:80/"也明确验证了这一点。
修复方案
- 修正upstream配置,添加上游HTTPS服务对应的443端口:
upstream stage { server example.com:443; }
- 若上游HTTPS服务使用自签名证书,需要在location块中补充SSL相关配置(使用CA机构签发的可信证书可跳过此步):
# 关闭 upstream 证书校验,生产环境建议配置proxy_ssl_trusted_certificate指定可信证书路径替代 proxy_ssl_verify off; # 开启SNI支持,适配上游多域名虚拟主机场景 proxy_ssl_server_name on; # 指定SSL握手时使用的域名,和上游服务证书绑定的域名保持一致 proxy_ssl_name example.com;
- 完整修正后的配置参考:
upstream stage { server example.com:443; } server { server_name IP; listen 80; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header protocol Token; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; # 自签名证书补充以下三行,可信证书可省略 proxy_ssl_verify off; proxy_ssl_server_name on; proxy_ssl_name example.com; proxy_pass https://stage; } }
配置生效步骤
执行nginx -t校验配置语法是否合法,返回success后执行nginx -s reload重载Nginx配置即可生效。
内容的提问来源于stack exchange,提问作者Drew Dru
相关产品推荐
相关产品推荐

