作者はhttps://www.brightfunds.org/organizations/electronic-frontier-foundation-inc[Electronic Frontier Foundation]を選択して、https://do.co/w4do-cta [Write for DOnations]プログラム。

前書き

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

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

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

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

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

前提条件

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

  • Ubuntu 18.04での初期サーバー設定に従って構成された新しいUbuntu 18.04サーバー。 rootユーザーとファイアウォール。

  • サーバーのIPアドレスを指すように構成された4つの完全修飾ドメイン名。 例については、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [DigitalOceanでホスト名を設定する方法]のステップ3を参照してください。これを行う方法。 ドメインのDNSを他の場所でホストしている場合は、代わりに適切なAレコードを作成する必要があります。

ステップ1-ApacheおよびPHP-FPMのインストール

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

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

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

sudo apt update

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

sudo apt install apache2 php-fpm

FastCGI ApacheモジュールはUbuntuのリポジトリで利用できないため、https://kernel.org [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

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

ステップ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 " | sudo tee /etc/apache2/ports.conf

次に、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 *:>
   ServerAdmin [email protected]
   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

出力は次の例のようになり、「+ apache2 」は「+8080」をリッスンします。

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 :::22             :::*                 LISTEN   1086/sshd

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

ステップ3-mod_fastcgiを使用するためのApacheの構成

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

`+ 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-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.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

127.0.1.1を使用して、「+ Couldがサーバーの完全修飾ドメイン名を確実に判断できませんでした」という警告が表示された場合。 ‘ServerName’ディレクティブをグローバルに設定してこのメ​​ッセージを抑制します。+ `、今のところ無視しても問題ありません。 後でサーバー名を構成します。

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

ステップ4-PHP機能の検証

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

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

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

ブラウザでファイルを見るには、 `+ http://:8080 / info.php`にアクセスしてください。 これにより、PHPが使用している構成設定のリストが表示されます。 次のような出力が表示されます。

image:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/qQcGNe8.png [phpinfoサーバーAPI]

image:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/eBuDnVU.png [phpinfo PHP変数]

ページの上部で、* Server API FPM / FastCGI と表示されていることを確認します。 ページの3分の2ほど下にある PHP変数*セクションに、* SERVER_SOFTWARE *がUbuntu上のApacheであることが表示されます。 これらは、 `+ mod_fastcgi +`がアクティブであり、ApacheがPHP-FPMを使用してPHPファイルを処理していることを確認します。

ステップ5-Apache用の仮想ホストの作成

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

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

sudo mkdir -v /var/www/ /var/www/

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

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

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

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

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

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

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

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

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

行「+ AllowOverride All 」は「 .htaccess +」サポートを有効にします。

これらは最も基本的なディレクティブのみです。 Apacheでの仮想ホストのセットアップに関する完全なガイドについては、https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-16-04 [How Ubuntu 16.04でApache仮想ホストをセットアップするには]。

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

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

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

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

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

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

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

sudo a2ensite
sudo a2ensite

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

sudo apachectl -t

エラーがない場合は、*構文OK *が表示されます。 他に表示されている場合は、構成を確認して再試行してください。

構成にエラーがなければ、Apacheをリロードして変更を適用します。

sudo systemctl reload apache2

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

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

画像:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/2y1R8Zd.png [foobar.net index page]

画像:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/wr1pzEj.png [test.ioインデックスページ]

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

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

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

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

このステップでは、Nginxをインストールし、ドメイン「+ example.com 」と「 sample.org +」をNginxの仮想ホストとして設定します。 Nginxでの仮想ホストのセットアップに関する完全なガイドについては、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04#step-5-%E2%を参照してください。 80%93-setting-up-server-blocks-(推奨)[Ubuntu 18.04でNginxサーバーブロック(仮想ホスト)をセットアップする方法]。

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

sudo apt install nginx

次に、デフォルトの仮想ホストのシンボリックリンクを使用しなくなりますので、削除します。

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

独自のデフォルトサイトレター( + example.com +)を作成します。

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

sudo mkdir -v /usr/share/nginx/ /usr/share/nginx/

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

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

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

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

sudo nano /etc/nginx/sites-available/

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

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

