序章

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のリバースプロキシの両方として構成する方法をすべて1つのドロップレットで示します。 Webアプリケーションによっては、特にSSLサイトが構成されている場合、Apacheのリバースプロキシ対応を維持するためにコードの変更が必要になる場合があります。 これを確実にするために、 mod_rpaf という名前のApacheモジュールをインストールします。これは、特定の環境変数を書き換えて、ApacheがWebクライアントからの要求を直接処理しているように見せます。

1つのドロップレットで4つのドメイン名をホストします。 Nginxは、example.com(デフォルトの仮想ホスト)とsample.orgの2つを提供します。 残りの2つ、foobar.nettest.ioは、Apacheによって提供されます。

前提条件

  • 新しいUbuntu14.04ドロップレット。

  • sudo権限を持つ標準ユーザーアカウント。 Ubuntu 14.04 を使用したサーバーの初期設定の手順2と3に従って、標準アカウントを設定できます。

  • 目的のドメイン名は、DigitalOceanコントロールパネルのDropletのIPアドレスを指している必要があります。 これを行う方法の例については、DigitalOceanを使用してホスト名を設定する方法のステップ3を参照してください。 ドメインのDNSを他の場所でホストする場合は、代わりに適切なAレコードを作成する必要があります。

オプションのリファレンス

このチュートリアルでは、ApacheとNginxの仮想ホスト、およびSSL証明書の作成と構成に関する基本的な知識が必要です。 これらのトピックの詳細については、次の記事を参照してください。

ステップ1—ApacheとPHP5-FPMをインストールする

ApacheとPHP-FPMに加えて、PHPFastCGIApacheモジュールもインストールする必要があります。 これはlibapache2-mod-fastcgiで、Ubuntuの multiverse リポジトリで利用できます。最初に、sources.listファイルで有効にする必要があります。

sudo nano /etc/apt/sources.list

