序章

ApacheとNginxは、PHPでよく使用される2つの人気のあるオープンソースWebサーバーです。 要件が異なる複数のWebサイトをホストする場合は、両方を同じ仮想マシンで実行すると便利です。 1つのシステムで2つのWebサーバーを実行するための一般的な解決策は、複数のIPアドレスまたは異なるポート番号を使用することです。

IPv4アドレスとIPv6アドレスの両方を持つサーバーは、一方のプロトコルでApacheサイトにサービスを提供し、もう一方のプロトコルでNginxサイトにサービスを提供するように構成できますが、ISPによるIPv6の採用はまだ普及していないため、これは現在実用的ではありません。 次のような別のポート番号を持つ 81 また 8080 2番目のWebサーバーの場合は別の解決策ですが、URLをポート番号( http://your_domain:81)が常に合理的または理想的であるとは限りません。

このチュートリアルでは、NginxをWebサーバーとApacheのリバースプロキシの両方として構成します。すべて単一のサーバー上にあります。

Webアプリケーションによっては、特にSSLサイトが構成されている場合、Apacheのリバースプロキシ対応を維持するためにコードの変更が必要になる場合があります。 これを回避するには、Apacheモジュールをインストールします。 mod_rpaf これは特定の環境変数を書き換えるので、ApacheがWebクライアントからの要求を直接処理しているように見えます。

1台のサーバーで4つのドメイン名をホストします。 2つはNginxによって提供されます: nginx1.your_domain (デフォルトの仮想ホスト)および nginx2.your_domain. 残りの2つは apache1.your_domainapache2.your_domain、Apacheによって提供されます。 また、PHP-FPMを使用してPHPアプリケーションを提供するようにApacheを構成します。これにより、パフォーマンスが向上します。 mod_php.

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • 新しいUbuntu20.04サーバーは、 Ubuntu 20.04 の初期サーバー設定に従い、sudo非rootユーザーとファイアウォールを使用して構成されます。
  • サーバーのIPアドレスを指すように構成された4つの完全修飾ドメイン名。 これを行う方法の例については、DigitalOceanを使用してホスト名を設定する方法のステップ3を参照してください。 ドメインのDNSを他の場所でホストする場合は、代わりに適切なAレコードを作成する必要があります。

ステップ1—ApacheとPHP-FPMのインストール

ApacheとPHP-FPMをインストールすることから始めましょう。

ApacheとPHP-FPMに加えて、PHPFastCGIApacheモジュールもインストールします。 libapache2-mod-fastcgi、FastCGIWebアプリケーションをサポートします。

まず、パッケージリストを更新して、最新のパッケージがあることを確認します。

  1. sudo apt update

次に、ApacheおよびPHP-FPMパッケージをインストールします。

  1. sudo apt install apache2 php-fpm

FastCGI ApacheモジュールはUbuntuのリポジトリでは利用できないため、 kernel.org からダウンロードし、 dpkg 指図。

  1. wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  2. sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

次に、PHP-FPMを使用するようにApacheのデフォルト設定を変更しましょう。

ステップ2—ApacheとPHP-FPMの設定

このステップでは、Apacheのポート番号を次のように変更します。 8080 を使用してPHP-FPMで動作するように構成します mod_fastcgi モジュール。 Apacheの名前を変更します ports.conf 構成ファイル:

  1. sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

新しいを作成します ports.conf ポートがに設定されたファイル 8080:

  1. echo "Listen 8080" | sudo tee /etc/apache2/ports.conf

注: Webサーバーは通常、リッスンするように設定されています 127.0.0.1:8080 リバースプロキシを構成するが、そうすると、PHPの環境変数 SERVER_ADDR の値が、サーバーのパブリックIPではなくループバックIPアドレスに設定されます。 私たちの目的は、Webサイトの前にリバースプロキシが表示されないようにApacheを設定することです。 したがって、リッスンするように構成します 8080 すべてのIPアドレスで。

次に、Apache用の仮想ホストファイルを作成します。 The <VirtualHost> このファイルのディレクティブは、ポートでのみサイトにサービスを提供するように設定されます 8080.

デフォルトの仮想ホストを無効にします。

  1. sudo a2dissite 000-default

次に、既存のデフォルトサイトを使用して、新しい仮想ホストファイルを作成します。

  1. sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

次に、新しい構成ファイルを開きます。

  1. sudo nano /etc/apache2/sites-available/001-default.conf

リスニングポートをに変更します 8080:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

ファイルを保存し、新しい構成ファイルをアクティブ化します。

  1. sudo a2ensite 001-default

次に、Apacheをリロードします。

  1. sudo systemctl reload apache2

をインストールします net-tools を含むパッケージ netstat 指図:

  1. sudo apt install net-tools

Apacheが現在リッスンしていることを確認します 8080:

  1. sudo netstat -tlpn

出力は次の例のようになります。 apache2 聞いて 8080:

Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd tcp6 0 0 :::8080 :::* LISTEN 4678/apache2 tcp6 0 0 :::22 :::* LISTEN 1086/sshd

Apacheが正しいポートでリッスンしていることを確認したら、PHPとFastCGIのサポートを設定できます。

ステップ3—使用するApacheの構成 mod_fastcgi

Apacheはを使用してPHPページを提供します mod_php デフォルトでは、PHP-FPMを使用するには追加の構成が必要です。

注:このチュートリアルをLAMPの既存のインストールで試している場合 mod_php、最初に無効にします sudo a2dismod php7.4.

の構成ブロックを追加します mod_fastcgi、に依存します mod_action. mod_action デフォルトでは無効になっているため、最初に有効にする必要があります。

  1. sudo a2enmod actions

既存のFastCGI構成ファイルの名前を変更します。

  1. sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

新しい構成ファイルを作成します。

  1. sudo nano /etc/apache2/mods-enabled/fastcgi.conf

次のディレクティブをファイルに追加して、 .php PHP-FPM UNIXソケットへのファイル:

/etc/apache2/mods-enabled/fastcgi.conf
<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi
  AddType application/x-httpd-fastphp .php
  Action application/x-httpd-fastphp /php-fcgi
  Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
  FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

変更を保存して、構成テストを実行します。

  1. sudo apachectl -t

注:警告が表示された場合 Could not reliably determine the server's fully / qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/ to suppress this message.、今のところ無視しても問題ありません。 サーバー名は後で構成します。

Apacheをリロードする限り Syntax OK 表示されています:

  1. sudo systemctl reload apache2

それでは、ApacheからPHPを提供できることを確認しましょう。

ステップ4—PHPの機能を確認する

PHPを作成して、PHPが機能することを確認しましょう。 phpinfo() ファイルを作成し、Webブラウザからアクセスします。

ファイルを作成する /var/www/html/info.php、への呼び出しが含まれています phpinfo 働き:

  1. echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

前提条件セクションのサーバーの初期設定に従った場合は、Apacheファイアウォールを有効にしている可能性があります。 先に進んで、ポートでIPにアクセスできることを確認しましょう 8080、現在アクセスできません。 ステップ10で、このポートへのパブリックアクセスを制限します。

最初にポートを許可する 8080 ファイアウォールを介して:

  1. sudo ufw allow 8080

Apacheドメインを保護するので、先に進んで、ポートでのTLSトラフィックを確認しましょう 443 入ることができます。

許可する Apache Full ポートでのトラフィックを許可する 80443:

  1. sudo ufw allow "Apache Full"

次に、ファイアウォールのステータスを確認します。

  1. sudo ufw status

前提条件に従った場合、出力は次のようになります。

Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere 8080 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6) 8080 (v6) ALLOW Anywhere (v6)

