WebSocketをNginxのリバースプロキシで通信させる

Infra
スポンサーリンク

概要

リバースプロキシ(Nginx)経由でWebSocket(Webソケット)を通信させる必要があったため、最低限の設定をまとめました。
WebSocket proxying – https://nginx.org/en/docs/http/websocket.html

WebSocket(Webソケット)とは?

Webにおいて双方向通信を低コストで行うための仕組み。プロトコルの一種。
WebSocket(Webソケット)とは?の記事にまとめているのでそちらを参照ください。

mapディレクティブ

/etc/nginx/nginx.conf

http {
~省略~
    map $http_upgrade $connection_upgrade { 
        default upgrade;
        ''      close;
~省略~
}

$http_upgradeの値が空(”)の場合は、
$connection_upgrade = close

それ以外の場合は、
$connection_upgrade = upgrade

という処理が行われています。
 

リバースプロキシ設定

/etc/nginx/conf.d/default.conf

server {
    listen 80;
~省略~
    location /ws {
        # リバースプロキシ
        proxy_pass   https://remotehost:8080/ws;
        # WS設定
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        # バックエンド SSL & ロード・バランシングの場合
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
~省略~
}

# WS設定

「# リバースプロキシ」と「# バックエンド SSL & ロード・バランシングの場合」は割愛します。
# WS設定

proxy_http_version 1.1;

webソケットに必要なkeep-aliveはバージョン1.1以降で利用可
デフォルトは、1.0なので明示的に指定する必要があります。

proxy_set_header Upgrade $http_upgrade;

通信プロトコルをHTTP/1.1からwebsocketに変更しています。

proxy_set_header Connection $connection_upgrade;

送信先にコネクションを状態を伝えるためのヘッダーです。
ここでは、$http_upgradeの値に応じて設定済みの、「upgrade」あるいは「close」を設定しています。

なお、ホスト情報の受け渡しでwebソケットの接続が失敗している場合は下記を追記してください
proxy_set_header Host $host;

余談

デフォルトでは、プロキシされたサーバが60秒以内に何もデータを転送しない場合、接続が閉じられるでしょう。このタイムアプト proxy_read_timeout ディレクティブを使って増やすことができます。
もう一つの方法として、プロキシされたサーバはタイムアウトを再設定し接続がまだ生きているかを調べるために定期的にWebSocket ping or pongフレームを送信するように設定することができます。

Ajax、Cometについては時間があるときに書いていきたいと思います。

参考リンク

NginxのリバースプロキシでWebソケットを通す際の設定
WebSocket proxying

ありがとうございます

InfraNginx
スポンサーリンク
インフラエンジニア|パイナップル星人 ブログ

コメント

タイトルとURLをコピーしました