私はApacheを使用していくつかのPHPベースのWebアプリケーションを提供するGentoo Linux Webサーバーを持っています。ほとんどのアプリケーションは最新バージョンのPHP(7.2など)で実行されますが、1つのアプリケーションは非常に古いバージョンのPHP(5.6など)で実行する必要があります。同じWebサーバーで複数のバージョンのPHPを同時に実行する方法は?
- Gentoo(プロフィール17)。
- WebサーバーはApache 2.4です。
- 実行するにはPHP 7.2とPHP 5.6が必要です。
- Apacheは現在mod_phpを介してPHP 7.2を提供するように設定されていますが、PHP 5.6もインストールされています。
- Gentooは、
eselect
Apache / mod_phpで使用されるPHPのバージョンを変更するように設定されています。
答え1
この回答は、プロファイル17を使用するGentooにのみ適用されます。いくつかの肯定的なバージョンと否定的なバージョンで動作することがあります。使ったRed Hat PHP設定のヒントインスピレーションを与えるページ。他のLinuxディストリビューションにも同じアイデアを適用する必要があります(もちろん、正確なコマンドは異なる場合があります)。
解決策は、PHP-FPM(FastCGIプロセスマネージャ)を使用することです。各PHPバージョンには、ソケットを受信する独自のPHP-FPMサービスがあります。 Apache は、必要な PHP のバージョンに応じて、特定の PHP-FPM サービスに PHP 実行要求を渡します。
あるバージョンのPHPにはmod_phpを使用し、別のバージョンにはPHP-FPMを使用できますが、私はすべてmod_phpを放棄することにしました。まず、mod_phpを無効にすると、メモリのオーバーヘッドを減らすことができるという記事をどこかで読みました。第二に、ソリューションはもう少しきれいに見え、すべてのPHPバージョンが同じ方法で処理されます。第三に、セキュリティの観点からは、常に最小限のソフトウェアのみ/必要なソフトウェアのみをインストールすることをお勧めします。
USE
タグを変更して追加および削除してdev-lang/php
ください。fpm
apache2
現在のGentooの習慣は、同様のファイルを作成して
/etc/portage/package.use/php
ここにフラグを付けることですUSE
。ファイルに正しいバージョンを指定する場合は、使用するUSE
すべてのPHPバージョンに対してこれらのフラグが選択されていることを確認してください。使用するPHPバージョンをインストール/再インストールしてください。
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
APACHE2_MODULES
ビルドproxy
とproxy_fcgi
Apacheモジュールの変数を変更します。APACHE2_MODULES
変数を追加/更新して、Apacheモジュールが使用するものを指定できます/etc/portage/make.conf
。フラグと同様に、USE
Gentooはすでに設定ファイルのいくつかのデフォルト値を設定します。 flagsとは異なり、変数を前に追加してデフォルトで開始するようにGentooに明示的に指示する必要がUSE
あるようです。$APACHE2_MODULES
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
- Apacheを再インストールしてください。
# emerge -av apache
- PHP-FPMをインストールします。
# emerge -av php-fpm
Apacheで使用する各PHPバージョンのPHP-FPM起動スクリプトを作成します。
PHP-FPMをインストールすると、スクリプトのファイル名サフィックス(たとえば、など)を使用または変更して
/etc/init.d/php-fpm
実行するPHPバージョンを選択できる起動スクリプト()が生成されます。一度に1つのPHPバージョンのみを使用したい場合、または2つ以下のバージョン(1つはmod_php、2番目はPHP-FPM)のみを使用したい場合にのみ使用したいので、サフィックスメソッドを使用します。私たちはスクリプトをコピーするのではなく、シンボリックリンクを使用したいです(有効なサフィックスは、例えばディレクトリ名などです)。eselect
php-fpm-php5.6
php-fpm-php7.2
eselect
ls -ld /usr/lib64/php*
php5.6
php7.2
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
サービスがPHPバージョンごとに異なるポートで実行されるように、PHP-FPM設定を変更します。
正確なファイル名はバージョンごとに異なりますが、次の一般的な場所で各PHPバージョンの設定ファイルを編集して、各ディレクティブが異なるポートを持つように
/etc/php/fpm-php*/*.conf
します。listen
PHP-FPMサービスが起動するように設定します。
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
プロキシモジュールを有効にするには、Apache 起動設定を編集します。
/etc/conf.d/apache2
を追加して-D PROXY
削除-D PHP
するには、編集してくださいAPACHE2_OPTS
。特定のディレクトリの場所をPHP-FPMの特定のインスタンスにバインドするには、Apache設定を編集します。
特定のApache構成に応じてこれを処理する方法はいくつかあります。
<Directory>
以下を追加して、デフォルトのPHPハンドラがバージョン7.2になるように私のWebルートに関連付けられているエントリを編集することにしました。
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>
PHP 5.6は例外的な場合にのみ使用されるため、<Directory>
以前のバージョンのPHPを使用する必要があるすべてのアプリケーションにディレクティブを追加しました。
<Directory /var/www/oldapp>
<FilesMatch \.php$>
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
</FilesMatch>
</Directory>
index.php
有効なディレクトリインデックスファイルとして追加されました。Gentooには、通常どおりにディレクトリインデックスファイルを
/etc/apache2/modules.d/70_mod_php.conf
追加するディレクティブが含まれています。ステップ9でmod_phpを無効にしたため、この設定は不要になりました。この問題を解決するには、Apache設定に追加してください。そうではなく、そのパスにアクセスすると、403エラーが発生します。index.php
index.html
70_mod_php.conf
DirectoryIndex index.php
/oldapp/
Apacheを再起動します。
# /etc/init.d/apache restart
その他の注意事項
- ファイルで特定の構成設定
php.ini
(最大POST値、タイムゾーンなど)を設定する場合は、/etc/php/fpm-php*/php.ini
すべてのファイル(各バージョンごと)でこれらの設定を設定する必要があります。 - PHP-FPMはデフォルトで
user=nobody
/で実行されますgroup=nobody
。/etc/php/fpm-php*/php-fpm.conf
実行しているWebサーバーと一致するように変更する必要があるかもしれません。 - 複数の仮想ホストを処理するには、各仮想ホストに対して手順10と11を実行します。