そのポートが表示されます 8080Apache Full 他のファイアウォールルールと一緒に許可されます。 それでは、 info.php ページ。

を見るには info.php ブラウザで、に移動します http://your_server_ip:8080/info.php. これにより、PHPが使用している構成設定のリストが表示されます。 次のような出力が表示されます。

ページの上部で、サーバーAPIFPM /FastCGIと表示されていることを確認します。 ページの約3分の2のところにあるPHP変数セクションでは、SERVER_SOFTWAREがUbuntu上のApacheであることがわかります。 これらはそれを確認します mod_fastcgi はアクティブであり、ApacheはPHP-FPMを使用してPHPファイルを処理しています。

ステップ5—Apache用の仮想ホストを作成する

ドメイン用のApache仮想ホストファイルを作成しましょう apache1.your_domainapache2.your_domain. これを行うには、最初に両方のサイトのドキュメントルートディレクトリを作成し、それらのディレクトリにいくつかのデフォルトファイルを配置して、構成を簡単にテストできるようにします。

まず、ドキュメントのルートディレクトリを作成します。

  1. sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain

次に、を作成します index 各サイトのファイル:

  1. echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
  2. echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html

次に、を作成します phpinfo() PHPが適切に構成されていることをテストできるように、サイトごとにファイルを作成します。

  1. echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
  2. echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php

