Ubuntu20.04でApacheとPHP-FPMを使用して1つのサーバーで複数のPHPバージョンを実行する方法

提供:Dev Guides
移動先:案内検索

著者は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つです。

実際、ApacheをPHP-FPMで使用することは、特にパフォーマンスに関しては、PHPアプリケーションをホストするための最良のスタックの1つです。 PHP-FPMを使用すると、複数のPHPバージョンを同時に実行できるだけでなく、負荷の高いサイトに役立つアダプティブプロセススポーンなどの多数の追加機能も提供されます。

このチュートリアルでは、1つのインスタンスに2つのPHPサイトを設定します。 各サイトは独自のドメインを使用し、各ドメインは独自のバージョンのPHPをデプロイします。 最初のsite1.your_domainは、PHP7.2をデプロイします。 2番目のsite2.your_domainは、PHP7.3をデプロイします。

前提条件

  • Ubuntu 20.04を使用した初期サーバーセットアップに従ってセットアップされた少なくとも1GBのRAMを備えた1つのUbuntu20.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
  • Ubuntu20.04にApacheWebサーバーをインストールする方法に従ってセットアップおよび構成されたApacheWebサーバー。
  • Ubuntu20.04サーバーを指すように構成されたドメイン名。 共通ドメインレジストラからDigitalOceanネームサーバーをポイントする方法に従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアルでは、DNS設定でAレコードで指定された2つのサブドメインsite1.your_domainsite2.your_domainを使用します。

ステップ1—PHP-FPMを使用したPHPバージョン7.2および7.3のインストール

前提条件が完了したら、PHPバージョン7.2と7.3、およびPHP-FPMといくつかの追加の拡張機能をインストールします。 ただし、これを実現するには、最初にOndrej PHPリポジトリをシステムに追加する必要があります。

apt-getコマンドを実行して、software-properties-commonをインストールします。

sudo apt-get install software-properties-common -y

software-properties-commonパッケージは、ondrej/php PPA(パーソナルパッケージアーカイブ)リポジトリを追加するために使用するapt-add-repositoryコマンドラインユーティリティを提供します。

次に、ondrej/phpリポジトリをシステムに追加します。 ondrej/php PPAには、公式のUbuntuリポジトリよりも最新バージョンのPHPが含まれ、同じシステムに複数のバージョンのPHPをインストールすることもできます。

sudo add-apt-repository ppa:ondrej/php

リポジトリを更新します。

sudo apt-get update -y

次に、次のコマンドを使用して、php7.2php7.2-fpmphp7.2-mysqllibapache2-mod-php7.2、およびlibapache2-mod-fcgidをインストールします。

sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 libapache2-mod-fcgid -y
  • php7.2は、PHPアプリケーションの実行に使用されるメタパッケージです。
  • php7.2-fpmは、デーモンとして実行され、Fast/CGI要求を受信するFastProcessManagerインタープリターを提供します。
  • php7.2-mysqlはPHPをMySQLデータベースに接続します。
  • libapache2-mod-php7.2は、ApacheWebサーバー用のPHPモジュールを提供します。
  • libapache2-mod-fcgidには、同時リクエストを処理するために多数のCGIプログラムインスタンスを開始するmod_fcgidが含まれています。

ここで、PHPバージョン7.3のプロセスを繰り返します。 php7.3php7.3-fpmphp7.3-mysql、およびlibapache2-mod-php7.3をインストールします。

sudo apt-get install php7.3 php7.3-fpm php7.3-mysql libapache2-mod-php7.3 -y

両方のPHPバージョンをインストールした後、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 Fri 2020-06-05 11:25:07 UTC; 1min 38s ago
       Docs: man:php-fpm7.2(8)
   Main PID: 13703 (php-fpm7.2)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 2353)
     Memory: 6.2M
     CGroup: /system.slice/php7.2-fpm.service
             ├─13703 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
             ├─13719 php-fpm: pool www
             └─13720 php-fpm: pool www

Jun 05 11:25:07 ubuntu systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...
Jun 05 11:25:07 ubuntu systemd[1]: Started The PHP 7.2 FastCGI Process Manager.

