nginx 配置websocket的反向代理

在上篇文章介绍了 如何利用nginx搭建一个ssl服务器,并进行反向代理。

在上篇文章的基础上,今天我们来看看nginx如何代理websocket协议

1、websocket简介

WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的基础设施。

WebSocket工作在HTTP的80和443端口并使用前缀ws://或者wss://进行协议标注,在建立连接时使用HTTP/1.1的101状态码进行协议切换,当前标准不支持两个客户端之间不借助HTTP直接建立Websocket连接。

2、使用Nginx对WebSocket进行反向代理

修改Nginx配置文件nginx.conf:

示例:这是在配置ssl的基础上,对WebSocket进行反向代理

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}



server {
        listen       8086 ssl;
        server_name  10.167.2xx.xx;
		
		client_max_body_size 50m; #文件最大大小

        #ssl_certificate      cert.pem;
        #ssl_certificate_key  cert.key;
		
		ssl_certificate      test.crt;
        ssl_certificate_key  test.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            #root   html;
            #index  index.html index.htm;
			
			proxy_pass http://127.0.0.1:8092;     # websocket 项目的端口号
            
            # 固定写法-------------
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
			
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection $connection_upgrade;

			
        }
    }

注意:

最重要的就是在反向代理的配置中增加了如下两行,其它的部分和普通的HTTP反向代理没有任何差

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

这里面的关键部分在于HTTP的请求中多了如下头部:

Upgrade: websocket
Connection: Upgrade

这两个字段表示请求服务器升级协议为WebSocket。服务器处理完请求后,响应如下报文:

# 状态码为101
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

告诉客户端已成功切换协议,升级为Websocket协议。握手成功之后,服务器端和客户端便角色对等,就像普通的Socket一样,能够双向通信。 不再进行HTTP的交互,而是开始WebSocket的数据帧协议实现数据交换。

这里使用map指令可以将变量组合成为新的变量,会根据客户端传来的连接中是否带有Upgrade头来决定是否给源站传递Connection头, 这样做的方法比直接全部传递upgrade更加优雅。

默认情况下,连接将会在无数据传输60秒后关闭,proxy_read_timeout参数可以延长这个时间。源站通过定期发送ping帧以保持连接并确认连接是否还在使用。

大家可以思考一下如何多次代理转发?还是很简单的,就不多啰嗦了:P

参考:

https://www.hi-linux.com/posts/42176.html

https://www.xncoding.com/2018/03/12/fullstack/nginx-websocket.html

猜你喜欢

转载自blog.csdn.net/qq_41603102/article/details/88410672
今日推荐