Nginx 服务器配置支持SignalR (WebSocket)

今天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"; } }
相关文章
相关标签/搜索