このプロセスを繰り返して、php7.3-fpmサービスを開始します。

sudo systemctl start php7.3-fpm

次に、php7.3-fpmサービスのステータスを確認します。

sudo systemctl status php7.3-fpm

次の出力が表示されます。

Output● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-06-05 11:26:33 UTC; 56s ago
       Docs: man:php-fpm7.3(8)
    Process: 23470 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.3/fpm/pool.d/www.conf 73 (code=ex>
   Main PID: 23452 (php-fpm7.3)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 2353)
     Memory: 7.1M
     CGroup: /system.slice/php7.3-fpm.service
             ├─23452 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
             ├─23468 php-fpm: pool www
             └─23469 php-fpm: pool www

Jun 05 11:26:33 ubuntu systemd[1]: Starting The PHP 7.3 FastCGI Process Manager...
Jun 05 11:26:33 ubuntu systemd[1]: Started The PHP 7.3 FastCGI Process Manager.

最後に、Apache2サービスが複数のPHPバージョンで動作できるように、いくつかのモジュールを有効にする必要があります。

sudo a2enmod actions fcgid alias proxy_fcgi
  • actionsは、メディアタイプまたはリクエストメソッドに基づいてCGIスクリプトを実行するために使用されます。
  • fcgidは、同時リクエストを処理するのに十分な数のCGIプログラムのインスタンスを開始するmod_cgiの高性能な代替手段です。
  • aliasは、ドキュメントツリー内のホストファイルシステムのさまざまな部分のマッピングと、URLリダイレクトを提供します。
  • proxy_fcgiを使用すると、ApacheはリクエストをPHP-FPMに転送できます。

次に、Apacheサービスを再起動して、変更を適用します。

sudo systemctl restart apache2

この時点で、サーバーに2つのPHPバージョンがインストールされています。 次に、展開するWebサイトごとにディレクトリ構造を作成します。

ステップ2—両方のWebサイトのディレクトリ構造を作成する

このセクションでは、2つのWebサイトそれぞれのドキュメントルートディレクトリとインデックスページを作成します。

まず、site1.your_domainsite2.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.2を使用してコンテンツをレンダリングするように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$>
        # From the Apache version 2.4.10 and above, use the 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}/site1.your_domain_error.log
     CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
</VirtualHost>

このファイルでは、 DocumentRoot を新しいディレクトリに更新し、ServerAdminyour_domainサイト管理者がアクセスできる電子メールに更新しました。 また、この仮想ホスト構成のベースドメインを確立する ServerName を更新し、PHPをfastCGIプロセスサーバーとして実行するためのSetHandlerディレクティブを追加しました。

ファイルを保存して閉じます。

次に、Webサイトsite2.your_domainの新しい仮想ホスト構成ファイルを作成します。 このサブドメインを指定して、php7.3をデプロイします。

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$>
        # 2.4.10+ can proxy to unix socket
         SetHandler "proxy:unix:/run/php/php7.3-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_domainhttp://site2.your_domainの両方のサイトにアクセスします。 次のような2つのページが表示されます。

タイトルに注意してください。 最初のページは、site1.your_domainがPHPバージョン7.2をデプロイしたことを示しています。 2つ目は、site2.your_domainがPHPバージョン7.3をデプロイしたことを示しています。

サイトをテストしたので、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サイトを処理する単一のUbuntu20.04サーバーができました。 ただし、PHP-FPMはこの1つのアプリケーションに限定されません。

結論

これで、仮想ホストとPHP-FPMを組み合わせて、単一のサーバーで複数のWebサイトと複数のバージョンのPHPを提供できるようになりました。 Apacheサービスが処理できるPHPサイトとPHPバージョンの数に対する実際的な制限は、インスタンスの処理能力だけです。

ここから、 PHP-FPMのより高度な機能の探索を検討できます。たとえば、アダプティブスポーンプロセスや、sdtoutおよびstderrのログ記録方法などです。または、Webサイトを保護することもできます。 。 これを実現するには、Let'sEncryptの無料のTLS/SSL証明書を使用してサイトを保護する方法に関するチュートリアルに従ってください。