PHP と nginx を使用して単純な WebSocket サーバーを実装したいと考えており、次のような印象を受けています。
- Websocket がRFC 6455で説明されている「プロトコル スイッチ」を通過すると、標準の (「Web」以外の) ソケット サーバーと通信できます。
- nginx のマニュアルによると、 nginxは前述の「プロトコル スイッチ」を実行できます。
これを念頭に置いて、JavaScript クライアント、nginx 構成、および PHP サーバーで構成される次の単純な実装を試しました (以下を参照)。
結果:
Connection: upgrade
PHP サーバーは、Sec-WebSocket-Key: ***
および類似のフィールドを含む WebSocket HTTP ヘッダーを受信します。これでいいと思います。- ただし、
onopen
クライアントでイベントがトリガーされることはありません。これが私が立ち往生している場所です。
質問:
- いくつかの詳細、またはこれがどのように機能するかの概念全体を誤解していますか?
- コード例を機能させるにはどうすればよいですか?
Javascript クライアント:
function socket() {
var ws = new WebSocket("ws://socket/hello/");
ws.onopen = function() {
ws.send("Hello, World!");
};
ws.onmessage = function(event) {
console.log(event.data);
};
}
socket();
nginx の構成:
server {
location /hello/ {
proxy_pass http://localhost:10000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
server_name socket;
root socket;
}
PHP サーバー:
( PHP マニュアルの例 #1 で説明されているとおりに実装され、 に変更$address
されただけ127.0.0.1
です。)