今天 搭建 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_version
是 1.0
, HTTP
协议中对长连接的支持是从1.1
版本之后才有的, 所以Webscocket
用的时候至少要配置 1.1
.