Debian10でApacheとPHP-FPMを使用して1つのサーバーで複数のPHPバージョンを実行する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Apache Webサーバーは、仮想ホストを使用して、単一のインスタンスで複数のドメインを管理します。 同様に、 PHP-FPM はデーモンを使用して、単一のインスタンスで複数のPHPバージョンを管理します。 一緒に、ApacheとPHP-FPMを使用して、それぞれが異なるバージョンのPHPを使用し、すべて同じサーバー上で同時に複数のPHPWebアプリケーションをホストできます。 これは、アプリケーションごとに異なるバージョンのPHPが必要になる場合があるため便利ですが、定期的に構成されたLAMPスタックなどの一部のサーバースタックは1つしか管理できません。 ApacheとPHP-FPMを組み合わせることも、各アプリケーションを独自のインスタンスでホストするよりもコスト効率の高いソリューションです。
PHP-FPMは、stderr
およびstdout
ロギング、緊急再起動、および適応型プロセススポーンの構成オプションも提供します。これは、負荷の高いサイトに役立ちます。 実際、ApacheをPHP-FPMで使用することは、特にパフォーマンスに関しては、PHPアプリケーションをホストするための最良のスタックの1つです。
このチュートリアルでは、1つのインスタンスに2つのPHPサイトを設定します。 各サイトは独自のドメインを使用し、各ドメインは独自のバージョンのPHPをデプロイします。 最初のsite1.your_domain
は、PHP7.0をデプロイします。 2番目のsite2.your_domain
は、PHP7.2をデプロイします。
前提条件
- Debian 10を使用した初期サーバーセットアップに従ってセットアップされた少なくとも1GBのRAMを備えた1台のDebian10サーバー(sudo非rootユーザーとファイアウォールを含む)。
- Debian10にApacheWebサーバーをインストールする方法に従ってセットアップおよび構成されたApacheWebサーバー。
- Debian10サーバーを指すように設定されたドメイン名。 共通ドメインレジストラからDigitalOceanネームサーバーをポイントする方法に従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアルでは、DNS設定で
A
レコードで指定された2つのサブドメインsite1.your_domain
とsite2.your_domain
を使用します。
ステップ1—PHP-FPMを使用したPHPバージョン7.0および7.2のインストール
前提条件が完了したら、PHPバージョン7.0と7.2、およびPHP-FPMといくつかの追加の拡張機能をインストールします。 ただし、これを実現するには、最初にsury php
リポジトリをシステムに追加する必要があります。
まず、curl
、wget
、gnupg2
などの必要なパッケージをいくつかインストールします。
sudo apt-get install curl wget gnupg2 ca-certificates lsb-release apt-transport-https -y
上記のパッケージを使用すると、sury php
リポジトリにアクセスし、安全にアクセスできます。 sury php
は、サードパーティのリポジトリまたはPPA(パーソナルパッケージアーカイブ)です。 Debianオペレーティングシステム用にPHP7.4、7.3、7.2、7.1、および7.0を提供します。 また、公式のDebian 10リポジトリよりも最新バージョンのPHPを提供し、同じシステムに複数のバージョンのPHPをインストールできるようにします。
次に、パッケージのキーをインポートします。
wget https://packages.sury.org/php/apt.gpg sudo apt-key add apt.gpg
次に、sury php
リポジトリをシステムに追加します。
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list
リポジトリを更新します。
sudo apt-get update -y
次に、次のコマンドを使用して、php7.0
、php7.0-fpm
、php7.0-mysql
、libapache2-mod-php7.0
、およびlibapache2-mod-fcgid
をインストールします。
sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y
php7.0
は、PHPアプリケーションの実行に使用できるメタパッケージです。php7.0-fpm
は、デーモンとして実行され、Fast/CGI要求を受信するFastProcessManagerインタープリターを提供します。php7.0-mysql
はPHPをMySQLデータベースに接続します。libapahce2-mod-php7.0
は、ApacheWebサーバー用のPHPモジュールを提供します。libapache2-mod-fcgid
には、同時リクエストを処理するために多数のCGIプログラムインスタンスを開始するmod_fcgidが含まれています。
ここで、PHPバージョン7.2のプロセスを繰り返します。 php7.2
、php7.2-fpm
、php7.2-mysql
、およびlibapache2-mod-php7.2
をインストールします。
sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 -y
両方のPHPバージョンをインストールした後、php7.0-fpm
サービスを開始します。
sudo systemctl start php7.0-fpm
次に、php7.0-fpm
サービスのステータスを確認します。
sudo systemctl status php7.0-fpm
次の出力が表示されます。
Output● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-04-04 08:51:47 UTC; 1min 17s ago Docs: man:php-fpm7.0(8) Main PID: 13016 (php-fpm7.0) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1149) Memory: 19.1M CGroup: /system.slice/php7.0-fpm.service ├─13016 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf) ├─13017 php-fpm: pool www └─13018 php-fpm: pool www Apr 04 08:51:47 debian10 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager... Apr 04 08:51:47 debian10 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.
このプロセスを繰り返して、php7.2-fpm
サービスを開始します。
sudo systemctl start php7.2-fpm
次に、php7.2-fpm
サービスのステータスを確認します。
sudo systemctl status php7.2-fpm
次の出力が表示されます。
Output● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2020-04-04 08:52:52 UTC; 1min 32s ago Docs: man:php-fpm7.2(8) Process: 22207 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.2/fpm/pool.d/www.conf 72 (code=exite Main PID: 22204 (php-fpm7.2) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" Tasks: 3 (limit: 1149) Memory: 12.0M CGroup: /system.slice/php7.2-fpm.service ├─22204 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf) ├─22205 php-fpm: pool www └─22206 php-fpm: pool www Apr 04 08:52:52 debian10 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager... Apr 04 08:52:52 debian10 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.
最後に、Apache2サービスが複数のPHPバージョンで動作できるように、いくつかのモジュールを有効にする必要があります。
sudo a2enmod actions fcgid alias proxy_fcgi
actions
は、メディアタイプまたはリクエストメソッドに基づいてCGIスクリプトを実行するために使用されます。fcgid
は、mod_cgi
の高性能な代替手段であり、同時要求を処理するのに十分な数のCGIプログラムのインスタンスを開始します。alias
は、ドキュメントツリー内のホストファイルシステムのさまざまな部分のマッピングと、URLリダイレクトを提供します。proxy_fcgi
を使用すると、ApacheはリクエストをPHP-FPMに転送できます。
次に、Apacheサービスを再起動して、変更を適用します。
sudo systemctl restart apache2
この時点で、サーバーに2つのPHPバージョンがインストールされています。 次に、展開するWebサイトごとにディレクトリ構造を作成します。
ステップ2—両方のWebサイトのディレクトリ構造を作成する
このセクションでは、2つのWebサイトそれぞれのドキュメントルートディレクトリとインデックスページを作成します。
まず、site1.your_domain
とsite2.your_domain
の両方のドキュメントルートディレクトリを作成します。
sudo mkdir /var/www/site1.your_domain sudo mkdir /var/www/site2.your_domain
デフォルトでは、ApacheWebサーバーはwww-data
ユーザーおよびwww-data
グループとして実行されます。 Webサイトのルートディレクトリの正しい所有権と権限を持っていることを確認するには、次のコマンドを実行します。
sudo chown -R www-data:www-data /var/www/site1.your_domain sudo chown -R www-data:www-data /var/www/site2.your_domain sudo chmod -R 755 /var/www/site1.your_domain sudo chmod -R 755 /var/www/site2.your_domain
次に、各Webサイトのルートディレクトリ内にinfo.php
ファイルを作成します。 これにより、各WebサイトのPHPバージョン情報が表示されます。 site1
で始まります:
sudo nano /var/www/site1.your_domain/info.php
次の行を追加します。
/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>
ファイルを保存して閉じます。 次に、作成したinfo.php
ファイルをsite2
にコピーします。
sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php
これで、Webサーバーに、各サイトが訪問者にデータを提供するために必要なドキュメントルートディレクトリが作成されます。 次に、2つの異なるPHPバージョンで動作するようにApacheWebサーバーを構成します。
ステップ3—両方のWebサイト用にApacheを構成する
このセクションでは、2つの仮想ホスト構成ファイルを作成します。 これにより、2つのWebサイトが2つの異なるPHPバージョンで同時に動作できるようになります。
Apacheがこのコンテンツを提供するには、正しいディレクティブを使用して仮想ホストファイルを作成する必要があります。 /etc/apache2/sites-available/000-default.conf
にあるデフォルトの構成ファイルを変更する代わりに、ディレクトリ/etc/apache2/sites-available/
内に2つの新しい構成ファイルを作成します。
まず、Webサイトsite1.your_domain
の新しい仮想ホスト構成ファイルを作成します。 ここでは、php7.0
を使用してコンテンツをレンダリングするようにApacheに指示します。
sudo nano /etc/apache2/sites-available/site1.your_domain.conf
次のコンテンツを追加します。 Webサイトのディレクトリパス、サーバー名、およびPHPのバージョンが設定と一致していることを確認してください。
/etc/apache2/sites-available/site1.your_domain.conf
<VirtualHost *:80> ServerAdmin [email protected]_domain ServerName site1.your_domain DocumentRoot /var/www/site1.your_domain DirectoryIndex info.php <Directory /var/www/site1.your_domain> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <FilesMatch \.php$> # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined </VirtualHost>
このファイルでは、DocumentRoot
を新しいディレクトリに更新し、ServerAdmin
をyour_domain
サイト管理者がアクセスできる電子メールに更新しました。 また、この仮想ホスト構成のベースドメインを確立するServerName
を更新し、PHPをfastCGIプロセスサーバーとして実行するためのSetHandler
ディレクティブを追加しました。
ファイルを保存して閉じます。
次に、Webサイトsite2.your_domain
の新しい仮想ホスト構成ファイルを作成します。 このサブドメインを指定して、php7.2
をデプロイします。
sudo nano /etc/apache2/sites-available/site2.your_domain.conf
次のコンテンツを追加します。 繰り返しになりますが、Webサイトのディレクトリパス、サーバー名、およびPHPのバージョンが一意の情報と一致していることを確認してください。
/etc/apache2/sites-available/site2.your_domain.conf
<VirtualHost *:80> ServerAdmin [email protected]_domain ServerName site2.your_domain DocumentRoot /var/www/site2.your_domain DirectoryIndex info.php <Directory /var/www/site2.your_domain> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> <FilesMatch \.php$> # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined </VirtualHost>
終了したら、ファイルを保存して閉じます。 次に、Apache構成ファイルで構文エラーがないか確認します。
sudo apachectl configtest
次の出力が表示されます。
OutputSyntax OK
次に、両方の仮想ホスト構成ファイルを有効にします。
sudo a2ensite site1.your_domain sudo a2ensite site2.your_domain
デフォルトのサイトは必要ないので、無効にします。
sudo a2dissite 000-default.conf
最後に、Apacheサービスを再起動して、変更を実装します。
sudo systemctl restart apache2
各サイトにサービスを提供するようにApacheを構成したので、それらをテストして、適切なPHPバージョンが実行されていることを確認します。
ステップ4—両方のWebサイトをテストする
この時点で、2つの異なるバージョンのPHPを実行するように2つのWebサイトを構成しました。 次に、結果をテストします。
Webブラウザーを開き、http://site1.your_domain
とhttp://site2.your_domain
の両方のサイトにアクセスします。 次のような2つのページが表示されます。
タイトルに注意してください。 最初のページは、site1.your_domain
がPHPバージョン7.0をデプロイしたことを示しています。 2つ目は、site2.your_domain
がPHPバージョン7.2をデプロイしたことを示しています。
サイトをテストしたので、info.php
ファイルを削除します。 これらにはサーバーに関する機密情報が含まれており、権限のないユーザーがアクセスできるため、セキュリティ上の脅威が発生します。 両方のファイルを削除するには、次のコマンドを実行します。
sudo rm -rf /var/www/site1.your_domain/info.php sudo rm -rf /var/www/site2.your_domain/info.php
これで、2つの異なるPHPバージョンを持つ2つのWebサイトを処理する単一のDebian10サーバーができました。 ただし、PHP-FPMはこの1つのアプリケーションに限定されません。
結論
これで、仮想ホストとPHP-FPMを組み合わせて、単一のサーバーで複数のWebサイトと複数のバージョンのPHPを提供できるようになりました。 Apacheサービスが処理できるPHPサイトとPHPバージョンの数に対する実際的な制限は、インスタンスの処理能力だけです。
ここから、 PHP-FPMのより高度な機能の探索を検討できます。たとえば、アダプティブスポーンプロセスや、sdtout
およびstderr
のログ記録方法などです。 または、Webサイトを保護することもできます。 これを実現するには、Let'sEncryptの無料のTLS/SSL証明書を使用してサイトを保護する方法に関するチュートリアルに従ってください。