the glue

やってみたことで忘れそうなこと、役立ちそうなことなどをまとめています。たまに何気ない日常の話もします。

nginxをWebSocketのリバースプロキシとして使う

経緯

  • WebSocketを使ったアプリケーションを作ったが、ポートが80しか使えない
  • nginxでどっちも80に流したい

ポイント / はまり所

  • WebSocketのプロキシにはUpgradeヘッダ(HTTP 1.1)への対応が必要
  • Upgradeヘッダへの対応は nginx v1.3.13以降
    参考: WebSocket proxying
  • 厳しい条件から先に書く
  • デフォルトだと30秒通信がないと切断される(!)

nginxでリバースプロキシしているときだけ一定時間で接続が切れるので何かと思えば、
普通のHTTPの通信と同様に30秒(だったはず)通信がなかった場合はタイムアウトってことで自動でコネクションを切ってくれていたみたい。
ping/pongを30s以内にやればいいんだろうけど、とりあえず5分に設定。

config

server {
    listen *:80 default_server;
    proxy_read_timeout 5m;

    location /ws {
        proxy_pass http://127.0.0.1:3000/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}