WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis
Posted
技术标签:
【中文标题】WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis【英文标题】:Socket.io Error during WebSocket handshake: Unexpected response code: 500 windows server iis 【发布时间】:2020-03-28 22:07:42 【问题描述】:我有一个运行 Windows 服务器的 EC2 实例。在 windows 服务器上,我安装了 IIS。这会处理提供 http 请求。
我使用https://github.com/win-acme/win-acme 来生成证书。然后我使用 IIS 管理器使用默认站点添加它。
然后我在https://tecadmin.net/set-up-reverse-proxy-using-iis/之后设置了一个反向代理
完成所有这些设置后,我终于在端口:4000 上启动了我的 node.js 服务器。此端口被代理到:80。
我向服务器发出 HTTP 请求并遇到两个我不理解的主要问题。
一个是使用https://socket.io/ 在我的node.js 服务器中设置的Websockets 显示failed: Error during WebSocket handshake: Unexpected response code: 500
第二个主要问题是我的请求进行了一些处理,需要一两分钟才能完成。中途就失败了。我不确定这是为什么。
在设置 HTTPS 之前,它是通过我的 MAC 上的 localhost 工作的。 HTTPS 不允许通过 HTTP 发出请求。所以这就是为什么我必须在我的 Windows 服务器上设置 HTTPS。自从我设置 HTTPS 以来,我一直遇到这个问题。所以我很确定这与我上面描述的设置有关。
任何见解都会令人惊叹!
【问题讨论】:
我尝试在 Windows 机器上本地运行它,它运行良好。这只是在 HTTPS 上服务时出现的问题 套接字连接正常。虽然没有数据发送到客户端 您能分享一下您的 web.config 文件吗?你的应用目标框架是什么? 【参考方案1】:请确保您在 IIS 上安装并启用了 URL 重写和 ARR(应用程序请求路由缓存)模块。
对于这个例子,假设您的主要网站在 example.com 域下工作(https 和 http - 我通常使用 Letsencrypt 获取 HTTPS 证书)。我假设带有 socket.io 的节点在同一台服务器上(因此我使用下面的 127.0.0.1 地址)和端口 4000。
您不需要在节点上安装 SSL 证书,因为 IIS 会为您加密通信。
现在是配置 URL 重写模块的时候了(针对整个 IIS 服务器,而不是您的站点)。
如果你想让 websockets 也能在 http(ws) 和 https(wss) 上工作,你需要创建一个 rewritemap。我通常将其创建为“MapProtocol”。
你需要 4 条记录:
http -> http
https -> http
ws -> ws
wss -> ws
然后创建 URL Inbound Rewrite 规则
图案:
^socket\.io/([\s\S]*)
条件: HTTP_HOST 匹配模式 example.com CACHE_URL 匹配模式 ^(.+)://
服务器变量:
HTTP_Sec_WebSocket_Extensions -> none
Check 'replace the current value'
动作:重写
MapProtocol:C:1://127.0.0.1:4000/R:0
Check 'append the query string' and 'stop processing of subsequent rules'
就是这样。 您现在可以通过访问以下内容检查规则是否有效: http://example.com/socket.io/socket.io.js
或
https://example.com/socket.io/socket.io.js 如果您在您的网站上正确配置了 ssl 证书。
【讨论】:
以上是关于WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis的主要内容,如果未能解决你的问题,请参考以下文章
AWS EB:WebSocket 握手期间出错:意外响应代码:400