まず接続ハンドシェイクの失敗と、開いた後で閉じる接続を区別します。2つの症状では確認事項が異なります。
アプリケーションにupgrade要求を届ける
専用のWebSocketルートには、server内に次を置きます。
nginx
location /socket/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
proxy_http_versionはバックエンドに対してHTTP/1.1を明示的に使います。Upgradeはクライアントが求めるプロトコル変更を渡します。Connectionは、この接続がその変更を要求していることをバックエンドへ伝えます。プロキシは接続固有のヘッダーをすべて単純に転送するわけではないため、明示的な転送が必要です。
