現(xiàn)象描述:
服務(wù)器端通過Nginx做了代理。
客戶端能通過ws協(xié)議和后端連接上,但是一直顯示pending狀態(tài)。客戶端無法收到服務(wù)器端返回的消息,但是服務(wù)器端能收到客戶端請求建立鏈接的消息。
此時如果客戶端調(diào)用發(fā)送方法,比如 $connection->send('welcome!'); 服務(wù)器端沒有異常,但是客戶端收不到。
當停止workerman服務(wù)的時候,服務(wù)器端的消息反而能發(fā)送出去,此時客戶端也能收到消息。
也就是說,當服務(wù)啟動的狀態(tài)下,服務(wù)器發(fā)出去的消息都被阻塞了,并沒有發(fā)出去。請問這個問題怎么解決?
我試過單獨用workerman,不使用nginx做代理,一切正常。
PHP的代碼如下:
<?php
require __DIR__ . '/../../vendor/autoload.php';
use Workerman\Worker;
// 創(chuàng)建一個Websocket服務(wù)器
$ws_worker = new Worker("websocket://127.0.0.1:9100");
// 設(shè)置當前Worker實例啟動多少個進程
$ws_worker->count = 4;
// 在新連接到來時發(fā)出
$ws_worker->onConnect = function($connection) {
$connection->send('welcome!');
echo "new connection from ip " . $connection->getRemoteIp() . "\n";
};
// 接收數(shù)據(jù)時發(fā)出
$ws_worker->onMessage = function($connection, $data) {
//echo "{$data}\n";
$connection->send('got!');
};
// 連接關(guān)閉時發(fā)出
$ws_worker->onClose = function($connection) {
echo "Connection closed\n";
};
// 運行worker
Worker::runAll();
Nginx的配置如下:
location /wss {
proxy_pass http://127.0.0.1:9100;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
前端請求如下:
/**
執(zhí)行這行代碼之后,服務(wù)器端會顯示 new connection from ip 127.0.0.1
此時瀏覽器會顯示wss的請求狀態(tài)是pending。
如果在這個時候把服務(wù)器的workerman停止,瀏覽器會顯示101狀態(tài),并且能收到服務(wù)器發(fā)送的welcome字符串
*/
let ws = new WebSocket('ws://wodeyuming/wss')
/*
如果此時調(diào)用這條,會報錯:Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
*/
ws.send(123)