server {
   listen 80 default_server;

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

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

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

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

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

   server_name ;
   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/ /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

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

sudo nginx -t

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

sudo systemctl reload nginx

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

image:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/1FZeLUe.png [Nginx PHP Variables]

  • [“ 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にプロキシする次のコードブロックを追加します。 `+ proxy_pass +`でパブリックIPアドレスを使用することを忘れないでください:

/ etc / nginx / sites-available / apache

server {
   listen 80;
   server_name ;

   location / {
       proxy_pass http://: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

ブラウザーを開き、ブラウザーでURL `+ http:/// info.php +`にアクセスします。 * PHP Variables *セクションまでスクロールダウンし、表示された値を確認します。

image:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/1XQi5kl.png [Nginx経由のApacheのphpinfo]

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

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

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

このステップでは、リバースプロキシが提供する値に基づいて* REMOTE_ADDR HTTPS および HTTP_PORT *の値を書き換える「+ mod \ _rpaf 」というApacheモジュールをインストールします。 このモジュールがないと、一部の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
       RPAF_SetHostName        On
       RPAF_SetHTTPS           On
       RPAF_SetPort            On
   </IfModule>

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

  • * RPAF_Header *-クライアントの実際のIPアドレスに使用するヘッダー。

  • * RPAF_ProxyIPs *-HTTPリクエストを調整するプロキシIP。

  • * RPAF_SetHostName *-vhost名を更新して、「+ ServerName 」と「 ServerAlias +」が機能するようにします。

  • * RPAF_SetHTTPS *-`+ X-Forwarded-Proto `に含まれる値に基づいて ` HTTPS +`環境変数を設定します。

  • * RPAF_SetPort *-`+ SERVER_PORT +`環境変数を設定します。 ApacheがSSLプロキシの背後にある場合に役立ちます。

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

sudo a2enmod rpaf

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

sudo apachectl -t

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

sudo systemctl reload apache2

ブラウザの `+ phpinfo()`ページの ` http:/// info.php `および ` http:/// info.php +`にアクセスし、* PHP変数*セクションを確認します。 * REMOTE_ADDR *変数は、ローカルコンピューターのパブリックIPアドレスの変数にもな​​ります。

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

ステップ9-Let’s Encryptを使用したHTTPS Webサイトのセットアップ(オプション)

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

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

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

`+ foobar.net `と ` test.io `を独自の ` server +`ブロックに入れて、次のようにファイルを変更します。

/ etc / nginx / sites-available / apache

   server {
       listen 80;
       server_name ;

       location / {
           proxy_pass http://: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 ;

       location / {
           proxy_pass http://: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;
       }
   }

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

まず、公式のCertbotリポジトリを追加します。

sudo add-apt-repository ppa:certbot/certbot

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

sudo apt update

次に、CertbotのNginxパッケージを `+ apt +`でインストールします。

sudo apt install python-certbot-nginx

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

sudo certbot --nginx -d  -d

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

初めて `+ certbot `を実行する場合は、電子メールアドレスを入力し、利用規約に同意するよう求められます。 これを行った後、「 certbot +」はLet’s Encryptサーバーと通信し、チャレンジを実行して、証明書を要求しているドメインを制御していることを確認します。

次に、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  -d

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

画像:https://assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/KK6AmWV.png [phpinfo ssl]

  • PHP変数*セクションを見てください。 変数* SERVER_PORT 443 に設定され、 HTTPS on *に設定されています。これは、ApacheがHTTPS経由で直接アクセスされているかのようです。 これらの変数を設定すると、リバースプロキシの背後で動作するようにPHPアプリケーションを特別に構成する必要がなくなります。

次に、Apacheへの直接アクセスを無効にします。

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

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

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

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

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

次に、Nginxを設定して、Apacheサイトの静的ファイルを提供します。

手順11-Nginxを使用した静的ファイルの提供(オプション)

Nginxは、Apacheのドメインへのリクエストをプロキシするとき、そのドメインへのすべてのファイルリクエストをApacheに送信します。 Nginxは、画像、JavaScript、スタイルシートなどの静的ファイルの提供において、Apacheよりも高速です。 そこで、Nginxの「+ apache +」仮想ホストファイルを設定して、静的ファイルを直接提供し、PHPリクエストを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 ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       proxy_pass http://: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 ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       proxy_pass http://: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 ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       proxy_pass http://: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//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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

   location ~ \.php$ {
       proxy_pass http://: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//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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

sudo nginx -t

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

sudo service nginx reload

動作していることを確認するには、 + / var / log / apache2 +`のApacheのログファイルを調べ、 `+ test.io +`と `+ foobarの + info.php + ファイルに対する + GET + `リクエストを確認します。 .net + `。 `+ tail `コマンドを使用してファイルの最後の数行を表示し、 ` -f +`スイッチを使用してファイルの変更を監視します。

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

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

Output     - - [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 +」仮想ホストファイルで設定する必要がありますが、これはこのチュートリアルの範囲外です。

結論

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