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";
    }
 
}
相关推荐
努力努力再努力wz12 分钟前
【C++进阶系列】:万字详解红黑树(附模拟实现的源码)
java·linux·运维·c语言·开发语言·c++
斯普信专业组23 分钟前
多输入(input)多输出(output)验证
运维·服务器·网络·fluent-bit
白鹭39 分钟前
apache详细讲解(apache介绍+apache配置实验+apache实现https网站)
linux·运维·apache·apache配置·apache实现https网站
Anthony_23141 分钟前
MySQL的常用命令
运维·数据库·mysql·adb·docker
✎﹏赤子·墨筱晗♪1 小时前
基于Nginx实现反向代理、负载均衡与动静分离完整部署指南
运维·nginx·负载均衡
CesareCheung1 小时前
JMeter压测过程中监控服务器CPU及内存的方法
运维·服务器·jmeter
蒋星熠1 小时前
WebSocket网络编程深度实践:从协议原理到生产级应用
网络·数据库·redis·python·websocket·网络协议·微服务
傻傻虎虎1 小时前
【Docker】常用帮忙、镜像、容器、其他命令合集(1)
运维·docker·容器
草履虫建模2 小时前
在 RuoYi 中接入 3D「园区驾驶舱」:Vue2 + Three.js + Nginx
运维·开发语言·javascript·spring boot·nginx·spring cloud·微服务
wanhengidc2 小时前
高性价比云手机挑选指南
运维·网络·安全·游戏·智能手机