Red Hat Training

A Red Hat training course is available for RHEL 8

第2章 NGINX の設定および構成

NGINX は、たとえば、次のように使用できる高パフォーマンスなモジュラーサーバーです。

  • Web サーバー
  • リバースプロキシー
  • ロードバランサー

本セクションでは、このシナリオで NGINX を行う方法を説明します。

2.1. NGINX のインストールおよび準備

Red Hat は、アプリケーションストリームを使用して NGINX の異なるバージョンを提供します。本セクションでは、以下を行う方法を説明します。

  • ストリームを選択し、NGINX をインストールします。
  • ファイアウォールで必要なポートを開きます。
  • nginx サービスの有効化および開始

デフォルト設定を使用すると、NGINX はポート 80 の Web サーバーとして実行され、/usr/share/nginx/html/ ディレクトリーのコンテンツを提供します。

前提条件

  • RHEL 8 がインストールされている。
  • ホストは Red Hat カスタマーポータルにサブスクライブしている。
  • デフォルトでは、firewalld サービスは有効で開始しています。

手順

  1. 利用可能な NGINX モジュールストリームを表示します。

    # yum module list nginx
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name        Stream        Profiles        Summary
    nginx       1.14 [d]      common [d]      nginx webserver
    nginx       1.16          common [d]      nginx webserver
    ...
    
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
  2. デフォルト以外のストリームをインストールする場合は、ストリームを選択します。

    # yum module enable nginx:stream_version
  3. nginx パッケージをインストールします。

    # yum install nginx
  4. NGINX がファイアウォールでサービスを提供するポートを開きます。たとえば、firewalld で HTTP (ポート 80) および HTTPS (ポート 443) のデフォルトポートを開くには、次のコマンドを実行します。

    # firewall-cmd --permanent --add-port={80/tcp,443/tcp}
    # firewall-cmd --reload
  5. nginx サービスがシステムの起動時に自動的に起動するようにします。

    # systemctl enable nginx
  6. 必要に応じて、nginx サービスを起動します。

    # systemctl start nginx

    デフォルト設定を使用しない場合は、この手順を省略し、サービスを起動する前に NGINX を適切に設定します。

検証手順

  1. yum ユーティリティーを使用して、nginx パッケージがインストールされていることを確認します。

    # yum list installed nginx
    Installed Packages
    nginx.x86_64    1:1.14.1-9.module+el8.0.0+4108+af250afe    @rhel-8-for-x86_64-appstream-rpms
  2. NGINX がサービスを提供するポートが firewalld で開いていることを確認します。

    # firewall-cmd --list-ports
    80/tcp 443/tcp
  3. nginx サービスが有効になっていることを確認します。

    # systemctl is-enabled nginx
    enabled

関連情報

2.2. 異なるドメインに異なるコンテンツを提供する Web サーバーとしての NGINX の設定

デフォルトでは、NGINX はサーバーの IP アドレスに関連付けられたすべてのドメイン名のクライアントに同じコンテンツを提供する Web サーバーとして動作します。この手順では、NGINX を設定する方法を説明します。

  • /var/www/example.com/ ディレクトリーのコンテンツで、example.com ドメインにリクエストを提供する。
  • /var/www/example.net/ ディレクトリーのコンテンツを使用して、example.net ドメインにリクエストを提供する。
  • その他のすべてのリクエスト (たとえば、サーバーの IP アドレスまたはサーバーの IP アドレスに関連付けられたその他のドメイン) に /usr/share/nginx/html/ ディレクトリーのコンテンツを指定します。

前提条件

  • NGINX は、「NGINX のインストールおよび準備」 の説明に従ってインストールされます。
  • クライアントおよび Web サーバーは、example.com および example.net ドメインを Web サーバーの IP アドレスに解決します。

    これらのエントリーは DNS サーバーに手動で追加する必要がある点に注意してください。

