Nginx : リバースプロキシの設定2024/02/13 |
Nginx でのリバースプロキシの設定です。
例として、ホスト [www.srv.world] の Nginx サーバーで受けた HTTP/HTTPS アクセスを、バックエンドホスト [node01.srv.world] の
Nginx サーバーへ転送するよう設定します。
|
|
[1] | |
[2] | Nginx の設定です。 |
root@www:~ #
vi /usr/local/etc/nginx/nginx.conf # [server] セクション内を全て変更 # サーバー名や証明書は自身のものに置き換え
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.srv.world;
ssl_certificate "/usr/local/etc/letsencrypt/live/www.srv.world/fullchain.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.srv.world/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
proxy_redirect off;
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;
location / {
proxy_pass http://node01.srv.world/;
}
}
root@www:~ # service nginx reload
|
[3] | バックエンド Nginx サーバーで X-Forwarded-For ヘッダーをロギングするよう設定しておきます。 |
root@node01:~ #
vi /usr/local/etc/nginx/nginx.conf # 26-28行目 : コメント解除 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # [server] セクションに追記 server { listen 80; server_name node01.srv.world; set_real_ip_from 10.0.0.0/24; real_ip_header X-Forwarded-For;root@node01:~ # service nginx reload |
[4] | 任意のクライアントコンピューターからフロントエンドの Nginx サーバーへ HTTP/HTTPS アクセスして動作を確認します。 また、バックエンドの Nginx ログ [/var/log/nginx/access.log] にアクセス元のクライアントホストの IP アドレスがロギングされていることも確認しておくとよいでしょう。 |
[5] |
複数のホスト名宛てのリクエストをプロキシすることも可能です。
例として、[www.srv.world], [rx-7.srv.world], [rx-8.srv.world] は DNS 設定により、同じ
IP アドレス (当例では 10.0.0.31) を関連付けており、Nginx が稼働するサーバーは、それらのホスト名宛てのリクエストを全て受け付けることを前提とします。当例では同じドメイン名を使用していますが、ドメイン名が異なっていても問題ありません。 [www.srv.world] 宛てのリクエストは、バックエンドの [node01.srv.world (10.0.0.51)] へ ([1] の設定)、 [rx-7.srv.world] 宛てのリクエストは、バックエンドの [rx-7.srv.world (10.0.0.101)] へ、 [rx-8.srv.world] 宛てのリクエストは、バックエンドの [rx-8.srv.world (10.0.0.102)] へ、それぞれ転送するように設定します。 |
root@www:~ #
vi /usr/local/etc/nginx/nginx.conf # [http] セクション内に追記
http {
.....
.....
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name rx-7.srv.world;
ssl_certificate "/usr/local/etc/letsencrypt/live/rx-7.srv.world/fullchain.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/rx-7.srv.world/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
proxy_redirect off;
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;
location / {
proxy_pass http://rx-7.srv.world/;
}
}
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name rx-8.srv.world;
ssl_certificate "/usr/local/etc/letsencrypt/live/rx-8.srv.world/fullchain.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/rx-8.srv.world/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
proxy_redirect off;
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;
location / {
proxy_pass http://rx-8.srv.world/;
}
}
root@www:~ # service nginx reload
|
[6] | それぞれのホスト名宛てに HTTP アクセスして、以下のようのそれぞれのバックエンドサーバーが正常に応答すれば OK です。 |
Sponsored Link |