Karp 的技术博客

今天 搭建 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.

nginx

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2022年07月14日 05:00
2

目录

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