Nginx 代理 和负载均衡WebSocket 应用

WebSocket 介绍

WebSocket是目前比较成熟的技术了,大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持WebSocket。WebSocket 和HTTP虽然是不同协议,但是两者"握手"方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。NGINX从1.3版本开始支持WebSocket,其可以作为一个反向代理和为WebSocket程序做负载均衡。即将Upgrade: websocket和Connection: Upgrade必须设置一致

GET /app/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dddskkkdsjss
Origin: http://localhost
Sec-WebSocket-Version: 13

一个典型的Websocket握手请求如下:

客户端请求:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服务器回应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/

二.Nginx开启websocket代理功能的配置如下

编辑vhosts下虚拟主机的配置文件,在location匹配配置中添加如下内容:proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";

具体配置实例如下

server {
    listen       80;
    server_name  域名;
 
    proxy_http_version  1.1;
   #启用支持websocket连接的配置
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Connection          "upgrade";
    upstream myweb_backend {
      hash $remote_addr consistent;
      server 10.10.12.108:9001;
      server 10.10.12.109:9001;
    }
    location / {
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-scheme $scheme;
        proxy_pass http://myweb_backend;
        proxy_connect_timeout 60; #配置规避webSocket连接中断
        proxy_read_timeout 600;  #配置规避webSocket连接中断
        proxy_send_timeout 600;  #配置规避webSocket连接中断
    }
 
}

proxy_set_header Upgrade $http_upgrade和proxy_set_header Connection "upgrade"也可以配置到location里面 ,配置如下

server {
    listen       80;
    server_name  域名;
    upstream myweb_backend {
      hash $remote_addr consistent;
      server 10.10.12.108:9001;
      server 10.10.12.109:9001;
    }
    location / {
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-scheme $scheme;
        proxy_pass http://myweb_backend;
        proxy_connect_timeout 60; #配置规避webSocket连接中断
        proxy_read_timeout 600; #配置规避webSocket连接中断
        proxy_send_timeout 600;#配置规避webSocket连接中断
        proxy_http_version  1.1;
        #启用支持websocket连接的配置
        proxy_set_header    Upgrade             $http_upgrade;
        proxy_set_header    Connection          "upgrade";
    }
 
}
相关推荐
yaosheng_VALVE15 分钟前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
扣得君1 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9851 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
清尘沐歌2 小时前
有什么好用的 WebSocket 测试工具吗?
websocket·网络协议·测试工具
清尘沐歌2 小时前
有什么好用的 WebSocket 调试工具吗?
网络·websocket·网络协议
death bell3 小时前
Docker基础概念
运维·docker·容器
ʚɞ4963 小时前
应用程序部署(IIS的相关使用,sql server的相关使用)
运维·服务器