当你的Nginx服务器作为反向代理,将client的请求转发到一个SSL服务器时,需要在HTTP请求头中包含SSL服务器的名称,这样SSL服务器才能正确地响应该请求 。proxy_ssl_name指令就是设置proxy_pass指令所代理的SSL服务器的名称,即www.example.com 。这样,在转发请求时,nginx就会在请求头中添加"Host: www.example.com"的参数,保证请
文章插图
一、现象在使用nginx反向代理后端服务器的时候,因为配置的是域名,导致HTTPS 请求转发失败,报 SSL 错误,js 报 502
文章插图
文章插图
二、排查过程1、查看nginx日志,发现报502,但是本地curl upstream中的后端域名是可以正常通的 。
文章插图
2、查看后端服务器上,没有收到请求,说明请求没过去,继续排查nginx本身的配置问题,Nginx 渲染模版已支持 HTTPS,尝试略过 upstream 配置,直接在 conf 文件中渲染 https://域名,请求仍然失败 。
3、然后换个思路,修改成内网ip不走域名,发现是正常,那换个域名试试 。
文章插图
【Nginx反向代理Https域名时,请求报错502问题排查】
文章插图
然后怀疑客户的域名有问题?但是这域名是可以访问的,上面第一步已经测试过了 。
4、这个时候只能翻一下错误日志,看看有什么有用的提示 。
文章插图
可以看到nginx错误日志里面有一串看不懂的报错提示和我们访问情况,nginx把域名解析成了一个ip地址,当我试着直接通过ip去访问时,果然报错了 。
只能通过域名去访问,让我想起来了nginx同端口不同域名及禁用未绑定域名访问的配置,确实可以实现,这是https的SNI问题,大家可以自行查阅资料 。
https://www.realks.com/2021/03/07/nginx-proxy-ssl-server-name/ https://freexyz.cn/server/98212.html 。
三、解决方案为解决这个问题,nginx官方给出了一个参数配置 。
文章插图
然后我不使用 upstream了,而直接在 conf 文件中使用 https://域名 并且加上配置 proxy_ssl_server name_on 。
文章插图
但是我如果还是想用upstream来负载均衡,有没有办法呢?一顿操作,发现可以像下面这样配置,也是可以正常访问的 。
location ^~ /modules/abm/ {proxy_ssl_server_name on;proxy_ssl_name 域名;proxy_set_header Host 域名;proxy_pass https://abtest_management_api_backend/modules/abm/;proxy_read_timeout 1800s;proxy_set_header Origanization-Id qiancheng;proxy_set_header X-Real-IP $clientRealIp;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass_headerX-Accel-Buffering;}upstream abtest_management_api_backend {server 域名:443;}
问题解决,搞定!!四、原因分析仔细查看nginx error日志日志如下:
2023/07/07 00:03:56 [error] 29533#29533: *115403747 SSL_do_handshake() fAIled (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 192.168.73.157, server: localhost, request: "HEAD /modules/abm/_sendata_ab_testing/nm_rc-virtual-list-_c6c90.73efda43.js HTTP/1.1", upstream: "https://114.80.1xxx1:443/modules/abm/_sendata_ab_testing/nm_rc-virtual-list-_c6c90.73efda43.js", host: "sc.xxx.com"
报错分析:在本地环境直接请求域名正常;但使用了nginx反向代理,在请求时DNS域名进行解析,真正请求出去的为IP与端口,但对方系统是多个域名对应一个公网ip,这个一个公网IP下映射到了多个项目和服务,通过nginx的server_name进行区分,故直接请求不通 。所以能成功请求方式有两种:
1、直接域名请求 。
2、IP端口请求,但请求时需添加host 。
即在nginx配置项中增加 。
proxy_ssl_server_name on 。
或者设置请求头 。
proxy_ssl_server_name on 。
proxy_ssl_name 域名 。
proxy_set_header Host 域名 。
(当你的nginx服务器作为反向代理,将client的请求转发到一个SSL服务器时,需要在HTTP请求头中包含SSL服务器的名称,这样SSL服务器才能正确地响应该请求 。proxy_ssl_name指令就是设置proxy_pass指令所代理的SSL服务器的名称,即www.example.com 。这样,在转发请求时,nginx就会在请求头中添加"Host: www.example.com"的参数,保证请求被正确地路由到目标SSL服务器 。)
推荐阅读
- 秦岚的反向多巴胺穿搭,有点东西!
- 网页游戏代理平台 网页游戏代理
- 代理服务器 代理服务器什么意思
- 如何使用代理服务器发邮件 如何使用代理服务器
- 2023《好声音》五大导师正式出炉,新增“反向转椅”玩法,挺新鲜
- 怎么使用代理服务器登录
- 4000名科学家回国!微软却要反向招聘,外媒:风向突变了
- 如何用代理服务器浏览网页
- easyconnect设置代理
- 金士泰内存武汉代理是哪家 金士泰内存