最終更新日

香川研究室での NGINX の使い方

はじめに

NGINX は主にリバースプロキシーとして用いられる Web サーバーアプリケーションです。 つまり、(通常外部に公開している)80 番、443 番などのポートでリクエストを待ち受けて、 そのパスに応じて、背後で動作している Web サーバーの(外部に公開していない)ポート や、他のホストで動作している Web サーバーに中継する、 という役割を果たします。

NGINX 設定ファイル

どのようなリクエストを、どこに中継するかは(通常) /etc/nginx/conf.d/default.conf という設定ファイルに記述します。設定ファイルの書き方の詳しい説明は 「NGINX Reverse Proxy」 を見てください。 また NGINX のドキュメンテーション全体は nginx documentaion にあります。 ここでは、香川研究室で必要と考えられる事柄に絞って説明します。

一番外側には、サーバー全体の設定項目がいくつか並びます。この部分は、通常変更する必要はありません。

この … の部分に、個々のリバースプロキシーの設定を追加します。

特殊な設定が必要ない

背後の Web サーバーが Cookie も WebSocket も使っていない場合は、単に中継先の URL を記述します。

これで、http://woden.end.kagawa-u.ac.jp/foo/XYZ へのアクセス(https:〜 でも同様)が、 http://127.0.0.1:8080/XYZ に中継されます。

なお、http://127.0.0.1:8080/ の末尾の / を忘れないようにしましょう。これがないと意味が変わります (詳しい説明)。

Unix Domain Socket を利用する

NGINX は Unix Domain Socket への Reverse Proxy もサポートしています。 背後の Web サーバーが Unix Domain Socket を使っている場合(ポートの衝突をさけるため、そのほうが望ましい)は、 unix:/path/to/unix_domain_socket: というかたちで、 ホスト+ポートの部分を記述してください。 (参考: Module ngx_http_proxy_module

もちろん /path/to/unix_domain_socket は実際のソケットのパスに書き換えてください。この Unix Domain Socket は NGINX から書き込み可能になっている必要があります。必要なら chown, chmod コマンドなどでパーミッションを適切に設定(例えば、 chmod a+w /path/to/unix_domain_socket)してください。

ユーザー認証をしている

背後のサーバーがユーザー認証の機能を持つとき、背後のサーバー側のプログラムが、 クライアントがリクエストした元の URL を知る必要がある場合があります。 このときは、要求のヘッダーに、元の URL の情報を追加するように設定しておきます。 以下のように 4 行を追加すれば良いようです。

WebSocket を使っている

背後のサーバーが WebSocket を利用しているときは、それようの設定を追加する必要があります。 詳しくは WebSocket proxying を見てください。

もしまだなければ、設定ファイルのトップレベルに以下の例の 1–4 行めの map ディレクティブを置いて、 $connection_upgrade という変数を用意しておきます。

各 location には 12–14 行めの設定を追加します。

CORS を提供する

背後で実行する Web サーバーが、オリジン間リソース共有 (CORS) を提供する場合、 Web サーバー側が適切なヘッダーを追加するように書かれていれば NGINX 側で何の設定もする必要はありません。 ただし、サーバー側のプログラムを簡単に済ませたい場合は、NGINX 側でヘッダーを追加することもできます。 以下のように記述すれば良いようです。

Basic 認証を追加する

背後のサーバーには認証の機能などはつけていないが、NGINX でアクセス制限をかけたいという場合もあります。 その場合は、次の 4 行の設定を追加します。

/etc/nginx/.htpasswd は、ユーザー名とパスワードを「:」で区切った形式のファイルです。 パスワードは htpasswd または openssl passwd などのコマンドで生成します。 詳しくは Restricting Access with HTTP Basic Authentication を見てください。

Django など

背後のサーバーが Django など uwsgi プロトコルを使うプログラムの場合、 uwsgi_pass というディレティブ(説明)が 用意されているので、それを利用してください。

設定を反映させるには

NGINX の設定ファイルを書き換えたら、まず nginx -t で設定ファイルに誤りがないか確認してください。 エラーが出ないことが確認できたら、NGINX を再起動します。Ubuntu では以下のコマンドになります。

sudo systemctl restart nginx 

Koji Kagawa