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