〇 要件
これまで、php7.4にてWEBサーバーを運用していたが、とあるアプリケーションのバージョンアップをする為には、
php8.2 or php8.3に上げる必要があった。
しかしながら、単純にphpを7.4 -> 8系に上げると稼働しているCMSが動作しない事が判明。
まあ、諸事情によりCMSのphp8系対応は見通しが立たない。
という訳で、とあるアプリケーションだけphp8系に上げる事にした。
[環境] ※導入前
・Rocky Linux 8.9 (Green Obsidian)
・httpd-2.4.37-62.module+el8.9.0+1436+2b7d5021.x86_64
・php-7.4.33-1.module+el8.8.0+1150+ac720675.x86_64
→ コンテンツは、php7.4にて稼働中
※ この記事は検証環境で試して成功した段階で忘れないように執筆しています。
本番環境を弄った際に手順が異なったら、後ほど記事を修正します。
〇 Googleと・・・・
世の中には同様に考えている人が多いもので、さくっと見た限りでは2通りの方法がある。
・バーチャルホスト毎にphpバージョンを分ける
・ドキュメントルート ディレクトリでphpバージョンを分ける。
今回は後者のディレクトリでphpバージョンを分ける方法を選択した。
〇 php8系のインストール
RockyLinux8のAppStreamは8.0までのようなので、Remiレポジトリを追加
※ EPELリポジトリは既に設定済。未導入の場合は、依存関係で必要なRPMがあるので導入必須
# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
# dnf update
今回は、php8.2をインストールする。
# dnf install php82 php82-php-gd php82-php-xml php82-php-mbstring php82-php-mysqlnd php82-php-embedded
インストール完了後
# systemctl restart httpd
# ps -ef | grep -e "httpd" -e "php-fpm"
php-fpmのインスタンスが、/etc/php-fpm.confに加え、/etc/opt/remi/php82/php-fpm.confの2つが立ち上がる。
root 2231 1 0 16:48 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
root 2233 1 0 16:48 ? 00:00:00 php-fpm: master process (/etc/opt/remi/php82/php-fpm.conf)
root 2238 1 0 16:48 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2240 2233 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2241 2233 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2242 2233 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2243 2233 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2244 2233 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2245 2238 0 16:48 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2246 2238 0 16:48 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2247 2238 0 16:48 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2248 2238 0 16:48 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2460 2231 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2461 2231 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2462 2231 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2463 2231 0 16:48 ? 00:00:00 php-fpm: pool www
apache 2464 2231 0 16:48 ? 00:00:00 php-fpm: pool www
*** 問題発生 ***
サイトを確認すると、php画面が真っ白。もしかして・・・と思って、速攻でphpinfoファイルを作って、
ブラウザで読み込ませてみると、「PHP Version 8.2.13」orz
httpdの設定ファイルを確認すると、
/etc/httpd/conf.dに、既存 php.conf に加え、php82-php.confが出来上がっている。
内容を確認したが重複する設定内容となっており、php.conf -> php82-php.confの順で読み込まれている推測。
結果的に、php82-php.confの設定内容が、有効化されたものと思われる。
[php82-php.confを無効化]
# cd /etc/httpd/conf.d
# mv php82-php.conf php82-php.conf.off
→ httpd.conf で、「IncludeOptional conf.d/*.conf」となっているので、拡張子が変われば読み込まれない。
# systemctl restart httpd
再度、ブラウザでphpinfo確認「PHP Version 7.4.33」に戻った。
とりあえず、これでphp8系の使える事前準備が完了した。
(現状の設定では、全てのコンテンツ(バーチャルホスト含め)でphp7.4が使われるはず)
〇 とあるアプリだけphp8系を使う設定を行う
アプリ名(仮)が、php-ABCsoft
/var/www/html/php-ABCsoft-1.2.3 が本体のディレクトリ名
シンボリックリンクを張っている。php-ABCsoft -> php-ABCsoft-1.2.3
設定は、「.htaccess」でも良いのだが、私はどちらかというとconfファイルに書く性分だ。
どうせ時間が経つと忘れるので、confで設定したほうが手を加えている事に早く気付ける。
という訳で、
httpd.confの追加設定で、
<Directory "/var/www/html/php-ABCsoft">
Options +FollowSymLinks
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/opt/remi/php82/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</Directory>
念のため、
・/var/www/html/php-ABCsoft/phpinfo.php
・/var/www/html/phpinfo.php
ファイルを置いておく。
phpinfo.php の中身は、言わずもがな <?php phpinfo(); ?> である。
# systemctl restart httpd
後は、ブラウザにて、
https://hogehoge.chovits.jp/phpinfo.php
-> PHP Version 7.4.33
https://hogehoge.chovits.jp/php-ABCsoft/phpinfo.php
-> PHP Version 8.2.13
を確認。
phpのバージョン確認が終わったら、phpinfo.phpを削除するのを忘れずに・・・
〇 感想
php-fpmを使う以外に、php-cgi を /cgi-bin配下に置いて、Actionディレクティブに引き渡す方法もGoogleったら出てきた。
最初は、
# cp -p /opt/remi/php82/root/usr/bin/php-cgi /var/www/cgi-bin/php-cgi
<Directory "/var/www/html/php-ABCsoft">
Options +FollowSymLinks
<FilesMatch \.php$>
Action php82 /cgi-bin/php-cgi
AddHandler php82 .php
</FilesMatch>
</Directory>
しかしながら、この設定方法ではうまくphp82のphp-cgiを使ってくれなかった。
phpinfoでは、7.4.33 のままでphp8系にならない。
/etc/httpd/conf.d/php.conf で、デフォルトはphp7系を使うように、SetHandler で php-fpmに渡す設定がされている。
あくまで予想だが、Actionディレクティブよりも、SetHandlerが優先されたのだろう。
ここでハマって時間を要してしまった。