最終更新日
NGINX は主にリバースプロキシーとして用いられる Web サーバーアプリケーションです。 つまり、(通常外部に公開している)80 番、443 番などのポートでリクエストを待ち受けて、 そのパスに応じて、背後で動作している Web サーバーの(外部に公開していない)ポート や、他のホストで動作している Web サーバーに中継する、 という役割を果たします。
どのようなリクエストを、どこに中継するかは(通常) /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/
の末尾の /
を忘れないようにしましょう。これがないと意味が変わります
(詳しい説明)。
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 proxying を見てください。
もしまだなければ、設定ファイルのトップレベルに以下の例の 1–4 行めの map ディレクティブを置いて、
$connection_upgrade
という変数を用意しておきます。
各 location には 12–14 行めの設定を追加します。
背後で実行する Web サーバーが、オリジン間リソース共有 (CORS) を提供する場合、 Web サーバー側が適切なヘッダーを追加するように書かれていれば NGINX 側で何の設定もする必要はありません。 ただし、サーバー側のプログラムを簡単に済ませたい場合は、NGINX 側でヘッダーを追加することもできます。 以下のように記述すれば良いようです。
背後のサーバーには認証の機能などはつけていないが、NGINX でアクセス制限をかけたいという場合もあります。 その場合は、次の 4 行の設定を追加します。
/etc/nginx/.htpasswd
は、ユーザー名とパスワードを「:
」で区切った形式のファイルです。
パスワードは htpasswd
または openssl passwd
などのコマンドで生成します。
詳しくは
Restricting Access with HTTP Basic Authentication を見てください。
背後のサーバーが Django など uwsgi プロトコルを使うプログラムの場合、
uwsgi_pass
というディレティブ(説明)が
用意されているので、それを利用してください。
NGINX の設定ファイルを書き換えたら、まず
nginx -t
で設定ファイルに誤りがないか確認してください。
エラーが出ないことが確認できたら、NGINX を再起動します。Ubuntu では以下のコマンドになります。
sudo systemctl restart nginx