Node.jsリバースプロキシのNginx設定
私たちは、Node.jsのさまざまなフレームワーク(koa / egg / nestなど)を使用してWebバックエンドを実装することがよくあります。本番環境に移行する際には、Node.jsが直接外部にサービスを提供できることは確かですが、HTTPS、ログ、静的ファイルサービス、負荷分散などを考慮して、nginxを再度アクセスレイヤーとして使用し、nginxを使用してNode.jsサービスにアクセスすることがよくあります。この場合、nginxリバースプロキシを設定する必要があります。
基本設定
nginx設定をより管理しやすくするために、通常、各Webサービスに個別の設定ファイルを使用します。これにより、nginxマスター設定ファイルに各個別の設定ファイルを含める必要があります。
メインのnginx設定ファイル(通常は /etc/nginx.conf
にあります)を見つけ、 http {}
セクションで include
設定を見つけるか追加します。
http {
# ...
include /etc/nginx/conf.d/*.conf;
}
この時点で、Node.jsサイトのために別個の設定ファイルを設定することができます。たとえば、 /etc/nginx/conf.d/tinkink.net.conf
に以下が含まれます。
server {
listen 80;
server_name tinkinkink.net;
error_log /var/log/nginx/tinkinkink_error.log;
access_log /var/log/nginx/tinkink_accss.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_http_version 1.1;
# Node.jsのネイティブアドレス、ポートに注意
proxy_pass http://localhost:3000;
}
}
nginx -t
を使用して設定ファイルをテストし、正しい場合は nginx -s reload
を使用して設定を再読み込みします。ドメイン解決が完了した後、 server_name
のドメイン名を使用してNode.jsサービスにアクセスできます。
HTTPSの設定
HTTPSアクセスを設定する必要がある場合は、ポート443でリッスンし、証明書を設定する必要があります。
server {
listen 80 ;
listen 443 ssl;
server_name tinkinkink.net;
https_certificate /etc/nginx/ssl/tinkink.net.crt;
https_certificate_key /etc/nginx/ssl/tinkink.net.key;
# ...
}
負荷分散の設定
Node.jsサービスがnginxと同じマシンにない場合は、 proxy_pass
のアドレスをNode.jsサーバーのLANアドレスに変更するだけです。ただし、複数のNode.jsサーバーがある場合は、負荷分散を設定する必要があります。
upstream nodejs {
server 192.168.0.2:3000;
server 192.168.0.2:3001;
server 192.168.0.3:3000;
server 192.168.0.3:3001;
}
server {
# ...
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_http_version 1.1;
# Node.jsのネイティブアドレス、ポートに注意
proxy_pass http://nodejs;
}
}
上記の upstream
は、複数のNode.jsサーバーのアドレスを含む負荷分散グループ nodejs
を定義しています。 proxy_pass
では、負荷分散グループ名のみを指定する必要があります。
複数のサーバーアドレスを指定するだけでなく、 upstream
は重みや負荷分散アルゴリズムを指定することもできます。たとえば、
upstream nodejs {
server 192.168.0.2:3000 weight=1;
server 192.168.0.2:3001 weight=2;
server 192.168.0.3:3000 weight=1;
server 192.168.0.3:3001 weight=2;
}
デフォルトでは、リクエストは順番に異なるNode.jsサービスに割り当てられ、1つがハングアップした場合はドロップされます。上記の設定は、代わりに両方のサーバーがポート 3001
でより多くのリクエストを受け入れるようにします。
その他のポリシー。
ip_hash
:アクセスされたIPのハッシュ結果によって、各リクエストが割り当てられるため、ユーザーのIPが同じ場合は常に1つのバックエンドサーバーにアクセスします。fair
:バックエンドサーバーの応答時間に従ってリクエストを割り当て、応答時間が短いものに優先的に割り当てます。url_hash
:アクセスされたURLのハッシュ結果に従ってリクエストを割り当て、各URLが同じバックエンドサーバーに向けられるようにします。
ポリシーの使用方法。
upstream nodejs {
# ポリシー名を書く
ip_hash
server 192.168.0.2:3000;
server 192.168.0.2:3001;
server 192.168.0.3:3000;
server 192.168.0.3:3001;
}
要約
一般的に、nginxを使用してNode.jsリバースプロキシを設定することは比較的簡単であり、 proxy_pass
設定項目に焦点を当てています。この方法は、他の言語やフレームワークでのHTTPバックエンドサービスのリバースプロキシにも適用されます。