1つのUbuntu 14.04ドロップレットでNginxをWebサーバーおよびApacheのリバースプロキシとして構成する方法

前書き

ApacheとNginxは、PHPでよく使用される2つの人気のあるオープンソースWebサーバーです。 要件が異なる複数のWebサイトをホストする場合、同じ仮想マシンで両方を実行すると便利です。 単一のシステムで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によって提供されます。

前提条件

  • 新しいUbuntu 14.04ドロップレット。

  • sudo権限を持つ標準ユーザーアカウント。 Initial Server Setup with Ubuntu 14.04の手順2と3に従って、標準アカウントを設定できます。

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

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

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

[[step-1 -—- installing-apache-and-php5-fpm]] ==ステップ1—ApacheとPHP5-FPMのインストール

ApacheとPHP-FPMに加えて、PHP FastCGI Apacheモジュールもインストールする必要があります。 これは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

[[step-2 -—- configuring-apache-and-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を保存して終了します。

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

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

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

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

それをに変更してください。

ファイルを保存し、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

[[step-3 -—- configuring-apache-to-use-mod_fastcgi]] ==ステップ3—mod_fastcgiを使用するようにApacheを設定する

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

Note: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

Apache 2.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
 
  Require all granted
 

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

[[step-4 -—- verifying-php-functionality]] ==ステップ4—PHP機能の検証

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

echo "" | sudo tee /var/www/html/info.php

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

phpinfo Server API

phpinfo PHP Variables

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

[[step-5 -—- creating-virtual-hosts-for-apache]] ==ステップ5—Apache用の仮想ホストの作成

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

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

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

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

echo "

Foo Bar

" | sudo tee /var/www/foobar.net/index.html
echo "

Test IO

" | sudo tee /var/www/test.io/index.html

次に、phpinfo()ファイル。

echo "" | sudo tee /var/www/foobar.net/info.php
echo "" | sudo tee /var/www/test.io/info.php

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

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

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


    ServerName foobar.net
    ServerAlias www.foobar.net
    DocumentRoot /var/www/foobar.net
    
        AllowOverride All
    

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

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

    ServerName test.io
    ServerAlias www.test.io
    DocumentRoot /var/www/test.io
    
        AllowOverride All
    

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

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

両方の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構成仕様リストが各サイトに表示されるはずです。 これで、Apacheのポート8080で2つのWebサイトがホストされました。

[[step-6 -—- installing-and-configuring-nginx]] ==ステップ6—Nginxのインストールと構成

このステップでは、Nginxをインストールし、ドメインexample.comsample.orgをNginxの仮想ホストとして構成します。 Nginxで仮想ホストを設定するための完全なガイドについては、How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 14.04 LTSを参照してください。

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

sudo apt-get install nginx

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

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

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

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

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

echo "

Example.com

" | sudo tee /usr/share/nginx/example.com/index.html
echo "

Sample.org

" | sudo tee /usr/share/nginx/sample.org/index.html
echo "" | sudo tee /usr/share/nginx/example.com/info.php
echo "" | sudo tee /usr/share/nginx/sample.org/info.php

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

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

Nginxは、構成ファイルserver blocksserver {. . .}領域を呼び出します。 プライマリ仮想ホスト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

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

Nginx PHP Variables

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

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

[[step-7 -—- configuring-nginx-for-apache-39-s-virtual-hosts]] ==ステップ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 Variablesセクションまで下にスクロールして、表示される値を確認します。

phpinfo of Apache via Nginx

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

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

[[step-8 -—- installing-and-configuring-mod_rpaf]] ==ステップ8—mod_rpafのインストールと構成

このステップでは、mod_rpafという名前のApacheモジュールをインストールします。このモジュールは、リバースプロキシによって提供された値に基づいてREMOTE_ADDRHTTPS、および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

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

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アドレスを必ず追加してください。


        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           111.111.111.111
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On

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

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

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

  • RPAF_SetHostName-ServerNameとServerAliasが機能するように、仮想ホスト名を更新します。

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

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

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

sudo a2enmod rpaf

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

sudo apachectl -t

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

sudo service apache2 reload

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

[[step-9 -—- setting-up-https-websites-optional]] ==ステップ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 Variablesセクションを見てください。 ApacheがHTTPS経由で直接アクセスされたかのように、変数SERVER_PORT443に設定され、HTTPSonに設定されています。 これらの変数を設定すると、リバースプロキシの背後で動作するようにPHPアプリケーションを特別に構成する必要がなくなります。

[[step-10 -—- blocking-direct-access-to-apache-optional]] ==ステップ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

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

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

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

[[step-11 -—- serving-static-files-using-nginx-optional]] ==ステップ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はdocument root内のファイルを検索し、それらを直接提供します。 ファイルの拡張子が.phpの場合、リクエストはApacheに渡されます。 ファイルがdocument rootに見つからない場合でも、リクエストはApacheに渡されるため、パーマリンクなどのアプリケーション機能は問題なく機能します。

ファイルを安全にし、構成テストを実行します。

sudo service nginx configtest

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

sudo service nginx reload

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

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

結論

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

Related