1つのUbuntu18.04サーバーでNginxをWebサーバーおよびApacheのリバースプロキシとして構成する方法

提供:Dev Guides
移動先:案内検索

著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

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

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

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

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

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

前提条件

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

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

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

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

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

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

sudo apt update

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

sudo apt install apache2 php-fpm

FastCGI ApacheモジュールはUbuntuのリポジトリでは利用できないため、 kernel.org からダウンロードし、dpkgコマンドを使用してインストールします。

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

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

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

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

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

ポートを8080に設定して、新しいports.confファイルを作成します。

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

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


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

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

sudo a2dissite 000-default

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

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

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

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>

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

sudo a2ensite 001-default

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

sudo systemctl reload apache2

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

sudo netstat -tlpn

出力は次の例のようになり、apache28080をリッスンします。

OutputActive 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—mod_fastcgiを使用するようにApacheを設定する

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

注: mod_phpを使用したLAMPの既存のインストールでこのチュートリアルを試している場合は、最初にsudo a2dismod php7.2で無効にしてください。


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

sudo a2enmod actions

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

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

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

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

次のディレクティブをファイルに追加して、.phpファイルのリクエストをPHP-FPMUNIXソケットに渡します。

/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.2-fpm.sock -pass-header Authorization
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

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

sudo apachectl -t

Syntax OK が表示されたら、Apacheをリロードします。

sudo systemctl reload apache2

警告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からPHPを提供できることを確認しましょう。

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

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

phpinfo関数の呼び出しを含むファイル/var/www/html/info.phpを作成します。

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

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

まず、ファイアウォールを通過するポート8080を許可します。

sudo ufw allow 8080

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

Apache Fullがポート80および443でのトラフィックを許可することを許可します。

sudo ufw allow "Apache Full"

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

sudo ufw status

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

OutputTo                         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)

ポート8080およびApache Fullが他のファイアウォールルールと一緒に許可されていることがわかります。 それでは、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用の仮想ホストを作成する

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

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

sudo mkdir -v /var/www/foobar.net /var/www/test.io

次に、サイトごとにindexファイルを作成します。

echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/index.html

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

echo "<?php phpinfo(); ?>" | sudo tee /var/www/foobar.net/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php

次に、foobar.netドメインの仮想ホストファイルを作成します。

sudo nano /etc/apache2/sites-available/foobar.net.conf

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

/etc/apache2/sites-available/foobar.net.conf

    <VirtualHost *:8080>
        ServerName foobar.net
        ServerAlias www.foobar.net
        DocumentRoot /var/www/foobar.net
        <Directory /var/www/foobar.net>
            AllowOverride All
        </Directory>
    </VirtualHost>

AllowOverride Allの行は、.htaccessのサポートを有効にします。

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

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

sudo nano /etc/apache2/sites-available/test.io.conf

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

/etc/apache2/sites-available/test.io.conf

    <VirtualHost *:8080>
        ServerName test.io
        ServerAlias www.test.io
        DocumentRoot /var/www/test.io
        <Directory /var/www/test.io>
            AllowOverride All
        </Directory>
    </VirtualHost>

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

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

sudo a2ensite foobar.net
sudo a2ensite test.io

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

sudo apachectl -t

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

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

sudo systemctl reload apache2

サイトが機能していることを確認するには、ブラウザでhttp://foobar.net:8080http://test.io:8080を開き、各サイトにindex.htmlファイルが表示されていることを確認します。

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

また、各サイトの info.php ファイルにアクセスして、PHPが機能していることを確認します。 ブラウザでhttp://foobar.net:8080/info.phpおよびhttp://test.io:8080/info.phpにアクセスします。

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

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

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

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

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

sudo apt install nginx

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

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

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

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

sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org

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

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

echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php

次に、ドメインexample.comの仮想ホストファイルを作成します。

sudo nano /etc/nginx/sites-available/example.com

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

/etc/nginx/sites-available/example.com

