问题点:
最近在做一个在线客服系统,已经基本上完成了,所以想着部署到测试上进行测试一番,结果刚部署上去就碰到了“妖娥子”,打开地址,点击上线按钮,没有反应,F12监控看了一下,发现报错,错误信息如下:
SignalR地址直接报错404
然后看后端服务器报错信息,好像并没有发现什么错误,因为本地没有问题,所以就想到了服务器上nginx是不是拦截了,因为Nginx做代理的时候,默认配置不支持WebSocket。而Signalr本质就是WebSocket,所以问题点就找到了。
解决方案:
1.需要修改代理设置,需要改代理请求头的设置,增加如下几行代码
#启用http长连接支持websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
2.属性含义:
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的,即连接请求完毕后就关闭。
3.最后重启Nginx,就可以发现 signalr 可以使用了, 但是细心的我又发现 webapi接口无法请求了,因次我们还是怀疑nignx配置问题,因为没有修改前webapi是可以得,
原因就在于我们刚刚配置了Nginx代理时使用长连接,但是我们webapi其他接口都是短连接的。所以我们要将signal的连接代理和webapi其他接口的代理分开。
如果SignalR和api业务服务器本来就是相互独立那么就不会存在这个情况。
4.最终的方案是这样的:
server {
listen 80;
server_name signlar.51softwarebox.com;
#webapi 代理
location / {
proxy_pass http://127.0.0.1:8084;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#signalr 代理
location /signalr {
proxy_pass http://127.0.0.1:8084;
proxy_set_header Host $host;
#启用http长连接支持websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
5.感谢您的阅读,最后附上项目连接: http://signlar.51softwarebox.com/home/chat2 ,欢迎各位老铁的关注