方式1.动态判断是否需要升级websocket协议
编辑nginx.conf,在http区域内一定要添加下面配置:
http {
#自定义变量 $connection_upgrade
map $http_upgrade $connection_upgrade {
default keep-alive; #默认为keep-alive 可以支持 一般http请求
'websocket' upgrade; #如果为websocket 则为 upgrade 可升级的。
}
}
map指令的作用:
该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade,
创建的规则就是{}里面的东西。如果 $http_upgrade为websocket的话,那么$connection_upgrade的值为upgrade支持升级协议。否则为keep-alive
server {
server_name test.server;
listen 8083;
listen [::]:8083;
location / { //默认匹配
proxy_pass http://$httpUpstreamName_8083;
#Nginx代理webSocket经常中断(超时)的解决方法
proxy_connect_timeout 4s;
proxy_read_timeout 60s; #如果没效,可以考虑这个时间配置长一点
proxy_send_timeout 12s;
#升级http1.1到 websocket协议
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
测试ws连接转发是否正常:ws://test.server:8083/
方式2.直接写死升级websocket
server {
server_name test.server;
listen 80;
listen [::]:80;
listen 8083;
listen [::]:8083;
listen 8088;
listen [::]:8088;
location / { #只能通过$serviceName配置 $httpUpstreamName_xxx可能不存在
if ($server_port = "80") { #sys default require
proxy_pass http://$serviceName:80;
}
if ($server_port = "8080") { #sys default require
proxy_pass http://$serviceName:8080;
}
if ($server_port = "8088") { #custom
proxy_pass http://$serviceName:8088;
}
proxy_pass http://$serviceName:8083;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
测试ws连接转发是否正常:ws://test.server:8083/
拓展阅读:
在nginx中,每个server块应该具有唯一的server_name来避免冲突,不同server块中server_name不允许重复。
set命令用于设置变量,set $XX=XX,在server块中set设置的变量,仅当前server块中有效。
在 HTTP 协议中,keep-alive、upgrade 和 close 是三种不同的连接管理方式。它们之间的区别如下:
keep-alive: 这是 HTTP 的默认连接管理方式。当使用 keep-alive 时,允许多个请求和响应重复使用相同的 TCP 连接。这样可以减少建立和关闭连接的开销,提高性能。同一连接上的多个请求将被连续发送和接收,直到达到连接的最大空闲时间或收到显式的关闭连接指令。
upgrade: 这是一种特殊的连接升级方式,通常用于支持协议升级,例如从 HTTP 到 WebSocket。当客户端发送一个带有 “Upgrade” 头部的请求时,服务器可以将连接升级到另一个具有自定义功能的协议。在升级的过程中,服务器和客户端之间通常会协商协议的切换和其他必要的握手。
close: 当服务器或客户端希望终止连接时,可以发送一个带有 “Connection: close” 头部的请求或响应。这会指示对方关闭连接。在这种情况下,无论之前是否启用了 keep-alive,连接都会被关闭,无法复用。
版权归原作者 李庆政370 所有, 如有侵权,请联系我们删除。