server {
    listen 80 default_server;

    root /usr/share/nginx/example.com;
    index index.php index.html index.htm;

    server_name example.com www.example.com;
    location / {
        try_files $uri $uri/ /index.php;
    }

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

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

sudo nano etc/nginx/sites-available/sample.org

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

/etc/nginx/sites-available/sample.org

server {
    root /usr/share/nginx/sample.org;
    index index.php index.html index.htm;

    server_name sample.org www.sample.org;
    location / {
        try_files $uri $uri/ /index.php;
    }

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

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

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

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

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

sudo nginx -t

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

sudo systemctl reload nginx

次に、 http://example.com/info.phpおよびhttp://sample.org/にアクセスして、WebブラウザーでNginx仮想ホストのphpinfo()ファイルにアクセスします。 info.php。 PHP変数セクションをもう一度見てください。

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

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

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

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

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

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

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

/ etc / nginx / sites-available / apache

server {
    listen 80;
    server_name foobar.net www.foobar.net test.io www.test.io;

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

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

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

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

sudo nginx -t

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

sudo systemctl reload nginx

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

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

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

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

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

モジュールのビルドに必要なパッケージをインストールします。

sudo apt install unzip build-essential apache2-dev

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

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

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

unzip stable.zip

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

cd mod_rpaf-stable

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

make
sudo make install

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

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の構成ディレクティブが含まれています。

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 -X-Forwarded-Protoに含まれる値に基づいて、HTTPS環境変数を設定します。
  • RPAF_SetPort-SERVER_PORT環境変数を設定します。 ApacheがSSLプロキシの背後にある場合に便利です。

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

sudo a2enmod rpaf

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

sudo apachectl -t

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

sudo systemctl reload apache2

ブラウザでphpinfo()ページhttp://foobar.net/info.phpおよびhttp://test.io/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をセットアップできます。 mod_rpafモジュールは、アプリケーションがSSLリバースプロキシの背後でシームレスに動作するように、必要な環境変数がApacheに設定されていることを確認します。

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

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

foobar.nettest.ioをそれぞれのserverブロックに入れて、次のようにファイルを変更します。

/ etc / nginx / sites-available / apache

    server {
        listen 80;
        server_name foobar.net www.foobar.net;
    
        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 test.io www.test.io;
    
        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リポジトリを追加します。

sudo add-apt-repository ppa:certbot/certbot

新しいリポジトリを追加することを確認するプロンプトが表示されたら、ENTERを押します。 次に、パッケージリストを更新して、新しいリポジトリのパッケージ情報を取得します。

sudo apt update

次に、aptを使用してCertbotのNginxパッケージをインストールします。

sudo apt install python-certbot-nginx

インストールしたら、certbotコマンドを使用して、foobar.netおよびwww.foobar.netの証明書を生成します。

sudo certbot --nginx -d foobar.net -d www.foobar.net

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

certbotを初めて実行する場合は、メールアドレスを入力して利用規約に同意するよう求められます。 その後、certbotはLet'sEncryptサーバーと通信し、チャレンジを実行して、証明書を要求しているドメインを制御していることを確認します。

次に、Certbotは、HTTPS設定をどのように構成するかを尋ねます。

OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

選択して、ENTERを押します。 構成が更新され、Nginxがリロードして新しい設定を取得します。

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

sudo certbot --nginx -d test.io -d www.test.io

https://プレフィックスを使用して、ブラウザでApacheのドメインの1つにアクセスします。 https://foobar.net/info.phpにアクセスすると、次のように表示されます。

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

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

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

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

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

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

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

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


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

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

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

エディターでファイル/etc/nginx/sites-available/apacheを開きます。

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

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

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

/ etc / nginx / sites-available / apache

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    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 foobar.net www.foobar.net;
    root /var/www/foobar.net;
    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 test.io www.test.io;
    root /var/www/test.io;
    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/test.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    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/foobar.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/foobar.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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


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

sudo nginx -t

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

sudo service nginx reload

動作を確認するには、/var/log/apache2のApacheのログファイルを調べて、test.ioおよび[のinfo.phpファイルに対するGETリクエストを確認します。 X154X]。 tailコマンドを使用してファイルの最後の数行を確認し、-fスイッチを使用してファイルの変更を監視します。

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

次に、ブラウザでhttp://test.io/info.phpにアクセスし、ログからの出力を確認します。 Apacheが実際に応答していることがわかります。

Output    test.io:80 your_server_ip - - [01/Jul/2016: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/47.0.2526.111 Safari/537.36"

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

ログファイルの監視が終了したら、CTRL+Cを押してログの末尾を停止します。

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

結論

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