手順

  1. /etc/nginx/nginx.conf ファイルを編集します。

    1. デフォルトでは、/etc/nginx/nginx.conf ファイルには catch-all 設定がすでに含まれています。設定からこの部分を削除した場合は、以下の サーバー ブロックを /etc/nginx/nginx.conf ファイルの http ブロックに再追加します。

      server {
          listen       80 default_server;
          listen       [::]:80 default_server;
          server_name  _;
          root         /usr/share/nginx/html;
      }

      これらの設定は以下を構成します。

      • listen ディレクティブは、サービスがリッスンする IP アドレスとポートを定義します。この場合、NGINX は IPv4 と IPv6 の両方のアドレスのポート 80 でリッスンします。default_server パラメーターは、NGINX がこの server ブロックを IP アドレスとポートに一致するリクエストのデフォルトとして使用していることを示します。
      • server_name パラメーターは、この server ブロックに対応するホスト名を定義します。server_name_ に設定すると、この server ブロックのホスト名を受け入れるように NGINX を設定します。
      • root ディレクティブは、この server ブロックの Web コンテンツへのパスを設定します。
    2. example.com ドメインの同様の server ブロックを http ブロックに追加します。

      server {
          server_name  example.com;
          root         /var/www/example.com/;
          access_log   /var/log/nginx/example.com/access.log;
          error_log    /var/log/nginx/example.com/error.log;
      }
      • access_log ディレクティブは、このドメインに別のアクセスログファイルを定義します。
      • error_log ディレクティブは、このドメインに別のエラーログファイルを定義します。
    3. example.net ドメインの同様の server ブロックを http ブロックに追加します。

      server {
          server_name  example.net;
          root         /var/www/example.net/;
          access_log   /var/log/nginx/example.net/access.log;
          error_log    /var/log/nginx/example.net/error.log;
      }
  2. 両方のドメインのルートディレクトリーを作成します。

    # mkdir -p /var/www/example.com/
    # mkdir -p /var/www/example.net/
  3. 両方のルートディレクトリーに httpd_sys_content_t コンテキストを設定します。

    # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?"
    # restorecon -Rv /var/www/example.com/
    # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.net(/.\*)?"
    # restorecon -Rv /var/www/example.net/

    これらのコマンドは、/var/www/example.com/ ディレクトリーおよび /var/www/example.net/ ディレクトリーに httpd_sys_content_t コンテキストを設定します。

    policycoreutils-python-utils パッケージをインストールして restorecon コマンドを実行する必要があります。

  4. 両方のドメインのログディレクトリーを作成します。

    # mkdir /var/log/nginx/example.com/
    # mkdir /var/log/nginx/example.net/
  5. nginx サービスを再起動します。

    # systemctl restart nginx

検証手順

  1. 各仮想ホストのドキュメントルートに異なるサンプルファイルを作成します。

    # echo "Content for example.com" > /var/www/example.com/index.html
    # echo "Content for example.net" > /var/www/example.net/index.html
    # echo "Catch All content" > /usr/share/nginx/html/index.html
  2. ブラウザーを使用して http://example.com に接続します。Web サーバーは、/var/www/example.com/index.html ファイルからのサンプルコンテンツを表示します。
  3. ブラウザーを使用して http://example.net に接続します。Web サーバーは、/var/www/example.net/index.html ファイルからのサンプルコンテンツを表示します。
  4. ブラウザーを使用して http://IP_address_of_the_server に接続します。Web サーバーは、/usr/share/nginx/html/index.html ファイルからのサンプルコンテンツを表示します。

2.3. NGINX Web サーバーへの TLS 暗号化の追加

本セクションでは、example.com ドメインの NGINX Web サーバーで TLS 暗号化を有効にする方法を説明します。

前提条件

  • NGINX は、「NGINX のインストールおよび準備」 の説明に従ってインストールされます。
  • 秘密鍵は /etc/pki/tls/private/example.com.key ファイルに保存されます。

    秘密鍵および証明書署名要求 (CSR) を作成する方法と、認証局 (CA) からの証明書を要求する方法は、CA のドキュメントを参照してください。

  • TLS 証明書は /etc/pki/tls/certs/example.com.crt ファイルに保存されます。別のパスを使用する場合は、この手順の適切な手順を調整します。
  • CA 証明書がサーバーの TLS 証明書ファイルに追加されている。
  • クライアントおよび Web サーバーは、サーバーのホスト名を Web サーバーのホスト名に解決します。
  • ポート 443 が、ローカルのファイアウォールで開いている。

