その他の注意事項

その他の注意事項

私は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は、eselectApache / 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バージョンが同じ方法で処理されます。第三に、セキュリティの観点からは、常に最小限のソフトウェアのみ/必要なソフトウェアのみをインストールすることをお勧めします。

  1. USEタグを変更して追加および削除してdev-lang/phpください。fpmapache2

    現在のGentooの習慣は、同様のファイルを作成して/etc/portage/package.use/phpここにフラグを付けることですUSE。ファイルに正しいバージョンを指定する場合は、使用するUSEすべてのPHPバージョンに対してこれらのフラグが選択されていることを確認してください。

  2. 使用するPHPバージョンをインストール/再インストールしてください。

# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
  1. APACHE2_MODULESビルドproxyproxy_fcgiApacheモジュールの変数を変更します。

    APACHE2_MODULES変数を追加/更新して、Apacheモジュールが使用するものを指定できます/etc/portage/make.conf。フラグと同様に、USEGentooはすでに設定ファイルのいくつかのデフォルト値を設定します。 flagsとは異なり、変数を前に追加してデフォルトで開始するようにGentooに明示的に指示する必要がUSEあるようです。$APACHE2_MODULES

APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
  1. Apacheを再インストールしてください。
# emerge -av apache
  1. PHP-FPMをインストールします。
# emerge -av php-fpm
  1. Apacheで使用する各PHPバージョンのPHP-FPM起動スクリプトを作成します。

    PHP-FPMをインストールすると、スクリプトのファイル名サフィックス(たとえば、など)を使用または変更して/etc/init.d/php-fpm実行するPHPバージョンを選択できる起動スクリプト()が生成されます。一度に1つのPHPバージョンのみを使用したい場合、または2つ以下のバージョン(1つはmod_php、2番目はPHP-FPM)のみを使用したい場合にのみ使用したいので、サフィックスメソッドを使用します。私たちはスクリプトをコピーするのではなく、シンボリックリンクを使用したいです(有効なサフィックスは、例えばディレクトリ名などです)。eselectphp-fpm-php5.6php-fpm-php7.2eselectls -ld /usr/lib64/php*php5.6php7.2

# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
  1. サービスがPHPバージョンごとに異なるポートで実行されるように、PHP-FPM設定を変更します。

    正確なファイル名はバージョンごとに異なりますが、次の一般的な場所で各PHPバージョンの設定ファイルを編集して、各ディレクティブが異なるポートを持つように/etc/php/fpm-php*/*.confします。listen

  2. 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
  1. プロキシモジュールを有効にするには、Apache 起動設定を編集します。

    /etc/conf.d/apache2を追加して-D PROXY削除-D PHPするには、編集してくださいAPACHE2_OPTS

  2. 特定のディレクトリの場所を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>
  1. index.php有効なディレクトリインデックスファイルとして追加されました。

    Gentooには、通常どおりにディレクトリインデックスファイルを/etc/apache2/modules.d/70_mod_php.conf追加するディレクティブが含まれています。ステップ9でmod_phpを無効にしたため、この設定は不要になりました。この問題を解決するには、Apache設定に追加してください。そうではなく、そのパスにアクセスすると、403エラーが発生します。index.phpindex.html70_mod_php.confDirectoryIndex index.php/oldapp/

  2. 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を実行します。

関連情報