最終更新日 10/13/2023, 1:56:32 AM 更新
NGINX は主にリバースプロキシーとして用いられる Web サーバーアプリケーションです。つまり、(通常外部に公開している)80 番、443 番などのポートでリクエストを待ち受けて、そのパスに応じて、背後で動作している Web サーバーの(外部に公開していない)ポートや、他のホストで動作している Web サーバーに中継する、という役割を果たします。
どのようなリクエストを、どこに中継するかは(通常) /etc/nginx/conf.d/default.conf
という設定ファイルに記述します。設定ファイルの書き方の詳しい説明は「NGINX Reverse Proxy」を見てください。また NGINX のドキュメンテーション全体は
nginx documentaion にあります。ここでは、香川研究室で必要と考えられる事柄に絞って説明します。
一番外側には、サーバー全体の設定項目がいくつか並びます。この部分は、通常変更する必要はありません。
server {
listen 80;
server_name woden.eng.kagawa-u.ac.jp;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/nginx.pem;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
…
}
この … の部分に、個々のリバースプロキシーの設定を追加します。
背後の Web サーバーが Cookie も WebSocket も使っていない場合は、単に中継先の URL を記述します。
location /foo/ {
proxy_pass http://127.0.0.1:8080/;
}
これで、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)
例
location /bar/ {
proxy_pass http://unix:/path/to/unix_domain_socket:/;
}
もちろん /path/to/unix_domain_socket
は実際のソケットのパスに書き換えてください。この Unix Domain Socket は NGINX
から書き込み可能になっている必要があります。必要なら
chown
, chmod
コマンドなどでパーミッションを適切に設定(例えば、
chmod a+w /path/to/unix_domain_socket
)してください。
背後のサーバーがユーザー認証の機能を持つとき、背後のサーバー側のプログラムが、クライアントがリクエストした元の URL を知る必要がある場合があります。このときは、要求のヘッダーに、元の URL の情報を追加するように設定しておきます。以下のように 4 行を追加すれば良いようです。
location /baz/ {
…
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-URI $request_uri;
}
背後のサーバーが WebSocket を利用しているときは、それようの設定を追加する必要があります。詳しくは WebSocket proxying を見てください。
もしまだなければ、設定ファイルのトップレベルに以下の例の 1–4 行めの map ディレクティブを置いて、
$connection_upgrade
という変数を用意しておきます。
各 location には 12–14 行めの設定を追加します。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
…
location /qux/ {
…
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
背後で実行する Web サーバーが、オリジン間リソース共有 (CORS) を提供する場合、 Web サーバー側が適切なヘッダーを追加するように書かれていれば NGINX 側で何の設定もする必要はありません。ただし、サーバー側のプログラムを簡単に済ませたい場合は、NGINX 側でヘッダーを追加することもできます。以下のように記述すれば良いようです。
location /corge/ {
…
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept, Content-Type, X-Requested-With";
if ($request_method = OPTIONS ) {
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Methods "POST, GET, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept, Content-Type, X-Requested-With";
add_header Access-Control-Allow-Credentials true;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}
}
背後のサーバーには認証の機能などはつけていないが、NGINX でアクセス制限をかけたいという場合もあります。その場合は、次の 4 行の設定を追加します。
location /grault/ {
…
limit_except OPTIONS {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
/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