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 | 飞污熊博客


相关文章
|
1天前
|
缓存 负载均衡 应用服务中间件
nginx配置详解
配置详解
45 24
nginx配置详解
|
2天前
|
缓存 负载均衡 应用服务中间件
nginx配置
nginx配置详解
22 2
nginx配置
|
13天前
|
负载均衡 应用服务中间件 API
深入理解 Nginx 与 Kong 的配置与实践
在微服务架构中,Nginx 用于配置负载均衡,如示例所示,定义上游`pay-service`包含不同权重的服务节点。Kong API 网关则通过service和route进行服务管理和路由,与Nginx的upstream和location类似。通过Kong的命令行接口,可以创建upstream、target、service和route,实现对后端服务的负载均衡和请求管理。Nginx和Kong协同工作,提供高效、灵活的API管理和流量控制。
15 1
深入理解 Nginx 与 Kong 的配置与实践
|
17天前
|
缓存 负载均衡 应用服务中间件
Nginx如何反向代理后端服务?
【7月更文挑战第7天】
28 1
Nginx如何反向代理后端服务?
|
2天前
|
缓存 负载均衡 应用服务中间件
nginx配置详解
nginx配置详解
28 0
|
17天前
|
缓存 负载均衡 应用服务中间件
Nginx反向代理优化
教你如何做好Nginx反向代理优化
|
22天前
|
JavaScript 应用服务中间件 nginx
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
【项目部署系列教程】5. nginx配置反向代理,解决跨域接口的访问
47 10
|
19天前
|
应用服务中间件 nginx
Nginx命令配置到系统环境变量
Nginx命令配置到系统环境变量
|
19天前
|
应用服务中间件 开发工具 nginx
Nginx基础配置实例需求分析
Nginx基础配置实例需求分析
|
21天前
|
负载均衡 JavaScript 应用服务中间件
手把手教你玩转 Nginx 配置
作为静态服务器、反代和负载均衡器,Nginx 因高性能和灵活性广泛使用。
102 5