1つのUbuntu20.04サーバーでNginxをWebサーバーおよびApacheのリバースプロキシとして構成する方法
序章
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_domain
と apache2.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アプリケーションをサポートします。
まず、パッケージリストを更新して、最新のパッケージがあることを確認します。
- 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
を使用してPHP-FPMで動作するように構成します mod_fastcgi
モジュール。 Apacheの名前を変更します ports.conf
構成ファイル:
- sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
新しいを作成します ports.conf
ポートがに設定されたファイル 8080
:
- 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
.
デフォルトの仮想ホストを無効にします。
- 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
:
<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
をインストールします net-tools
を含むパッケージ netstat
指図:
- sudo apt install net-tools
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 :::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
デフォルトでは無効になっているため、最初に有効にする必要があります。
- 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ソケットへのファイル:
<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>
変更を保存して、構成テストを実行します。
- 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
表示されています:
- sudo systemctl reload apache2
それでは、ApacheからPHPを提供できることを確認しましょう。
ステップ4—PHPの機能を確認する
PHPを作成して、PHPが機能することを確認しましょう。 phpinfo()
ファイルを作成し、Webブラウザからアクセスします。
ファイルを作成する /var/www/html/info.php
、への呼び出しが含まれています phpinfo
働き:
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
前提条件セクションのサーバーの初期設定に従った場合は、Apacheファイアウォールを有効にしている可能性があります。 先に進んで、ポートでIPにアクセスできることを確認しましょう 8080
、現在アクセスできません。 ステップ10で、このポートへのパブリックアクセスを制限します。
最初にポートを許可する 8080
ファイアウォールを介して:
- sudo ufw allow 8080
Apacheドメインを保護するので、先に進んで、ポートでのTLSトラフィックを確認しましょう 443
入ることができます。
許可する 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
ページ。
を見るには info.php
ブラウザで、に移動します http://your_server_ip:8080/info.php
. これにより、PHPが使用している構成設定のリストが表示されます。 次のような出力が表示されます。
ページの上部で、サーバーAPIがFPM /FastCGIと表示されていることを確認します。 ページの約3分の2のところにあるPHP変数セクションでは、SERVER_SOFTWAREがUbuntu上のApacheであることがわかります。 これらはそれを確認します mod_fastcgi
はアクティブであり、ApacheはPHP-FPMを使用してPHPファイルを処理しています。
ステップ5—Apache用の仮想ホストを作成する
ドメイン用のApache仮想ホストファイルを作成しましょう apache1.your_domain
と apache2.your_domain
. これを行うには、最初に両方のサイトのドキュメントルートディレクトリを作成し、それらのディレクトリにいくつかのデフォルトファイルを配置して、構成を簡単にテストできるようにします。
まず、ドキュメントのルートディレクトリを作成します。
- sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
次に、を作成します index
各サイトのファイル:
- echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
- echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
次に、を作成します phpinfo()
PHPが適切に構成されていることをテストできるように、サイトごとにファイルを作成します。
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
次に、の仮想ホストファイルを作成します apache1.your_domain
:
- sudo nano /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
. 最初にファイルを作成します。
- sudo nano /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
ディレクトリ:
- sudo a2ensite apache1.your_domain
- sudo a2ensite apache2.your_domain
Apacheで構成エラーを再度確認します。
- sudo apachectl -t
わかるでしょ Syntax OK
エラーがない場合に表示されます。 他に何かが表示された場合は、構成を確認して再試行してください。
構成にエラーがなくなったら、Apacheをリロードして変更を適用します。
- sudo systemctl reload apache2
サイトが機能していることを確認するには、 http://apache1.your_domain:8080
と http://apache2.your_domain:8080
ブラウザで、各サイトに index.html
ファイル。
次の結果が表示されます。
また、PHPにアクセスして、PHPが機能していることを確認します。 info.php
各サイトのファイル。 訪問 http://apache1.your_domain:8080/info.php
と http://apache2.your_domain:8080/info.php
ブラウザで。
ステップ4で見たのと同じPHP構成仕様リストが各サイトに表示されます。
現在、Apacheでホストされている2つのWebサイトがポートにあります 8080
. 次にNginxを設定しましょう。
ステップ6—Nginxのインストールと構成
このステップでは、Nginxをインストールしてドメインを構成します nginx1.your_domain
と nginx2.your_domain
Nginxの仮想ホストとして。 Nginxで仮想ホストを設定するための完全なガイドについては、 Ubuntu 20.04 でNginxサーバーブロック(仮想ホスト)を設定する方法を参照してください。
を使用してNginxをインストールします apt
パッケージマネージャー:
- sudo apt install nginx
次に、デフォルトの仮想ホストのsymlinkを削除します。これは、これ以上使用しないためです。
- sudo rm /etc/nginx/sites-enabled/default
後で独自のデフォルトサイトを作成します(nginx1.your_domain
).
次に、Apacheで使用したのと同じ手順を使用して、Nginxの仮想ホストを作成します。 まず、両方のWebサイトのドキュメントルートディレクトリを作成します。
- 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の仮想ホストで行ったように、作成します index
と phpinfo()
セットアップが完了した後にテストするためのファイル:
- echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
- echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php
次に、ドメインの仮想ホストファイルを作成します nginx1.your_domain
:
- sudo nano /etc/nginx/sites-available/nginx1.your_domain
Nginxの呼び出し server {. . .}
構成ファイルサーバーブロックの領域。 プライマリ仮想ホストのサーバーブロックを作成し、 nginx1.your_domain
. The default_server
構成ディレクティブは、これを他の仮想ホストと一致しないHTTP要求を処理するデフォルトの仮想ホストにします。
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
:
- sudo nano /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
ディレクトリ:
- sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
- sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain
Nginx構成をテストして、構成の問題がないことを確認します。
- sudo nginx -t
次に、エラーがない場合はNginxをリロードします。
- sudo systemctl reload nginx
今すぐアクセス phpinfo()
http://nginx1。your_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に転送します。
- sudo nano /etc/nginx/sites-available/apache
次のコードブロックを追加します。 両方のApache仮想ホストドメインの名前を指定し、それらのリクエストをApacheにプロキシします。 でパブリックIPアドレスを使用することを忘れないでください proxy_pass
:
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;
}
}
ファイルを保存し、シンボリックリンクを作成してこの新しい仮想ホストを有効にします。
- sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
構成をテストして、エラーがないことを確認します。
- sudo nginx -t
エラーがない場合は、Nginxをリロードします。
- 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
ただし、古く、特定の構成ディレクティブをサポートしていません。 代わりに、ソースからインストールします。
ホームディレクトリに移動し、モジュールのビルドに必要なパッケージをインストールします。
- 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
次のコードをファイルに追加して、モジュールをロードします。
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アドレスを必ず指定してください。
<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名を更新して、
ServerName
とServerAlias
仕事。 - RPAF_SetHTTPS-を設定します
HTTPS
に含まれる値に基づく環境変数X-Forwarded-Proto
. - RPAF_SetPort-を設定します
SERVER_PORT
環境変数。 ApacheがSSLプロキシの背後にある場合に便利です。
保存する rpaf.conf
モジュールを有効にします。
- sudo a2enmod rpaf
これにより、ファイルのシンボリックリンクが作成されます rpaf.load
と rpaf.conf
の中に mods-enabled
ディレクトリ。 次に、構成テストを実行します。
- sudo apachectl -t
エラーがない場合は、Apacheをリロードします。
- sudo systemctl reload apache2
アクセスする phpinfo()
ページ http://apache1.your_domain/info.php
と http://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
エディターで:
- sudo nano /etc/nginx/sites-available/apache
次のようにファイルを変更します。 apache1.your_domain
と apache2.your_domain
自分で server
ブロック:
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
スナップを使用して
- sudo snap install --classic certbot
インストールしたら、 certbot
の証明書を生成するコマンド apache1.your_domain
と www.apache1.your_domain
:
- sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain
このコマンドは、Certbotに nginx
プラグイン、使用 -d
証明書を有効にする名前を指定します。
次に、2番目のドメインに対してコマンドを実行します。
- 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_PORTは443に設定され、HTTPSはonに設定されています。 これらの変数を設定すると、リバースプロキシの背後で動作するようにPHPアプリケーションを特別に構成する必要がなくなります。
それでは、Apacheへの直接アクセスを無効にしましょう。
ステップ10— Apacheへの直接アクセスをブロックする(オプション)
Apacheはポートでリッスンしているので 8080
パブリックIPアドレスでは、誰でもアクセスできます。 次のIPtablesコマンドをファイアウォールルールセットに適用することでブロックできます。
- 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://apache1。your_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
エディターで:
- sudo nano /etc/nginx/sites-available/apache
さらに2つ追加する必要があります location
各サーバーブロックへのブロック、および既存の変更 location
セクション。 さらに、各サイトの静的ファイルの場所をNginxに指示する必要があります。
SSLおよびTLS証明書を使用しないことにした場合は、次のようにファイルを変更してください。
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も使用できるようにする場合は、代わりに次の構成を使用してください。
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
、機密情報が含まれています。
ファイルを保存し、構成テストを実行します。
- sudo nginx -t
テストが成功した場合は、Nginxをリロードします。
- sudo service nginx reload
動作していることを確認するために、Apacheのログファイルを調べることができます。 /var/log/apache2
とを参照してください GET
のリクエスト info.php
のファイル apache2.your_domain
と apache1.your_domain
. 使用 tail
コマンドを使用してファイルの最後の数行を表示し、 -f
ファイルの変更を監視するように切り替えます。
- 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_domain
と nginx2.your_domain
、Apacheサービングと一緒に apache1.your_domain
と apache2.your_domain
. NginxはApacheのリバースプロキシとして機能していますが、Nginxのプロキシサービスは透過的であり、Apacheのドメインへの接続はApache自体から直接提供されているように見えます。 この方法を使用して、安全で静的なサイトにサービスを提供できます。