次に、の仮想ホストファイルを作成します apache1.your_domain:

  1. sudo nano /etc/apache2/sites-available/apache1.your_domain.conf

次のコードをファイルに追加して、ホストを定義します。

/etc/apache2/sites-available/apache1.your_domain.conf
    <VirtualHost *:8080>
        ServerName apache1.your_domain
        ServerAlias www.apache1.your_domain
        DocumentRoot /var/www/apache1.your_domain
        <Directory /var/www/apache1.your_domain>
            AllowOverride All
        </Directory>
    </VirtualHost>

この線 AllowOverride All 有効にする .htaccess サポート。

これらは最も基本的なディレクティブにすぎません。 Apacheで仮想ホストを設定するための完全なガイドについては、 Ubuntu18.04でApache仮想ホストを設定する方法を参照してください。

ファイルを保存して閉じます。 次に、同様の構成を作成します apache2.your_domain. 最初にファイルを作成します。

  1. sudo nano /etc/apache2/sites-available/apache2.your_domain.conf

次に、構成をファイルに追加します。

/etc/apache2/sites-available/apache2.<^>your_domain<^>。conf
    <VirtualHost *:8080>
        ServerName apache2.your_domain
        ServerAlias www.apache2.your_domain
        DocumentRoot /var/www/apache2.your_domain
        <Directory /var/www/apache2.your_domain
            AllowOverride All
        </Directory>
    </VirtualHost>

ファイルを保存して、エディターを終了します。

両方のApache仮想ホストがセットアップされたので、を使用してサイトを有効にします。 a2ensite 指図。 これにより、仮想ホストファイルへのシンボリックリンクが作成されます。 sites-enabled ディレクトリ:

  1. sudo a2ensite apache1.your_domain
  2. sudo a2ensite apache2.your_domain

Apacheで構成エラーを再度確認します。

  1. sudo apachectl -t

わかるでしょ Syntax OK エラーがない場合に表示されます。 他に何かが表示された場合は、構成を確認して再試行してください。

構成にエラーがなくなったら、Apacheをリロードして変更を適用します。

  1. sudo systemctl reload apache2

サイトが機能していることを確認するには、 http://apache1.your_domain:8080http://apache2.your_domain:8080 ブラウザで、各サイトに index.html ファイル。

次の結果が表示されます。

また、PHPにアクセスして、PHPが機能していることを確認します。 info.php 各サイトのファイル。 訪問 http://apache1.your_domain:8080/info.phphttp://apache2.your_domain:8080/info.php ブラウザで。

ステップ4で見たのと同じPHP構成仕様リストが各サイトに表示されます。

現在、Apacheでホストされている2つのWebサイトがポートにあります 8080. 次にNginxを設定しましょう。

ステップ6—Nginxのインストールと構成

