nginx 配置支持websocket转发

方式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,连接都会被关闭,无法复用。

猜你喜欢

转载自blog.csdn.net/qq_42152032/article/details/132533774