手順

  1. /etc/nginx/nginx.conf ファイルを編集し、設定の http ブロックに以下の server ブロックを追加します。

    server {
        listen              443 ssl;
        server_name         example.com;
        root                /usr/share/nginx/html;
        ssl_certificate     /etc/pki/tls/certs/example.com.crt;
        ssl_certificate_key /etc/pki/tls/private/example.com.key;
    }
  2. セキュリティー上の理由から、root ユーザーのみが秘密鍵ファイルにアクセスできるように設定します。

    # chown root:root /etc/pki/tls/private/example.com.key
    # chmod 600 /etc/pki/tls/private/example.com.key
    警告

    秘密鍵に権限のないユーザーがアクセスした場合は、証明書を取り消し、新しい秘密鍵を作成し、新しい証明書を要求します。そうでない場合は、TLS 接続が安全ではなくなります。

  3. nginx サービスを再起動します。

    # systemctl restart nginx

検証手順

  • ブラウザーを使用して、https://example.com に接続します。

2.4. HTTP トラフィックのリバースプロキシーとしての NGINX の設定

NGINX Web サーバーは、HTTP トラフィックのリバースプロキシーとして機能するように設定できます。たとえば、この機能を使用すると、リモートサーバーの特定のサブディレクトリーに要求を転送できます。クライアント側からは、クライアントはアクセスするホストからコンテンツを読み込みます。ただし、NGINX は実際のコンテンツをリモートサーバーから読み込み、クライアントに転送します。

この手順では、Web サーバーの /example ディレクトリーへのトラフィックを、URL https://example.com に転送する方法を説明します。

前提条件

手順

  1. /etc/nginx/nginx.conf ファイルを編集し、リバースプロキシーを提供する server ブロックに以下の設定を追加します。

    location /example {
        proxy_pass https://example.com;
    }

    location ブロックは、NGINX が /example ディレクトリーのすべての要求を https://example.com に渡すことを定義します。

  2. SELinux ブール値パラメーターhttpd_can_network_connect1 に設定して、SELinux が NGINX がトラフィックを転送できるように設定します。

    # setsebool -P httpd_can_network_connect 1
  3. nginx サービスを再起動します。

    # systemctl restart nginx

検証手順

  • ブラウザーを使用して http://host_name/example に接続すると、https://example.com の内容が表示されます。

2.5. NGINX を HTTP ロードバランサーとして設定

NGINX リバースプロキシー機能を使用してトラフィックを負荷分散できます。この手順では、アクティブな接続数が最も少ない数に基づいて、異なるサーバーにリクエストを送信する HTTP ロードバランサーとして NGINX を設定する方法を説明します。両方のサーバーが利用できない場合、この手順はフォールバックの理由として 3 番目のホストも定義します。

前提条件

手順

  1. /etc/nginx/nginx.conf ファイルを編集し、以下の設定を追加します。

    http {
        upstream backend {
            least_conn;
            server server1.example.com;
            server server2.example.com;
            server server3.example.com backup;
        }
    
        server {
            location / {
                proxy_pass http://backend;
            }
        }
    }

    backend という名前のホストグループの least_conn ディレクティブは、アクティブな接続数が最も少ないホストによって NGINX が server1.example.com または server2.example.com に要求を送信することを定義します。NGINX は、他の 2 つのホストが利用できない場合は、server3.example.com のみをバックアップとして使用します。

    proxy_pass ディレクティブを http://backend に設定すると、NGINX はリバースプロキシーとして機能し、backend ホストグループを使用して、このグループの設定に基づいて要求を配信します。

    least_conn 負荷分散メソッドの代わりに、以下を指定することができます。

    • ラウンドロビンを使用し、サーバー全体で要求を均等に分散する方法はありません。
    • ip_hash - クライアントの、IPv4 アドレスの最初の 3 つのオクテット、または IPv6 アドレス全体から計算されたハッシュに基づいて、あるクライアントアドレスから同じサーバーに要求を送信します。
    • ユーザー定義のキーに基づいてサーバーを判断する hash。これは文字列、変数、または両方の組み合わせになります。consistent パラメーターは、ユーザー定義のハッシュ化された鍵の値に基づいて、NGINX がすべてのサーバーに要求を分散するように設定します。
    • random: 無作為に選択されたサーバーに要求を送信します。
  2. nginx サービスを再起動します。

    # systemctl restart nginx

2.6. 関連情報

  • 公式の NGINX は、https://nginx.org/en/docs/ を参照してください。Red Hat は本書を維持しておらず、インストールした NGINX バージョンでは機能しない可能性があることに注意してください。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。