websocket を使用した時の nginx 設定のメモ

django の channels を使って双方向通信を試していましたが、nginx の設定ファイルについて少々調べたのでメモを残しておきたいと思います。

参考

nginx の設定ファイル

nginx の設定ファイルは下記のとおりです。

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream django {
    server unix:///project/backend/uwsgi.sock;
}

server {
    listen 80;
    server_name localhost;
    charset utf-8;
    client_max_body_size 75M;
    location / {
        uwsgi_pass django;
        include /project/backend/uwsgi_params;
    }
    location /ws/ {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

map

map ディレクティブは特定の変数の値を、別の変数の値に応じて設定できる機能との事。

$ http_upgrade の値が空 ('') の場合は「$ connection_upgrade = close」を、
それ以外の場合は「$ connection_upgrade = upgrade」という処理が行っているようです。

proxy_pass http://localhost:8000;

websocket のリクエスト /ws/ を 8000 番に流しています。
今回 django を使用してたのでインターフェイスである daphne も 8000 番を指定して起動しこのリクエストを受けます。

proxy_http_version 1.1;

プロトコルのバージョンはデフォルトだと 1.0 なので 1.1 を指定しています。
websocket に必要な keep-alive は、1.1 以降から使用可能なようです。

proxy_set_header Upgrade $http_upgrade;

プロトコルスイッチという仕組みで通信プロトコルを HTTP/1.1 から websocket に変更するようです。

proxy_set_header Connection $connection_upgrade;

送信先にコネクションを維持するか否かを伝えるためのヘッダーのようです。

感想

まだまだ深堀りが必要そうです。

YouTube