nginx支持websocket
Posted 健康平安的活着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx支持websocket相关的知识,希望对你有一定的参考价值。
一 http与websocket
1.http是应用层的协议,默认端口为80;https的端口为443;是一种短链接方式。
2.websocket:
WebSocket协议和HTTP协议不同,但是WebSocket协议的握手和HTTP是兼容的,它使用HTTP的Upgrade协议头将连接从HTTP连接升级到WebSocket连接。这个特性使得WebSocket应用程序可以很容易地应用到现有的基础设施。例如,WebSocket应用可以使用标准的80和443 HTTP端口,因此可以通过现有的防火墙设施。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
二 http升级支持websocket的原理
WebSockets应用程序会在客户端和服务器之间建立一个长连接,使得开发实时应用很容易。HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头。
三 http支持websocket遇到的瓶颈问题
反向代理服务器在支持WebSocket协议方面面临着一些挑战。
挑战1:WebSocket是一个逐段转发(hop-by-hop)协议,因此当代理服务器拦截到来自客户端的Upgrade请求时,代理服务器需要将自己的Upgrade请求发送给后端服务器,包括适合的请求头。
挑战2:由于WebSocket连接是长连接,与传统的HTTP端连接截然不同,故反向代理服务器还需要允许这些连接处于打开(Open)状态,而不能因为其空闲就关闭了连接。
四 解决办法与操作步骤
4.1 思路
nginx通过在客户端和后端服务器之间建立隧道来支持WebSockets通信。为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。
4.2 操作配置
在nginx的配置文件中进行修改:
http{
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
# 支持websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
解释说明:
map指令的作用
根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值。即根据变量$http_upgrade的值创建新的变量$connection_upgrade。 创建的规则就是{}里面的东西。规则如下:
其中{}里的规则没有匹配成功,则使用默认的。即 $connection_upgrade 的值会一直是 upgrade。如果 $http_upgrade为空字符串的话,那值就是 close。
server块中的配置:
HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头;为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。
如下图所示:
五 代理服务器获取流量的方式
客户端通常都会直接与Web服务器进行通信。那么当使用代理服务器作为客户端和服务器两者间一个“中介”时,代理服务器获取流量的方式有以下四种方式:
1.修改客户端:将客户端配置为使用代理服务器,那么客户端会直接将HTTP请求有意的发送到代理服务器上。
2.修改网络:网络基础设备可以通过若干种技术手段,在客户端不知情或没有参与的情况下,拦截网络流量并将其导入代理,这种代理称为拦截代理。
3.修改DNS命名空间:放在Web服务器之前的代理服务器,替代物,会直接假扮Web服务器的名字和IP地址
4.修改Web服务器:将Web服务器配置为向客户端发送一条HTTP重定向命令,将客户端的请求重定向到代理服务器上。
以上是关于nginx支持websocket的主要内容,如果未能解决你的问题,请参考以下文章