我有一个服务器A,它使用nodejs在HTTP端口N上为单个网页应用程序提供服务,该服务器使用websocket上接收的数据更新内容。这可以完美地工作。 现在,我有一个具有IIS 8的服务器B,它能够使用受信任的证书通过https服务页面,因此我想将其用于服务器A的反向代理,键入https://appnameA.serverB.com并提供http://A_IP:N
对于W2k12R2服务器上的IIS,我遵循this giude,因此我安装了url-rewrite module和ARR module,然后通过角色功能安装程序启用了websocket支持。按照链接中的建议配置IIS之后,将显示静态内容,websocket连接将升级,但会立即关闭。 在服务器端,nodejs后端记录连接的开始,但不记录断开连接!如果使用直接链接A_IP:N,则可以在服务器上看到连接日志,并且在关闭页面时,可以看到断开连接日志。 因此,正如标题所述,反向代理似乎由于某种原因而关闭了与浏览器的连接,从而使与服务器的连接保持活动状态。
看看chrome开发工具,这两种情况几乎没有区别。 在可行的情况下,如果我从服务器B输入浏览器http://A_IP:N,则升级如下:
GENERAL
Request URL: ws://<A_IP>:11235/
Request Method: GET
Status Code: 101 Switching Protocols
RESPONSE HEADERS
Connection: Upgrade
Sec-WebSocket-Accept: KpLZQNv0oX+acLvhjf8E4NbPdo=
Sec-WebSocket-Extensions: permessage-deflate
Upgrade: websocket
REQUEST HEADERS
Accept-Encoding: gzip, deflate
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: Upgrade
Cookie: connect.sid=s%3AKRr8alqa3K0aWvT3fwOnCruKO4OLFZA.4YZlC9wRVPQuXkBhcRr6aP7CFRq3onoPPF7zVGZ5r0
Host: <A_IP>:11235
Origin: http://<A_IP>:11235
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: SEwb/3GX5E5MJwvOibAmg==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
如果在我的开发PC上键入https://appnameA.serverB.com,则升级为:
GENERAL
Request URL: wss://appnameA.serverB.com/
Request Method: GET
Status Code: 101 Switching Protocols
RESPONSE HEADERS
Connection: Upgrade
Date: Wed, 17 Jul 2019 06:59:48 GMT
Sec-WebSocket-Accept: BFR3L5JSoY4JPLgkqnR6bJXilA=
Sec-WebSocket-Extensions: permessage-deflate
Upgrade: Websocket
X-Powered-By: ARR/3.0
X-Powered-By: ASP.NET
REQUEST HEADERS
Accept-Encoding: gzip, deflate, br
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: Upgrade
Cookie: PHPSESSID=c7o9dri5sglhpbt25gk4k1565; connect.sid=s%3AWO4aXujnL6_toO2uYrx1y0va1SBBhjr.HDirA9fGaFMwAxmrnHK%2Brs8fF33hUM5k6xYDtBFy9s
Host: appnameA.serverB.com
Origin: https://appnameA.serverB.com
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: 1g+o83Rm8ApUFkclJvuMA==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
代理通信的响应标头中有两个X-Powered-By项目,以及“升级:Websocket,大写W”。
在浏览器中,我收到了连接事件(可以在服务器日志上进行匹配)。在open事件中,我向服务器发送了一条消息,但是没有到达,也没有在客户端上引发错误,并且在onopen事件之后立即触发了onclose,我在服务器上看不到。
有什么建议吗? 我认为问题出在IIS配置中,但我对此没有经验。 在这种情况下,是否有办法了解开启的动机?就像错误/动机代码(同样如果onerror事件没有触发,因为它没有触发)也可以帮助您理解。.
编辑:
我尝试安装Nginx并使用受信任的证书在其他端口上运行:5分钟的配置,就可以了! 声明IIS必须运行并提供其他服务,我认为让所有人在一起的更好的解决方案是将Nginx放在首位,将同一个服务器上的IIS反向代理到旧服务,然后将我的Websocket反向代理到A_IP:N
无论如何,东西越少,它的破裂就越少..因此,如果您仍然有一些使IIS在不使用nginx的情况下工作的提示,那会更好。