Ubuntu18.04でApacheとPHP-FPMを使用して1つのサーバーで複数のPHPバージョンを実行する方法
序章
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をデプロイします。 二番目、 site2.your_domain
、PHP7.2をデプロイします。
前提条件
- 1GB以上のRAMを搭載した1台のUbuntu18.04サーバー。Ubuntu18.04 を使用した初期サーバー設定(sudo非rootユーザーとファイアウォールを含む)に従って設定します。
- Ubuntu18.04にApacheWebサーバーをインストールする方法に従ってセットアップおよび構成されたApacheWebサーバー。
- Ubuntu18.04サーバーを指すように構成されたドメイン名。 共通ドメインレジストラからDigitalOceanネームサーバーをポイントする方法に従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。 このチュートリアルでは、2つのサブドメインを使用します。各サブドメインは、
A
DNS設定に記録します。site1.your_domain
とsite2.your_domain
.
ステップ1—PHP-FPMを使用したPHPバージョン7.0および7.2のインストール
前提条件が完了したら、PHPバージョン7.0と7.2、およびPHP-FPMといくつかの追加の拡張機能をインストールします。 ただし、これを実現するには、最初にを追加する必要があります Ondrej PHP
システムへのリポジトリ。
を実行します apt-get
インストールするコマンド software-properties-common
:
- sudo apt-get install software-properties-common -y
The software-properties-common
パッケージは apt-add-repository
コマンドラインユーティリティ。これを使用して、 ondrej/php
PPA(パーソナルパッケージアーカイブ)リポジトリ。
次に、 ondrej/php
システムへのリポジトリ。 The ondrej/php
PPAには、公式のUbuntuリポジトリよりも最新バージョンのPHPが含まれ、同じシステムに複数のバージョンのPHPをインストールすることもできます。
- sudo add-apt-repository ppa:ondrej/php
リポジトリを更新します。
- 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 Sun 2020-03-29 12:53:23 UTC; 15s ago
Docs: man:php-fpm7.0(8)
Process: 20961 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited,
Process: 20979 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exite
Main PID: 20963 (php-fpm7.0)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1150)
CGroup: /system.slice/php7.0-fpm.service
├─20963 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
├─20977 php-fpm: pool www
└─20978 php-fpm: pool www
このプロセスを繰り返して、今すぐ開始します 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 Sun 2020-03-29 12:53:22 UTC; 45s ago
Docs: man:php-fpm7.2(8)
Main PID: 20897 (php-fpm7.2)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1150)
CGroup: /system.slice/php7.2-fpm.service
├─20897 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
├─20909 php-fpm: pool www
└─20910 php-fpm: pool www
最後に、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
次に、を作成します info.php
各Webサイトのルートディレクトリ内のファイル。 これにより、各WebサイトのPHPバージョン情報が表示されます。 で始まる site1
:
- sudo nano /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
、ディレクトリ内に2つの新しいものを作成します /etc/apache2/sites-available/
.
まず、Webサイトの新しい仮想ホスト構成ファイルを作成します site1.your_domain
. ここでは、Apacheに次を使用してコンテンツをレンダリングするように指示します php7.0
:
- sudo nano /etc/apache2/sites-available/site1.your_domain.conf
次のコンテンツを追加します。 Webサイトのディレクトリパス、サーバー名、およびPHPのバージョンが設定と一致していることを確認してください。
<VirtualHost *:80>
ServerAdmin admin@site1.your_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
、この仮想ホスト構成のベースドメインを確立し、 SetHandler
PHPをfastCGIプロセスサーバーとして実行するためのディレクティブ。
ファイルを保存して閉じます。
次に、Webサイトの新しい仮想ホスト構成ファイルを作成します site2.your_domain
. デプロイするこのサブドメインを指定します php7.2
:
- sudo nano /etc/apache2/sites-available/site2.your_domain.conf
次のコンテンツを追加します。 繰り返しになりますが、Webサイトのディレクトリパス、サーバー名、およびPHPのバージョンが一意の情報と一致していることを確認してください。
<VirtualHost *:80>
ServerAdmin admin@site2.your_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サイトを処理する単一のUbuntu18.04サーバーができました。 ただし、PHP-FPMはこの1つのアプリケーションに限定されません。
結論
これで、仮想ホストとPHP-FPMを組み合わせて、単一のサーバーで複数のWebサイトと複数のバージョンのPHPを提供できるようになりました。 Apacheサービスが処理できるPHPサイトとPHPバージョンの数に対する実際的な制限は、インスタンスの処理能力だけです。
ここから、アダプティブスポーンプロセスやログ記録方法など、PHP-FPMのより高度な機能の調査を検討できます。 sdtout
と stderr
. または、Webサイトを保護することもできます。 これを実現するには、Let’sEncryptの無料のTLS/SSL証明書を使用してサイトを保護する方法に関するチュートリアルに従ってください。