大家好,我是小姜。
前一篇文章讲了一下什么是WebSocket协定,这里在回忆一下,并且聊一聊如何用nginx来代理WebSocket。
WebSocket是HTML5下一种新的协定。它成功了阅读器与主机全双工通讯,能更好的节俭主机资源和带宽并到达实时通讯的目标。它与HTTP一样经过已建设的TCP衔接来传输数据,但是它和HTTP最大不同是:
WebSocket协定相比拟于HTTP协定成功握手后可以屡次启动通讯,直到衔接被封锁。但是WebSocket中的握手和HTTP中的握手兼容,它经常使用HTTP中的Upgrade协定头将衔接从HTTP更新到WebSocket。这使得WebSocket程序可以更容易的经常使用现已存在的基础设备。大局部如今的阅读器都支持WebSocket。
在实践的消费环境中,要求多个WebSocket主机必定具备高性能和高可用,那么WebSocket协定就要求一个负载平衡层,Nginx从「1.3」版本开局支持WebSocket,其可以作为一个反向代理和为WebSocket程序做负载平衡。
WebSocket协定与HTTP协定不同,但WebSocket握手与HTTP兼容,经常使用HTTP更新工具将衔接从HTTP更新到WebSocket。这准许WebSocket运行程序更容易地顺应现有的基础架构。例如,WebSocket运行程序可以经常使用规范HTTP端口80和443,从而准许经常使用现有的防火墙规则。
「WebSocket运行程序可以在客户端和主机之间坚持长时期运转的衔接」,从而有助于开发实时运行程序。用于将衔接从HTTP更新到WebSocket的HTTP更新机制经常使用Upgrade和Connection头。反向代理主机在支持WebSocket时面临一些应战。一个是WebSocket是一个逐跳协定,因此当代理主机阻拦客户端的更新恳求时,要求向后端主机发送自己的更新恳求,包含相应的头文件。此外,由于WebSocket衔接常年存在,与HTTP经常使用的典型短期衔接相反,反向代理要求准许这些衔接坚持关上形态,而不是封锁它们,由于它们仿佛处于闲暇形态。
准许在客户机和后端主机之间建设隧道,Nginx支持WebSocket。关于NGINX将更新恳求从客户端发送到后盾主机,必定明白设置Upgrade和Connection题目。
(1)编辑nginx.conf,在http区域内必定要参与上方性能:
「解释一下map指令的作用:」该作用关键是依据客户端恳求中的值,来结构扭转connection_upgrade的值,即依据变量的值创立新的变量connection_upgrade,创立的规则就是{}外面的物品。其中的规则没有做婚配,因此经常使用自动的,即 http_upgrade为空字符串的话,那么值就是 close。
(2)编辑vhosts下虚构主机的性能文件,在location婚配性能中参与如下内容:
.1; $http_upgrade; ;
(3)一次性完整的示例如下:
{; sre1.ayunw.cn:8080; sre2.ayunw.cn:8080; sre3.ayunw.cn:8080;} {;sre.ayunw.cn;/usr/local/nginx/logs/sre.ayunw.cn.access. main;/usr/local/nginx/logs/sre.ayunw.cn..error. error;/data/certs/nginx/sre.ayunw.cn.crt;/data/certs/nginx/sre.ayunw.cn.key;5m; TLSv1..2;HIGH::;on; / {://sre_backend;on;.conf;1.1;$http_upgrade;;} /50x.html; = /50x.{html;}}
以上就是经过nginx代理WebSocket的单向TLS认证形式。
「好受提示:」 自动状况下,假设代理主机在 60 秒内没有传输任何数据,衔接将被封锁。可以经常使用proxy_read_timeout指令参与此超时。
「WebSocket与Http咨询」 WebSocket在建设握手时,数据是经过HTTP传输的。但是建设之后,在真正传输时刻是不要求HTTP协定的。
在WebSocket中,只要要主机和阅读器经过HTTP协定启动一个握手的举措,而后独自建设一条TCP的通讯通道启动数据的传送。WebSocket衔接的环节是:
(1)客户端动员http恳求,经过3次握手后,建设起TCP衔接;http恳求里寄存WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;2)主机收到客户端的握手恳求后,雷同驳回HTTP协定回馈数据;3)客户端收到衔接成功的信息后,开局借助于TCP传输信道启动全双工通讯。
这个疑问在于nginx的性能上,要求性能几个超时的设置。如下:
{ { / {html;..htm; ://sre_backend;.1; 5s; 60s; 30s; $http_upgrade; ;}}}
「proxy_read_timeout参数」 自动值60秒,该指令设置与代理主机的读超时时期。它选择了nginx会期待多长时期来取得恳求的照应。这个时期不是取得整个response的时期,而是两次reading操作的时期。即是主机对你期待最大的时期,也就是说当你经常使用nginx转发webSocket的时刻,假设60秒内没有通讯,依然是会断开的,所以,你可以依照你的需求来设定。比如说,我设置了5分钟,那么假设我5分钟内有通讯,或许5分钟内有做心跳的话,是可以坚持衔接不终止的。所以这个时期是看你的业务需求来调整时期长短的。
「proxy_send_timeout参数」 自动值60s,设置了发送恳求给upstream主机的超时时期。超时设置不是为了整个发送时期,而是在两次write操作时期。假设超时后,upstream没有收到新的数据,nginx会封锁衔接。
Socket其实并不是一个协定,而是为了繁难经常使用TCP或UDP而形象进去的一层,是位于运行层和传输控制层之间的一组接口。当两台主机通讯时,必定经过Socket衔接,Socket则应用TCP/IP协定建设TCP衔接。TCP衔接则更依托于底层的IP协定,IP协定的衔接则依赖于链路层等更低档次。
WebSocket就像HTTP一样,则是一个典型的运行层协定。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/6482.html