踩坑教训Nginx

[踩坑] Nginx 配置 WebScoket 未配置 proxy_http_version 导致长连接变短连接

By karp 77601 Views 4 MIN READ 0 Comments

今天 搭建 Webscoket 服务, 测试 内网IP + 端口, 客户端连接没有任何问题.

运维同学配置了公网域名后, 测试 客户端连接 公网域名

你 4:27:10
等待服务器Websocket握手包...
你 4:27:12
收到服务器Websocket握手包.
服务器 4:27:12
Websocket连接已建立,正在等待数据...
服务器 4:27:12
和服务器断开连接!
就像上面一样 一直 握手 -> 连接建立 -> 断开.

问题是 我服务端 进到 onOpen 事件 想要主动回包给 客户端都做不到.
$server->exist($fd) 返回的是false, 发现客户端行为不是长连接, 比较像短连接请求,更过分的是断连不挥手.

排除了一些可能后想到 是不是 运维的 Nginx 配置出错了.

server {
    listen       80;
    server_name  xxxx.xxx.com;
                                                                                                                   
     location  / {

            proxy_pass http://localhost:8888;
            proxy_set_header   X-Forwarded-For  $http_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
               
        }
  
} 

发现缺少 proxy_http_version 1.1; 配置.
因为 nginx 默认配置 proxy_http_version1.0 , HTTP协议中对长连接的支持是从1.1版本之后才有的, 所以Webscocket 用的时候至少要配置 1.1.

本文由 karp 原创

采用 CC BY-NC-SA 4.0 协议进行许可

转载请注明出处:https://www.ikarp.top/index.php/archives/549.html

标签: nginx

0 评论