このステップでは、Nginxをインストールしてドメインを構成します nginx1.your_domainnginx2.your_domain Nginxの仮想ホストとして。 Nginxで仮想ホストを設定するための完全なガイドについては、 Ubuntu 20.04 でNginxサーバーブロック(仮想ホスト)を設定する方法を参照してください。

を使用してNginxをインストールします apt パッケージマネージャー:

  1. sudo apt install nginx

次に、デフォルトの仮想ホストのsymlinkを削除します。これは、これ以上使用しないためです。

  1. sudo rm /etc/nginx/sites-enabled/default

後で独自のデフォルトサイトを作成します(nginx1.your_domain).

次に、Apacheで使用したのと同じ手順を使用して、Nginxの仮想ホストを作成します。 まず、両方のWebサイトのドキュメントルートディレクトリを作成します。

  1. sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain

NginxのWebサイトは /usr/share/nginx、これはNginxがデフォルトでそれらを必要とする場所です。 あなたはそれらを下に置くことができます /var/www/html Apacheサイトとの分離ですが、この分離はサイトをNginxに関連付けるのに役立つ場合があります。

Apacheの仮想ホストで行ったように、作成します indexphpinfo() セットアップが完了した後にテストするためのファイル:

  1. echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
  2. echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
  3. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
  4. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php

次に、ドメインの仮想ホストファイルを作成します nginx1.your_domain:

  1. sudo nano /etc/nginx/sites-available/nginx1.your_domain

Nginxの呼び出し server {. . .} 構成ファイルサーバーブロックの領域。 プライマリ仮想ホストのサーバーブロックを作成し、 nginx1.your_domain. The default_server 構成ディレクティブは、これを他の仮想ホストと一致しないHTTP要求を処理するデフォルトの仮想ホストにします。

