一、问题情况
因为业务需要,使用了一套IIS源机的https的程序,然后需要使用nginx反代后放入其他域名路径使用,写好以后测试curl源机,代理机curl源机一切OK,但是使用nginx反代后出现502,看nginx报错日志提示
1 |
peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream |
二、解决办法
查到一个说明
"(104: Connection reset by peer) while connecting to upstream"的错误解释是upstream发送了RST,将连接重置,然后看别人说是因为服务器时间不同,造成长链接握手失败,于是改了代理回源超时时间和http版本还有关闭ssl长连接回源都不行.
然后看到一个靠谱一点的解释,由于源机启用SNI证书部署(PS:一个IP有多个证书)需要向服务器传递域名信息。也就是需要设置下内容。
1 |
proxy_ssl_server_name on; |
设置了以后依旧报错502,最后只有去IIS源机关闭SNI(IIS里网站绑定里需要服务器名称指示的一个选项,下图所示),单独给回源开了个其他的https端口使用,才不报错.源机是win2016,IIS10的,至于为啥会这样也没搞懂.只是根据网上说的各种办法测试了半天,最后发现只有关闭IIS源机的SNI才可以正常使用https回源.
后面又怀疑是upstream的域名转IP造成SNI不正常,代理机使用了hosts文件写了域名IP指定,然后回源的URL直接写域名源机不开SNI也会出现502错误,暂时没有明白为何会这样.
之后又搜索一了一些错误解答,有了点想法,但是没有实践,就是IIS开启SNI的时候,没有设置默认https站点,造成nginx使用upstream的https回源无法找到对应站点而造成ssl握手失败,关闭SNI和开启SNI设置一个默认https站点应该可以解决这个问题.只是想法,未实践测试.