阿里云负载不支持 WebSocket 协议与 WSS 和 Nginx 配置问题
WebSocket 是 HTML5 下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:
- WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
- WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。
WebSocket 连接本质上是一个 TCP 连接,比较轮询在数据传输的稳定性和数据传输量的大小方面,具有很大的性能优势。
浏览器请求
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
客户端发起的WebSocket连接报文类似传统HTTP报文,Upgrade:websocket参数值表明这是WebSocket类型请求,Sec-WebSocket-Key是WebSocket客户端发送的一个 base64编码的密文,要求服务端必须返回一个对应加密的Sec-WebSocket-Accept应答,否则客户端会抛出Error during WebSocket handshake错误,并关闭连接。
在请求中的Sec-WebSocket-Key是随机的,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把Sec-WebSocket-Key加上一个魔幻字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11。使用 SHA-1 加密,之后进行 BASE-64编码,将结果作为 Sec-WebSocket-Accept 头的值,返回给客户端;WebSocket 先是通过 HTTP 建立连接, 然后通过 101 状态码, 表示切换协议,在配置里是 Upgrade。
服务器回应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/
Sec-WebSocket-Accept 的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,HTTP/1.1 101 Switching Protocols表示服务端接受WebSocket协议的客户端连接,经过这样的请求-响应处理后,两端的WebSocket连接握手成功, 后续就可以进行TCP通讯了。用户可以查阅WebSocket协议栈了解WebSocket客户端和服务端更详细的交互数据格式。
浏览器兼容性
最新的主流浏览器对WebSocket支持良好:
- Chrome 4+
- Firefox 4+
- Internet Explorer 10+
- Opera 10+
- Safari 5+
我们在阿里云启用全站 HTTPS 后,我们发现阿里云 webscoket 通信报错 400 Bad Request 错误,开始以为是启用HTTPS的问题,后面发现阿里云的负载均衡(LB)根本就不支持 ws 协议(https://help.aliyun.com/document_detail/63421.html?spm=5176.doc63420.6.714.hC3lA2),Google 了一番,决定使用 nginx 代理。
备注:阿里 ws 与 http2 支持情况 https://yq.aliyun.com/articles/277584?spm=5176.10695662.1996646101.searchclickresult.2a8d761c2PJag1
Request URL:wss://singalr.xxx.cn/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=xmpmOB19Q6d7X32GFEP7lTFm7DPSJIcRALZOxbASrpogN5MPTTBafipQsNBs0x5J7wvUm5QI8e1iViqETc9Q8%2FGHCLZo5GhJsXYRWmOzsICh5LDyQDGnAsRSC3GvBMsQ&connectionData=%5B%7B%22name%22%3A%22signalrpushhub%22%7D%5D&tid=9 Request Method:GET Status Code:400 Bad RequestResponse Headers Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:https://xxx.cn Cache-Control:no-cache Connection:keep-alive Content-Type:text/html Date:Wed, 17 May 2017 02:09:56 GMT Expires:-1 Pragma:no-cache Transfer-Encoding:chunked X-AspNet-Version:4.0.30319 X-Content-Type-Options:nosniff X-Powered-By:ASP.NETResponse Headers Accept-Encoding:gzip, deflate, sdch, br Accept-Language:zh-CN,zh;q=0.8 Cache-Control:no-cache Connection:Upgrade Cookie:_pms_session=5d0gqrezzfgvivj2b4oaecy3; acw_tc=AQAAAMvoFF/VeQoAJkNKfD0idg5CQvGL Host:singalr.xxx.cn Origin:https://p2.xxx.cn Pragma:no-cache Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits Sec-WebSocket-Key:V2NZvyJw/CJtAdn68xDZWA== Sec-WebSocket-Version:13 Upgrade:websocket User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36Query String Parameters transport:webSockets clientProtocol:1.5 connectionToken:xmpmOB19Q6d7X32GFEP7lTFm7DPSJIcRALZOxbASrpogN5MPTTBafipQsNBs0x5J7wvUm5QI8e1iViqETc9Q8/GHCLZo5GhJsXYRWmOzsICh5LDyQDGnAsRSC3GvBMsQ connectionData:[{"name":"signalrpushhub"}] tid:9
WebSocket 的 Nginx 配置
开始以为是 HTTPS 443 监听的问题,后面修发现HTTP下ws协议也不可以,咨询了一番,最后发现是阿里云负载均衡不支持 ws 协议的问题。单独把 signalr 的服务端使用 nginx 代理负载 ,其他服务器还是使用阿里云的负载
upstream singalr { server 192.168.1.5;server 192.168.1.4; }server {listen 443 ssl;server_name singalr.com; #charset koi8-r; #access_log logs/host.access.log main;ssl on;ssl_certificate /etc/ssl/private/xxxx.pem;ssl_certificate_key /etc/ssl/private/xxx.key;location / { proxy_pass http://singalr;proxy_redirect off;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";} }
REFER:
http://nginx.org/en/docs/http/websocket.html
https://socket.io/
https://github.com/SignalR/SignalR
https://github.com/aspnet/SignalR
http://blog.mixu.net/2011/08/13/nginx-websockets-ssl-and-socket-io-deployment/
https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-with-redis
http://www.ruanyifeng.com/blog/2017/05/websocket.html
WebSocket 实现原理
http://zeeyang.com/2017/07/02/websocket/
https://www.qcloud.com/document/product/214/4150
https://www.zhihu.com/question/20215561
转载于:https://www.cnblogs.com/Irving/p/6872473.html
阿里云负载不支持 WebSocket 协议与 WSS 和 Nginx 配置问题相关推荐
- 新功能:阿里云负载均衡支持HTTP/2、WSS协议
摘要: 很高兴的告诉大家,阿里云负载均衡在欧洲中部(法兰克福)与亚太东南3(吉隆坡)地域支持HTTP/2.WSS(Web Socket Secure)协议. 1.HTTP/2协议支持 什么是HTTP/ ...
- 阿里云全站加速DCDN全面支持WebSocket协议
WebSocket协议可以为网站和应用提供真正的双向通信,具有控制开销.保持连接状态.更强实时性.更好的压缩效果等优点,是当下低延时应用最常采用的一种技术协议.为了更好的满足客户在实时通讯场景下的加速 ...
- 新功能:阿里云负载均衡SLB支持HTTP访问强制跳转HTTPS
摘要: 很高兴的告诉大家,阿里云负载均衡SLB已经在澳大利亚(悉尼).日本(东京).阿联酋(迪拜).美国 (弗吉尼亚).美国(硅谷).马来西亚(吉隆坡).德国(法兰克福).新加坡.印度尼西亚(雅加达) ...
- 新功能:阿里云负载均衡SLB支持HTTP/HTTPS超时时间自定义功能
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 大家好,很高兴的告诉大家,阿里云负载均衡SLB已经在新加坡.澳大利亚(悉尼).马来西亚(吉隆坡).日本(东京).美国( ...
- 新功能:阿里云负载均衡SLB支持HTTPS虚拟主机功能(SNI)
Greeting 大家好,很高兴告诉大家,阿里云负载均衡SLB支持HTTPS虚拟主机(单VIP多证书功能-SNI),目前已经在所有地域开放,欢迎大家使用.具体内容请大家观看视频. 温馨提醒:视频杀流量 ...
- 【云周刊】第175期:终于来了!重磅发布:阿里云负载均衡SLB率先支持IPv6!
本期头条 终于来了!重磅发布:阿里云负载均衡SLB率先支持IPv6! IPv6的设计初衷是用以解决IPv4地址枯竭问题,同时对IPv4进行大量改进,并最终取代IPv4.然而由于NAT等技术的广泛应用, ...
- 阿里云 负载均衡 HTTP转HTTPS
一.相关文档 1.证书服务 2.简单路由-HTTP 协议变为 HTTPS 协议 二.阿里云操作界面 1.云盾证书服务管理控制台(查询CA证书服务) 2.负载均衡管理控制台 三.相关文档 1.Syman ...
- 产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡
摘要: 负载均衡是一种技术,从字面意义上理解,就是让负载(变得)均衡,负载是什么呢?可以理解为工作量.工作强度.用日常生活中的例子来打比方,一群建筑工人,盖一幢楼房,有搬砖的,有和水泥的,有砌墙的,有 ...
- 阿里云负载均衡(SLB)简介
阿里云负载均衡(SLB)简介 1.SLB的概念 SLB:是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制. 2.概述 1.负载均衡通过设置虚拟服务地址,将添加的同一地域的多台 ...
最新文章
- 终于找到一个还算满意的blog来安家了
- 数据结构之直接插入排序
- DSP unresolved symbol问题的解决
- ASP.NET MVC API 接口验证
- Learn Blockchains by Building One
- 「每天一道面试题」String和StringBuilder、StringBuffer的区别
- 信息安全培训的一些考题和答案
- php将图片导入,php中图片文件的导入,上传与下载
- MATLAB中矩阵与数组的区别,点运算符的运用
- 揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术
- [渝粤教育] 中国地质大学 计算机系统结构(新) 复习题 (2)
- 800多套单片机毕业设计
- 告别码公式的痛苦,公式OCR终于来了!
- 【Java】集合实现学生管理系统
- padStart()和padEnd()方法
- 我的第一篇博客——鸡汤博
- vmsysjack-tupian
- MATLAB并行计算
- 逆水寒2021最新服务器,逆水寒公布2021部分更新计划,写满了离经叛道
- oracle 人民币符号,人民币的符号的正确表示法?一杠?两杠?
热门文章
- Quartz.NET快速入门指南
- 总结:JavaEE完整体系架构
- SQL脚本修改数据库名称
- 集群负载均衡之lvs和keepalived
- android sqlite使用之模糊查询数据库数据的三种方式
- 一个下载游戏封面的站点
- python面试题(5)--- 检测 字符串 是否可以转换成 数字
- 学生管理系统c语言代码实验报告,C语言学生信息管理系统实验报告(含源代码).doc...
- git rm -r --cached_【Git】工作中99%能用到的git命令
- dhh basecamp_使Basecamp的薪酬透明化保留了人才