CentOS Stream 8
Sponsored Link

Nginx : リバースプロキシの設定2021/04/08

 
Nginx でのリバースプロキシの設定です。
例として、ホスト [www.srv.world] の Nginx サーバーで受けた HTTP/HTTPS アクセスを、バックエンドホスト [dlp.srv.world] の Nginx サーバーへ転送するよう設定します。
[1]
[2] Nginx の設定です。
# HTTP 用の設定

[root@www ~]#
vi /etc/nginx/nginx.conf
# [server] セクション内を以下のように変更

    server {
        listen      80 default_server;
        listen      [::]:80 default_server;
        server_name www.srv.world;

        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://dlp.srv.world/;
        }
    }

# HTTPS 用の設定

[root@www ~]#
vi /etc/nginx/conf.d/proxy-ssl.conf
# 新規作成

# 証明書は自身のものに置き換え

server {
    listen      443 ssl http2 default_server;
    listen      [::]:443 ssl http2 default_server;
    server_name www.srv.world;

    ssl_certificate "/etc/letsencrypt/live/www.srv.world/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/www.srv.world/privkey.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;

    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://dlp.srv.world/;
    }
}

[root@www ~]#
systemctl restart nginx

[3] SELnux を有効にしている場合は、ブール値の変更が必要です。
[root@www ~]#
setsebool -P httpd_can_network_connect on
[4] バックエンド Nginx サーバーで X-Forwarded-For ヘッダーをロギングするよう設定しておきます。
[root@dlp ~]#
vi /etc/nginx/nginx.conf
# [http] セクション内の [log_format] 設定確認

# [http_x_forwarded_for] があれば OK

http {
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

# [server] セクション内に追記

# [set_real_ip_from] は自身の信頼できる内部ネットワークを指定

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  dlp.srv.world;
        root         /usr/share/nginx/html;
        set_real_ip_from   10.0.0.0/24;
        real_ip_header     X-Forwarded-For;

[root@dlp ~]#
systemctl restart nginx

[5] 任意のクライアントホストからフロントエンドの Nginx サーバーへ HTTP/HTTPS アクセスして動作を確認します。 また、バックエンドの Nginx ログ [/var/log/nginx/access.log] にアクセス元のクライアントホストの IP アドレスがロギングされていることも確認しておくとよいでしょう。
[6]
複数のホスト名宛てのリクエストをプロキシすることも可能です。
例として、[www.srv.world], [rx-7.srv.world], [rx-8.srv.world] は DNS 設定により、同じ IP アドレス (当例では 10.0.0.31) を関連付けており、Nginx が稼働するサーバーは、それらのホスト名宛てのリクエストを全て受け付けることを前提とします。
当例では同じドメイン名を使用していますが、ドメイン名が異なっていても問題ありません。
[www.srv.world] 宛てのリクエストは Nginx のデフォルトサイトへ、
[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 /etc/nginx/conf.d/rx-7.srv.world.conf
# 新規作成

server {
        listen      80;
        listen      [::]:80;
        listen      443 ssl http2;
        listen      [::]:443 ssl http2;
        server_name rx-7.srv.world;

        ssl_certificate "/etc/letsencrypt/live/rx-7.srv.world/fullchain1.pem";
        ssl_certificate_key "/etc/letsencrypt/live/rx-7.srv.world/privkey1.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;

        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/;
        }
}

[root@www ~]#
vi /etc/nginx/conf.d/rx-8.srv.world.conf
# 新規作成

server {
        listen      80;
        listen      [::]:80;
        listen      443 ssl http2;
        listen      [::]:443 ssl http2;
        server_name rx-8.srv.world;

        ssl_certificate "/etc/letsencrypt/live/rx-8.srv.world/fullchain1.pem";
        ssl_certificate_key "/etc/letsencrypt/live/rx-8.srv.world/privkey1.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;

        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 ~]#
systemctl restart nginx

[7] それぞれのホスト名宛てに HTTP アクセスして、以下のようのそれぞれのバックエンドサーバーが正常に応答すれば OK です。
関連コンテンツ