CentOS7で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つです。

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

前提条件

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

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

前提条件が完了したら、PHPバージョン7.0および7.2をインストールします。 SCL(ソフトウェアコレクション)リポジトリは、CentOS7システム用のPHPスタックの多数のバージョンを維持しています。 PHPの最新バージョンが必要で、SCLで利用できない場合は、代わりに remi PPA(パーソナルパッケージアーカイブ)を確認してください。

SCLリポジトリをシステムにインストールすることから始めます。

sudo yum install centos-release-scl -y

まず、SCLで利用できるPHP7のバージョンを確認しましょう。

sudo yum list rh-php7[0-9].x86_64

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

OutputAvailable Packages
rh-php70.x86_64                                 2.3-1.el7                                 centos-sclo-rh
rh-php71.x86_64                                 1-1.el7                                   centos-sclo-rh
rh-php72.x86_64                                 1-2.el7                                   centos-sclo-rh
rh-php73.x86_64                                 1-1.el7                                   centos-sclo-rh

最新バージョンのPHP7.3も利用可能であることに注意してください。 ただし、この例では、バージョン7.0および7.2をインストールします。

古いバージョンから始めましょう。 rh-php70およびrh-php70-php-fpmをインストールします。

sudo yum install rh-php70  rh-php70-php-fpm -y
  • rh-php70は、PHPアプリケーションを実行するメタパッケージです。
  • rh-php70-php-fpmは、デーモンとして実行され、Fast/CGI要求を受信するFastProcessManagerインタープリターを提供します。

ここで、PHPバージョン7.2のプロセスを繰り返します。 rh-php72rh-php72-php-fpmをインストールします。

sudo yum install rh-php72  rh-php72-php-fpm -y

次に、次のコマンドを実行して、両方のソフトウェアコレクションの使用を開始します。

sudo scl enable rh-php70 bash
sudo scl enable rh-php72 bash

デフォルトでは、両方のPHPバージョンがポート9000でリッスンしています。 ただし、このチュートリアルでは、2つのバージョンを同時に実行します。 したがって、2つの新しいポートを指定しましょう。

これを行うには、お気に入りのテキストエディタで/etc/opt/rh/rh-php70/php-fpm.d/www.confを開き、9000のすべての外観を9002に変更します。 次に、ファイルを保存して閉じ、/etc/opt/rh/rh-php72/php-fpm.d/www.confに対してプロセスを繰り返します。ここで、90009003に置き換えます。 または、次の2つのsedコマンドを使用して、次のように置き換えることができます。

sudo sed -i 's/:9000/:9002/'  /etc/opt/rh/rh-php70/php-fpm.d/www.conf
sudo sed -i 's/:9000/:9003/'  /etc/opt/rh/rh-php72/php-fpm.d/www.conf

これで、各PHPサービス専用のポートが指定されました。 ただし、これらの変更が機能する前に、SELinux構成にポートを追加する必要があります。

SELinuxはSecurityEnhancedLinuxの略で、CentOS7ではデフォルトで有効になっています。 9002および9003の新しいポートをSELinuxデータベースに追加し、それらをhttpdサービスに割り当てる必要があります。そうしないと、アプリケーションが実行されません。 semanageコマンドを使用して、次のタスクを実行します。

sudo semanage port -a -t http_port_t -p tcp 9002
sudo semanage port -a -t http_port_t -p tcp 9003

-aフラグは、データベースにオブジェクトを追加することを指定します。 -tフラグは、オブジェクトのタイプ(この場合はhttp_port_t)を指定します。 また、-pフラグは、tcpプロトコルを指定します。 SELinuxとsemanageコマンドの詳細については、このチュートリアルを参照するか、SELinuxの公式ドキュメントにアクセスしてください。

これで、PHPサービスを開始して有効にする準備が整いました。 rh-php70-php-fpmサービスから開始し、起動時に開始できるようにします。

sudo systemctl start rh-php70-php-fpm
sudo systemctl enable rh-php70-php-fpm

次に、rh-php70-php-fpmサービスのステータスを確認します。

sudo systemctl status rh-php70-php-fpm

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

Output● rh-php70-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago
 Main PID: 1852 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/rh-php70-php-fpm.service
           ├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)
           ├─1853 php-fpm: pool www
           ├─1854 php-fpm: pool www
           ├─1855 php-fpm: pool www
           ├─1856 php-fpm: pool www
           └─1857 php-fpm: pool www

Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

