概要
リバースプロキシ(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
ありがとうございます
コメント