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";
    }
 
}
相关推荐
KKKlucifer几秒前
跨中台安全业务编排:融合4A平台原子化安全能力的创新实践
运维·人工智能·安全·自动化
邪修king13 分钟前
Re:Linux 系统篇(三十一):库的制作与原理Chapter2:静态链接与程序加载 —— 从磁盘 ELF 到运行中进程的完整旅程
android·linux·运维·开发语言
新时代农民工~18 分钟前
【双机高可用部署方案-前后端部署】
java·nginx·springboot
A-刘晨阳21 分钟前
普通摄像头怎么加上 AI 监控?用 Frigate 把识别和事件管理放到绿联 NAS
运维
Doris__HE34 分钟前
【元脑服务器NF8480G7-NF8480M7技术规格分享】
运维·服务器·数据库·缓存·性能优化
可涵不会debug36 分钟前
公司外怎么连接管家婆?从 SQL Server 安装到 cpolar 固定 TCP 远程登录
linux·运维·ubuntu
运维全栈笔记43 分钟前
Nginx 模块化多业务站点通用配置模板
linux·运维·nginx
snow@li1 小时前
服务器运维:解构我的服务器202609/小白学习
运维
网硕互联的小客服1 小时前
可以把服务器当成DNS服务器使用吗?如何操作?
运维·服务器·网络
梦想平凡1 小时前
情怀棋牌源代码焕新记录(一):全新国风UI与原版工程梳理
java·服务器·数据库·websocket·网络协议·cocos2d