/etc/nginx/sites-available/nginx1。<^>your_domain<^>
server {
    listen 80 default_server;

    root /usr/share/nginx/nginx1.your_domain;
    index index.php index.html index.htm;

    server_name nginx1.your_domain www.nginx1.your_domain;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

ファイルを保存して閉じます。 次に、Nginxの2番目のドメインの仮想ホストファイルを作成します。 nginx2.your_domain:

  1. sudo nano /etc/nginx/sites-available/nginx2.your_domain

ファイルに以下を追加します。

/etc/nginx/sites-available/nginx2。<^>your_domain<^>
server {
    root /usr/share/nginx/nginx2.your_domain;
    index index.php index.html index.htm;

    server_name nginx2.your_domain www.nginx2.your_domain;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

ファイルを保存して閉じます。

へのシンボリックリンクを作成して、両方のサイトを有効にします。 sites-enabled ディレクトリ:

  1. sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
  2. sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain

Nginx構成をテストして、構成の問題がないことを確認します。

  1. sudo nginx -t

次に、エラーがない場合はNginxをリロードします。

  1. sudo systemctl reload nginx

今すぐアクセス phpinfo() http://nginx1your_domain/info.phpおよびhttp:// nginx2 にアクセスして、Webブラウザーで両方のNginx仮想ホストのファイルを作成します。 ] your_domain/info.php。 PHP変数セクションをもう一度見てください。

[“ SERVER_SOFTWARE”]は言うべきです nginx、ファイルがNginxによって直接提供されたことを示します。 [“ DOCUMENT_ROOT”] は、このステップの前半でNginxサイトごとに作成したディレクトリを指している必要があります。

この時点で、Nginxをインストールし、2つの仮想ホストを作成しました。 次に、Apacheでホストされているドメインを対象としたリクエストをプロキシするようにNginxを構成します。

ステップ7—Apacheの仮想ホスト用にNginxを構成する

複数のドメイン名を持つ追加のNginx仮想ホストを作成しましょう server_name ディレクティブ。 これらのドメイン名のリクエストはApacheにプロキシされます。

新しいNginx仮想ホストファイルを作成して、リクエストをApacheに転送します。

  1. sudo nano /etc/nginx/sites-available/apache

次のコードブロックを追加します。 両方のApache仮想ホストドメインの名前を指定し、それらのリクエストをApacheにプロキシします。 でパブリックIPアドレスを使用することを忘れないでください proxy_pass:

/ etc / nginx / sites-available / apache
server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;

    location / {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

ファイルを保存し、シンボリックリンクを作成してこの新しい仮想ホストを有効にします。

  1. sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

構成をテストして、エラーがないことを確認します。

  1. sudo nginx -t

エラーがない場合は、Nginxをリロードします。

  1. sudo systemctl reload nginx

ブラウザを開き、URLにアクセスします http://apache1.your_domain/info.php ブラウザで。 PHP変数セクションまで下にスクロールして、表示される値を確認します。

変数SERVER_SOFTWAREおよびDOCUMENT_ROOTは、この要求がApacheによって処理されたことを確認します。 変数HTTP_X_REAL_IPおよびHTTP_X_FORWARDED_FORはNginxによって追加され、URLへのアクセスに使用しているコンピューターのパブリックIPアドレスを表示する必要があります(ポートで直接Apacheにアクセスした場合) 8080 これらの変数は表示されません)。

特定のドメインのリクエストをApacheにプロキシするようにNginxを正常に設定しました。 次に、Apacheを設定して REMOTE_ADDR これらの要求を直接処理しているかのように変数。

ステップ8—インストールと構成 mod_rpaf

このステップでは、Apacheモジュールをインストールします。 mod_rpaf これは、リバースプロキシによって提供された値に基づいて REMOTE_ADDR HTTPS 、およびHTTPS_PORTの値を書き換えます。 このモジュールがないと、一部のPHPアプリケーションでは、プロキシの背後からシームレスに機能するためにコードを変更する必要があります。 このモジュールは、Ubuntuのリポジトリに次のように存在します。 libapache2-mod-rpaf ただし、古く、特定の構成ディレクティブをサポートしていません。 代わりに、ソースからインストールします。

ホームディレクトリに移動し、モジュールのビルドに必要なパッケージをインストールします。

  1. sudo apt install unzip build-essential apache2-dev

GitHubから最新の安定したリリースをダウンロードします。

  1. wget https://github.com/gnif/mod_rpaf/archive/stable.zip

ダウンロードしたファイルを抽出します。

  1. unzip stable.zip

ファイルを含む新しいディレクトリに移動します。

  1. cd mod_rpaf-stable

モジュールをコンパイルしてインストールします。

  1. make
  2. sudo make install

次に、ファイルを作成します mods-available ロードするディレクトリ rpaf モジュール:

  1. sudo nano /etc/apache2/mods-available/rpaf.load

次のコードをファイルに追加して、モジュールをロードします。

/etc/apache2/mods-available/rpaf.load
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

ファイルを保存して、エディターを終了します。

このディレクトリに別のファイルを作成します rpaf.conf の構成ディレクティブが含まれます mod_rpaf:

  1. sudo nano /etc/apache2/mods-available/rpaf.conf

次のコードブロックを追加して構成します mod_rpaf、サーバーのIPアドレスを必ず指定してください。

/etc/apache2/mods-available/rpaf.conf
    <IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           your_server_ip 
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
    </IfModule>

各ディレクティブの簡単な説明は次のとおりです。 を参照してください mod_rpaf 詳細については、READMEファイルを参照してください。

  • RPAF_Header-クライアントの実際のIPアドレスに使用するヘッダー。
  • RPAF_ProxyIPs-HTTPリクエストを調整するプロキシIP。
  • RPAF_SetHostName -vhost名を更新して、 ServerNameServerAlias 仕事。
  • RPAF_SetHTTPS-を設定します HTTPS に含まれる値に基づく環境変数 X-Forwarded-Proto.
  • RPAF_SetPort-を設定します SERVER_PORT 環境変数。 ApacheがSSLプロキシの背後にある場合に便利です。

保存する rpaf.conf モジュールを有効にします。

  1. sudo a2enmod rpaf

これにより、ファイルのシンボリックリンクが作成されます rpaf.loadrpaf.conf の中に mods-enabled ディレクトリ。 次に、構成テストを実行します。

  1. sudo apachectl -t

エラーがない場合は、Apacheをリロードします。

  1. sudo systemctl reload apache2

アクセスする phpinfo() ページ http://apache1.your_domain/info.phphttp://apache2.your_domain/info.php ブラウザでPHP変数セクションを確認してください。 REMOTE_ADDR 変数は、ローカルコンピューターのパブリックIPアドレスの変数にもなります。

次に、サイトごとにTLS/SSL暗号化を設定しましょう。

ステップ9— Let’sEncryptを使用したHTTPSWebサイトの設定(オプション)

このステップでは、Apacheでホストされている両方のドメインのTLS/SSL証明書を構成します。 [Let’s Encrypt](https://letsencrypt.org]から証明書を取得します。 NginxはSSLターミネーションをサポートしているため、Apacheの構成ファイルを変更せずにSSLを設定できます。 The mod_rpaf モジュールは、アプリケーションがSSLリバースプロキシの背後でシームレスに動作するように、必要な環境変数がApacheに設定されていることを確認します。

まず、 server {...} それぞれが独自のSSL証明書を持つことができるように、両方のドメインのブロック。 ファイルを開く /etc/nginx/sites-available/apache エディターで:

  1. sudo nano /etc/nginx/sites-available/apache

次のようにファイルを変更します。 apache1.your_domainapache2.your_domain 自分で server ブロック:

/ etc / nginx / sites-available / apache
    server {
        listen 80;
        server_name apache1.your_domain www.apache1.your_domain;
    
        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    server {
        listen 80;
        server_name apache2.your_domain www.apache2.your_domain;
    
        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

Certbotを使用してTLS/SSL証明書を生成します。 そのNginxプラグインは、Nginxの再構成と、必要に応じて構成の再読み込みを処理します。

インストール certbot スナップを使用して

  1. sudo snap install --classic certbot

インストールしたら、 certbot の証明書を生成するコマンド apache1.your_domainwww.apache1.your_domain:

  1. sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain

このコマンドは、Certbotに nginx プラグイン、使用 -d 証明書を有効にする名前を指定します。

次に、2番目のドメインに対してコマンドを実行します。

  1. sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache2.your_domain -d www.apache2.your_domain

ブラウザでApacheのドメインの1つにアクセスするには、 https:// プレフィックス; 訪問 https://apache1.your_domain/info.php また https://apache2.your_domain/info.php.

PHP変数セクションを見てください。 変数SERVER_PORT443に設定され、HTTPSonに設定されています。 これらの変数を設定すると、リバースプロキシの背後で動作するようにPHPアプリケーションを特別に構成する必要がなくなります。

それでは、Apacheへの直接アクセスを無効にしましょう。

ステップ10— Apacheへの直接アクセスをブロックする(オプション)

Apacheはポートでリッスンしているので 8080 パブリックIPアドレスでは、誰でもアクセスできます。 次のIPtablesコマンドをファイアウォールルールセットに適用することでブロックできます。

  1. sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset

強調表示されている例の代わりに、必ずサーバーのIPアドレスを使用してください。 一度ポート 8080 ファイアウォールでブロックされている場合は、Apacheがファイアウォールに到達できないことをテストします。 Webブラウザーを開き、ポートでApacheのドメイン名の1つにアクセスしてみてください 8080. 例: http://apache1your_domain:8080

ブラウザに「接続できません」または「Webページが利用できません」というエラーメッセージが表示されます。 IPtablesを使って tcp-reset オプションが設定されている場合、部外者はポート間の違いを認識しません 8080 そして、サービスが提供されていないポート。

注: IPtablesルールは、デフォルトではシステムの再起動後も存続しません。 IPtablesルールを保持する方法は複数ありますが、最も簡単な方法は iptables-persistent Ubuntuのリポジトリにあります。 この記事を調べて、IPTablesの構成方法の詳細を確認してください。

次に、Apacheサイトの静的ファイルを提供するようにNginxを構成しましょう。

ステップ11— Nginxを使用した静的ファイルの提供(オプション)

NginxがApacheのドメインのリクエストをプロキシすると、そのドメインのすべてのファイルリクエストがApacheに送信されます。 Nginxは、画像、JavaScript、スタイルシートなどの静的ファイルを提供する点でApacheよりも高速です。 それでは、Nginxを構成しましょう apache 静的ファイルを直接提供する仮想ホストファイルですが、PHPリクエストをApacheに送信します。

ファイルを開く /etc/nginx/sites-available/apache エディターで:

  1. sudo nano /etc/nginx/sites-available/apache

さらに2つ追加する必要があります location 各サーバーブロックへのブロック、および既存の変更 location セクション。 さらに、各サイトの静的ファイルの場所をNginxに指示する必要があります。

SSLおよびTLS証明書を使用しないことにした場合は、次のようにファイルを変更してください。

/ etc / nginx / sites-available / apache
server {
    listen 80;
    server_name apache2.your_domain www.apache2.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
}

server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }
}

HTTPSも使用できるようにする場合は、代わりに次の構成を使用してください。

/ etc / nginx / sites-available / apache
server {
    listen 80;
    server_name apache2.your_domain www.apache2.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name apache1.your_domain www.apache1.your_domain;
    root /var/www/your_domain;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

The try_files ディレクティブにより、Nginxはドキュメントルート内のファイルを検索し、それらを直接提供します。 ファイルに .php 拡張機能の場合、リクエストはApacheに渡されます。 ファイルがドキュメントルートに見つからない場合でも、リクエストはApacheに渡されるため、パーマリンクなどのアプリケーション機能は問題なく機能します。

警告: location ~ /\.ht ディレクティブは非常に重要です。 これにより、Nginxが次のようなApache構成ファイルのコンテンツを提供できなくなります。 .htaccess.htpasswd、機密情報が含まれています。

ファイルを保存し、構成テストを実行します。

  1. sudo nginx -t

テストが成功した場合は、Nginxをリロードします。

  1. sudo service nginx reload

動作していることを確認するために、Apacheのログファイルを調べることができます。 /var/log/apache2 とを参照してください GET のリクエスト info.php のファイル apache2.your_domainapache1.your_domain. 使用 tail コマンドを使用してファイルの最後の数行を表示し、 -f ファイルの変更を監視するように切り替えます。

  1. sudo tail -f /var/log/apache2/other_vhosts_access.log

今すぐ訪問 apache1.your_domain/info.php また apache2.your_domain/info.php ブラウザで、ログからの出力を確認します。 Apacheが実際に応答していることがわかります(ポートは 80 また 443 インスタンスを保護したかどうかによって異なります):

Output
apache2.your_domain:80 your_server_ip - - [27/Aug/2020:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"

次に、 index.html 各サイトのページが表示され、Apacheからのログエントリは表示されません。 Nginxがそれらにサービスを提供しています。

ログファイルの監視が終了したら、を押します。 CTRL+C それを尾行するのをやめる。

この設定では、Apacheは静的ファイルへのアクセスを制限できなくなります。 静的ファイルのアクセス制御は、Nginxで構成する必要があります apache 仮想ホストファイルですが、それはこのチュートリアルの範囲を超えています。

結論

これで、Nginxサービスを提供するUbuntuサーバーが1つあります。 nginx1.your_domainnginx2.your_domain、Apacheサービングと一緒に apache1.your_domainapache2.your_domain. NginxはApacheのリバースプロキシとして機能していますが、Nginxのプロキシサービスは透過的であり、Apacheのドメインへの接続はApache自体から直接提供されているように見えます。 この方法を使用して、安全で静的なサイトにサービスを提供できます。