今天SignalR部署在测试环境服务器前端出现没法链接,前端报错以下:前端
failed: Error during WebSocket handshake: Unexpected response code: 200nginx
Failed to start the transport 'WebSockets': nullweb
SignalR地址直接报错404后端
而后查看服务器端是否有什么问题,服务器端也有报错以下api
Microsoft.AspNetCore.SignalR.HubConnectionContext - Failed connection handshake.服务器
看前端报错看像是WebSocket问题,由于SignalR本质仍是经过WebSocket来实现通讯的,根据错误像是服务器不支持WebSocket,咱们是使用的Nginx作代理的时候默认配置不支持WebSocket。须要修改代理设置,须要改代理请求头的设置。websocket
主要修改以下,在location节点下面新增。session
文末有完整的nginx配置实例可复制。socket
proxy_http_version 1.1 测试
指定使用http版本,由于只有http1.1才支持长链接。
proxy_set_header Upgrade $http_upgrade
将客户端http请求头Upgrade 透传过来
roxy_set_header Connection “upgrade”
upgrade意思是告诉服务器使用最高版本协议进行通讯。
默认roxy_set_header Connection这里若是不写的话,在htt1.0中Connection 默认是close的,即链接请求完毕后就关闭。
以上归根到底都是基于http头进行设置修改,若是咱们本身自己对http头有更多了解,仍是有很大帮助的。
按照这个修改,而后重启Nginx。nginx –s reload。
再看前端signal发现链接成功
可是这个时候其余webapi接口没法请求了,swagger能够打开可是接口没法请求了报400
这个时候也想到了应该是Nginx问题,毕竟再没有修改Nginx的时候其余接口是可使用的。固然若是SignalR和api业务服务器原本就是相互独立那么就不会存在这个状况,个人SignalR和业务服务接口都是在一块儿的。
缘由就在于咱们刚刚配置了Nginx代理时使用长链接,可是咱们webapi其余接口都是短链接的。因此咱们要将signal的链接代理和webapi其余接口的代理分开。
最后的设置以下
location 就是Nginx的路由匹配,这样添加后当咱们请求url域名后面是SignalR则使用长链接进行代理转发了。location一般咱们还回用于静态文件的代理,这样静态文件直接经过nginx就能返回到前端了。不须要请求到后端服务器。
本次完整的nginx配置以下
server{ listen 80; listen 443 ssl; #域名 server_name t-aabb.com; #https配置证书和ssl ssl_certificate cert/_.aabb.com.crt; ssl_certificate_key cert/_.aabb.com.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; client_max_body_size 100m; #后端服务代理 location / { proxy_pass http://192.168.0.28:8080; proxy_set_header Host $http_host; } #Signal代理 location /SignalR { proxy_pass http://192.168.0.28:8080; #启用http长链接支持websocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }