nginx 配置websocket的反向代理

简介: nginx 配置websocket的反向代理

在上篇文章的基础上,今天我们来看看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;
        }
    }

image.gif

注意:

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

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

image.gif

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

Upgrade: websocket
Connection: Upgrade

image.gif

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

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

image.gif

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

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

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

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

参考:

配置 Nginx 反向代理 WebSocket - 奇妙的 Linux 世界

nginx反向代理WebSocket | 飞污熊博客


相关文章
|
16天前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
29 2
|
5天前
|
前端开发 Java 应用服务中间件
若依分离板nginx配置
若依分离板nginx配置
12 1
|
10天前
|
应用服务中间件 Linux 定位技术
配置和管理Nginx服务
配置和管理Nginx服务
24 4
|
11天前
|
缓存 运维 应用服务中间件
理解和正确配置 Nginx 的 `location` 块是使用 Nginx 时至关重要的一部分
理解和正确配置 Nginx 的 `location` 块是使用 Nginx 时至关重要的一部分
22 2
|
12天前
|
缓存 Ubuntu 应用服务中间件
Ubuntu 22.04 上安装、配置和使用 Nginx 可以分为几个简单的步骤
Ubuntu 22.04 上安装、配置和使用 Nginx 可以分为几个简单的步骤
|
3天前
|
JSON 负载均衡 算法
Nginx反向代理与负载均衡
Nginx反向代理与负载均衡
|
3天前
|
缓存 负载均衡 应用服务中间件
技术笔记:Nginx配置详解
技术笔记:Nginx配置详解
|
3天前
|
前端开发 Unix 应用服务中间件
程序员必知:【HAVENT原创】nginx配置
程序员必知:【HAVENT原创】nginx配置
|
3天前
|
前端开发 Unix 应用服务中间件
程序员必知:【HAVENT原创】nginx配置
程序员必知:【HAVENT原创】nginx配置
|
3天前
|
应用服务中间件 Linux 程序员
老程序员分享:nginx安装及其配置详细教程
老程序员分享:nginx安装及其配置详细教程