次の行を見つけて、先頭のハッシュ記号(#)を削除してコメントを外します。

# deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

# deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse

これで、以下に示す内容が残ります。

 deb http://mirrors.digitalocean.com/ubuntu trusty multiverse

 . . .

 deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse

ファイルを保存し、aptリポジトリを更新します。

sudo apt-get update

次に、必要なパッケージをインストールします。

sudo apt-get install apache2 libapache2-mod-fastcgi php5-fpm

ステップ2—ApacheおよびPHP5-FPMの構成

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

sudo nano /etc/apache2/ports.conf

次の行を見つけます。

Listen 80

次のように変更します。

Listen 8080

ports.confを保存して終了します。

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

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

sudo nano /etc/apache2/sites-available/000-default.conf

最初の行は次のようになります。

<VirtualHost *:80>

次のように変更します。

<VirtualHost *:8080>

ファイルを保存し、Apacheをリロードします。

sudo service apache2 reload

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

sudo netstat -tlpn

apache2:::8080 をリッスンしている状態で、出力は次のようになります。

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

ステップ3—mod_fastcgiを使用するようにApacheを設定する

Apacheはデフォルトでmod_phpで動作しますが、PHP5-FPMで動作するには追加の設定が必要です。

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

sudo a2dismod php5

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

sudo a2enmod actions

ドロップレットにインストールされているApacheのバージョンを確認するには、次のコマンドを使用します。

sudo apache2 -v

それに応じてfastcgi構成ファイルを編集します。 これらの構成ディレクティブは、.phpファイルの要求をPHP5-FPMUNIXソケットに渡します。

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

Apache2.4<IfModule mod_fastcgi.c> . . . </IfModule>ブロックの下部に次の行を追加します。

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
  Require all granted
 </Directory>

Apache 2.2<Directory>セクションを必要としないため、以下を追加します。

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

fastcgi.confで終了したら、構成テストを実行します。

sudo apachectl -t

Syntax OK が表示されたら、Apacheをリロードします。 警告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.が表示された場合は、問題ありません。 今は影響しません。

sudo service apache2 reload

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

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

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

ブラウザでファイルを表示するには、http://111.111.111.111:8080/info.phpに移動しますが、DropletのIPアドレスを使用します。 これにより、PHPが使用している構成仕様のリストが表示されます。

phpinfo Server API

phpinfo PHP Variables

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

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

ドメインfoobar.nettest.io用に2つのApache仮想ホストファイルを作成します。 これは、両方のサイトの documentrootディレクトリを作成することから始まります。

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

次に、セットアップの完了後にテストするために、各ディレクトリに2つのファイルを追加します。

まず、サイトごとに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()ファイル。

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

その中に次のディレクティブを配置します。

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

ファイルを保存して閉じます。 次に、test.ioについても同じようにします。

sudo nano /etc/apache2/sites-available/test.io.conf
<VirtualHost *:*>
	ServerName test.io
	ServerAlias www.test.io
	DocumentRoot /var/www/test.io
	<Directory /var/www/test.io>
		AllowOverride All
	</Directory>
</VirtualHost>

注1: AllowOverride All enables .htaccess support.

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

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

sudo a2ensite foobar.net
sudo a2ensite test.io

Apacheで構成エラーを再度確認してください。

sudo apachectl -t

Syntax OK が表示されたら、リロードしてください。

sudo service apache2 reload

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

君は見るべきだ:

foobar.net index page

test.io index page

また、 info.php ファイルhttp://foobar.net:8080/info.phpおよびhttp://test.io:8080/info.phpにアクセスして、PHPが機能しているかどうかを確認します。

手順1で見たのと同じPHP構成仕様リストが各サイトに表示されます。 現在、ポート8080でApacheでホストされている2つのWebサイトがあります。

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

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

Nginxをインストールします。

sudo apt-get install nginx

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

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

次に、Nginxの仮想ホストを作成します。 まず、両方のWebサイトの documentrootディレクトリを作成します。

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

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要求を処理します。

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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

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

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

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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

ファイルを保存して閉じます。 次に、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 service nginx configtest

次に、 OK が表示されたら、Nginxをリロードします。

sudo service nginx reload

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

Nginx PHP Variables

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

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

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

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

新しいNginx仮想ホストファイルを作成します。

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

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

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

	location / {
		proxy_pass http://111.111.111.111: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 service nginx configtest

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

sudo service nginx reload

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

phpinfo of Apache via Nginx

変数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_ADDR HTTPS 、およびHTTP_PORTの値を書き換えます。リバースプロキシによる。 このモジュールがないと、一部のPHPアプリケーションでは、プロキシの背後からシームレスに機能するためにコードを変更する必要があります。 このモジュールはUbuntuのリポジトリにlibapache2-mod-rpafとして存在しますが、古く、特定の構成ディレクティブをサポートしていません。 代わりに、ソースからインストールします。

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

sudo apt-get install unzip build-essential apache2-threaded-dev

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

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

でそれを抽出します:

unzip stable.zip

作業ディレクトリに移動します。

cd mod_rpaf-stable

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

sudo make
sudo make install

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

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

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

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

このディレクトリに別のファイルを作成します。 これには、構成ディレクティブが含まれます。

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

次のコードブロックを追加します。必ずドロップレットのIPアドレスを追加してください。

<IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           111.111.111.111
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
</IfModule>

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

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

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

sudo a2enmod rpaf

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

sudo apachectl -t

Syntax OK が返された場合は、Apacheをリロードします。

sudo service apache2 reload

ブラウザでApacheのWebサイトのphpinfo()ページにアクセスし、PHP変数セクションを確認します。 REMOTE_ADDR 変数は、ローカルコンピューターのパブリックIPアドレスの変数にもなります。

手順9— HTTPS Webサイトの設定(オプション)

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

SSL証明書とその秘密鍵用のディレクトリを作成します。

sudo mkdir /etc/nginx/ssl

この記事では、有効期間が10年の自己署名SSL証明書を使用します。 foobar.nettest.ioの両方の自己署名証明書を生成します。

sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/foobar.net-key.pem -out /etc/nginx/ssl/foobar.net-cert.pem -days 3650 -nodes
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.io-key.pem -out /etc/nginx/ssl/test.io-cert.pem -days 3650 -nodes

毎回、証明書識別の詳細の入力を求められます。

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:

次に、NginxからApacheにリクエストをプロキシするapache仮想ホストファイルを開きます。

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

ドメインごとに個別の証明書とキーがあるため、ドメインごとに個別のserver { . . . }ブロックを用意する必要があります。 現在の内容を削除する必要があります。終了すると、apache仮想ホストファイルは次のようになります。

server {
	listen 80;
	listen 443 ssl;
	server_name test.io www.test.io;

	ssl on;
	ssl_certificate /etc/nginx/ssl/test.io-cert.pem;
	ssl_certificate_key /etc/nginx/ssl/test.io-key.pem;

	location / {
		proxy_pass http://111.111.111.111: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;
	listen 443 ssl;
	server_name foobar.net www.foobar.net;

	ssl on;
	ssl_certificate /etc/nginx/ssl/foobar.net-cert.pem;
	ssl_certificate_key /etc/nginx/ssl/foobar.net-key.pem;

	location / {
		proxy_pass http://111.111.111.111: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 service nginx configtest

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

sudo service nginx reload

https://プレフィックスを付けてブラウザ経由でApacheのドメインの1つにアクセスします:https://foobar.net/info.php

phpinfo ssl

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

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

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

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

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

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

注: IPtablesルールは、デフォルトではシステムの再起動後も存続しません。 IPtablesルールを保持する方法は複数ありますが、最も簡単なのは、Ubuntuのリポジトリでiptables-persistentを使用することです。

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

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

apache仮想ホストファイルを開きます。

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

以下のコードブロックに赤で示されているように、各サーバーブロックに2つのlocationブロックを追加します。

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://111.111.111.111: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 ~ /\. {
		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://111.111.111.111: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 ~ /\. {
		deny all;
	}
}

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

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

sudo service nginx configtest

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

sudo service nginx reload

これが機能していることを確認するには、/var/log/apache2内のApacheのログファイルを調べて、test.ioおよびfoobar.netindex.phpファイルに対するGETリクエストを確認します。 この設定の唯一の注意点は、Apacheが静的ファイルへのアクセスを制限できないことです。 静的ファイルのアクセス制御は、Nginxのapache仮想ホストファイルで構成する必要があります。

警告:location ~ /\.ディレクティブを含めることは非常に重要です。 これにより、Nginxが.htaccess.htpasswdなどのファイルの内容を印刷できなくなります。

結論

このチュートリアルを完了すると、Nginxがexample.comsample.orgを提供し、Apacheがfoobar.nettest.ioを提供するUbuntuドロップレットが1つ作成されます。 NginxはApacheのリバースプロキシとして機能していますが、Nginxのプロキシサービスは透過的であり、Apacheのドメインへの接続はApache自体から直接提供されているように見えます。