本文介绍: 该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade创建规则就是{}里面的东西。如果 $http_upgradewebsocket的话,那么$connection_upgrade的值为upgrade支持升级协议。在nginx中,每个server应该具有唯一server_name来避免冲突,不同server块中server_name不允许重复

方式1.动态判断是否需要升级websocket协议

编辑nginx.conf,在http区域内一定要添加下面配置

http {

    #自定义变量 $connection_upgrade

    map $http_upgrade $connection_upgrade {

        default          keepalive;  #默认keepalive 可以支持 一般http请求

        ‘websocket‘      upgrade;     #如果为websocket 则为 upgrade升级的。

    }

}

map指令的作用:

该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade

创建规则就是{}里面的东西。如果 $http_upgradewebsocket的话,那么$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,连接都会被关闭,无法复用

原文地址:https://blog.csdn.net/qq_42152032/article/details/132533774

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_15601.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注