このプロセスを繰り返して、rh-php72-php-fpmサービスを開始し、起動時に開始できるようにします。

sudo systemctl start rh-php72-php-fpm
sudo systemctl enable rh-php72-php-fpm

次に、rh-php72-php-fpmサービスのステータスを確認します。

sudo systemctl status rh-php72-php-fpm

次のような別の出力が表示されます。

Output● rh-php72-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago
 Main PID: 1876 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/rh-php72-php-fpm.service
           ├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)
           ├─1877 php-fpm: pool www
           ├─1878 php-fpm: pool www
           ├─1879 php-fpm: pool www
           ├─1880 php-fpm: pool www
           └─1881 php-fpm: pool www

Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.

この時点で、サーバーに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サーバーはapacheユーザーおよびapacheグループとして実行されます。 したがって、/var/www/とそのすべてのファイルおよびサブディレクトリもそれらによって所有されている必要があります。 次のコマンドを実行して、Webサイトのルートディレクトリの正しい所有権と権限を確認します。

sudo chown -R apache:apache /var/www/site1.your_domain
sudo chown -R apache:apache /var/www/site2.your_domain
sudo chmod -R 755 /var/www/site1.your_domain
sudo chmod -R 755 /var/www/site2.your_domain

chownコマンドは、2つのWebサイトディレクトリの所有権をapacheユーザーとapacheグループに変更します。 chmodコマンドは、そのユーザーとグループ、およびその他に関連付けられているアクセス許可を変更します。

次に、各Webサイトのルートディレクトリ内にinfo.phpファイルを作成します。 これにより、各WebサイトのPHPバージョン情報が表示されます。 site1で始まります:

sudo vi /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/httpd/conf.d/内に2つの新しい仮想ホスト構成ファイルを作成します。

まず、Webサイトsite1.your_domainの新しい仮想ホスト構成ファイルを作成します。 ここでは、PHP7.0を使用してコンテンツをレンダリングするようにApacheに指示します。

sudo vi /etc/httpd/conf.d/site1.your_domain.conf

次のコンテンツを追加します。 Webサイトのディレクトリパス、サーバー名、ポート、およびPHPのバージョンが設定と一致していることを確認してください。

/etc/httpd/conf.d/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin [email protected]_domain
     ServerName site1.your_domain
     DocumentRoot /var/www/site1.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9002
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php70-fcgi .php
     Action php70-fcgi /cgi-bin/php70.fcgi
     ErrorLog /var/log/httpd/site1.your_domain_error.log
     CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>

DocumentRootの場合、Webサイトのルートディレクトリのパスを指定します。 ServerAdminの場合、your_domainサイト管理者がアクセスできる電子メールを追加します。 ServerNameの場合、最初のサブドメインのURLを追加します。 SetHandlerには、ポート9002を指定しています。 残りのディレクティブも、PHP7.0をデプロイするようにサービスを構成します。

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

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

sudo vi /etc/httpd/conf.d/site2.your_domain.conf

次のコンテンツを追加します。 繰り返しになりますが、Webサイトのディレクトリパス、サーバー名、ポート、およびPHPのバージョンが一意の情報と一致していることを確認してください。

/etc/httpd/conf.d/site2.your_domain.conf

<VirtualHost *:80>
     ServerAdmin [email protected]_domain
     ServerName site2.your_domain
     DocumentRoot /var/www/site2.your_domain
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9003
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php72-fcgi .php
     Action php72-fcgi /cgi-bin/php72.fcgi
     ErrorLog /var/log/httpd/site2.your_domain_error.log
     CustomLog /var/log/httpd/site2.your_domain_access.log combined
</VirtualHost>

終了したら、ファイルを保存して閉じます。 次に、Apache構成ファイルで構文エラーがないか確認します。

sudo apachectl configtest

Syntax OKの出力が表示されます。

OutputSyntax OK

最後に、Apacheサービスを再起動して、変更を実装します。

sudo systemctl restart httpd

各サイトにサービスを提供するようにApacheを構成したので、それらをテストして、適切なPHPバージョンが実行されていることを確認します。

ステップ4—両方のWebサイトをテストする

この時点で、2つの異なるバージョンのPHPを実行するように2つのWebサイトを構成しました。 次に、結果をテストします。

Webブラウザーを開き、http://site1.your_domainhttp://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サイトを処理する単一のCentOS7サーバーができました。 ただし、PHP-FPMはこの1つのアプリケーションに限定されません。

結論

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

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