スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/2GB・3コア → 4GB・4コア/Ubuntu 26.04 LTS

⑤ PHP

旧サーバーはondrej/phpのPPAでPHP 8.5にしていたが、新サーバーはUbuntu標準リポジトリに最初から8.5が入っている。 mod_phpからPHP-FPMへの切り替え、5サイト中4サイトだけに必要な「.html内PHP実行」の扱い、 そして動作確認中に見つかった単純な見落としまでを記録する。

作業端末: iPad mini(Termius)

MIGRATION ROADMAP — 全17工程
  1. ① SSH、ユーザー追加
  2. ② IPv4/IPv6追加、netplan、ufw
  3. ③ Apache2
  4. ④ Let's Encrypt
  5. ⑤ PHP
  6. ⑥ MariaDB
  7. ⑦ WordPress
  8. ⑧ Dovecot、Postfix
  9. ⑨ Vsftpd
  10. ⑩ Python
  11. ⑪ llama.cpp、ChromaDB
  12. ⑫ Anaconda、Keras、TensorFlow
  13. ⑬ Node.js
  14. ⑭ MongoDB
  15. ⑮ Mosquitto
  16. ⑯ RabbitMQ
  17. ⑰ Supervisor

01PPAが不要になった

旧サーバーではUbuntu標準のPHPが古く、ondrej/phpのPPAを追加して8.5を入れていた。 新サーバー(Ubuntu 26.04 LTS)は標準リポジトリに最初からPHP 8.5が入っているため、PPAの追加が丸ごと不要になった。 2021年以前の設定を見直せる点の一つ。

02mod_phpではなくPHP-FPMを選んだ理由

③で決めた権限設計(Apache=www-data=読み取り専用、PHP=login-user=書き込み可)を実現するには、Apacheに埋め込まれるmod_phpではなく、 独立プロセスとして動くPHP-FPMが必要になる。今回はFPMで統一する。

03インストール

当初opcacheも個別パッケージとして入れる想定だったが、PHP 8.5からopcacheはコア機能に統合され、 php8.5-opcacheというパッケージ自体が存在しなくなっていた。bcmathは旧サーバーで実際に使っているページがあったため追加。

login-user@新サーバー
$ sudo apt update $ sudo apt install php8.5-fpm php8.5-cli php8.5-mysql php8.5-mbstring \ php8.5-xml php8.5-curl php8.5-zip php8.5-gd php8.5-intl php8.5-bcmath
opcacheの有効確認 個別パッケージがなくなった分、有効化を自動でやってくれる仕組みもない。/etc/php/8.5/fpm/php.iniのopcache.enable=1を目視で確認する必要がある。

04Apache連携で③に不足があった

③で有効化したモジュールはhttp2 proxy proxy_wstunnel rewrite setenvif sslで、PHP-FPM連携に必要なproxy_fcgiが抜けていた。

login-user@新サーバー
$ sudo a2enmod proxy_fcgi $ sudo a2enconf php8.5-fpm

05poolをlogin-user用に

/etc/php/8.5/fpm/pool.d/www.conf
user = login-user group = login-user listen.owner = www-data listen.group = www-data security.limit_extensions = .php .html pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3

5サイトとも所有者が同じlogin-userなので、まずは1プール共有で開始する。ソケットの所有者はwww-data系のままにして、Apache側から接続できるようにしている。 4GB RAMという制約を踏まえ、pm.max_childrenは控えめな値からスタート。

06.html内PHP実行、対象は3サイトではなく4サイトだった

旧サーバーでは.html拡張子のファイル内でもPHPを実行する設定が入っていた。当初「iseeit.jp、gwaw.jp、appw.jpの3サイト」という認識で進めていたが、 実際には先日導入した5サイト共通のPHPログシステムが影響しており、純粋なWordPressサイトのibe.tokyo以外の4サイト(iseeit.jp、gwaw.jp、appw.jp、sasagawa.tokyo)が対象だった。

共通設定(php8.5-fpm.conf)に.htmlを含めることも検討したが、見送った。 ソケットパスにはPHPのバージョン番号が入っている(php8.5-fpm.sock)ため、将来のバージョンアップ時にパス修正が必要になる点は共通化してもしなくても変わらない。 それよりも、ibe.tokyoのような「.htmlをPHPとして実行してほしくないサイト」を設定上はっきり除外できるという点を優先し、対象4サイトのVirtualHostに個別でFilesMatchブロックを追加する方式にした。

各VirtualHost内(80/443)
<FilesMatch ".+\.(phar|php|phtml|html)$"> SetHandler "proxy:unix:/run/php/php8.5-fpm.sock|fcgi://localhost" </FilesMatch>
サイト.html内PHP実行
iseeit.jp有効(80/443の2ファイルに追加)
gwaw.jp有効(同上)
appw.jp有効(同上)
sasagawa.tokyo有効(同上)
ibe.tokyo無効(素のまま、.phpのみ)

共通設定側(php8.5-fpm.conf)はパッケージ標準の.phpのみに戻し、8ファイルへの個別追加で対応した。

07動作確認

DNSがまだ新サーバーを向いていないため、curl --resolveでSNI・Host名を保ったまま新サーバーへ直接接続する形でテストした。

login-user@新サーバー
$ curl --resolve iseeit.jp:443:160.251.145.xx https://iseeit.jp/phpinfo.php curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version number
原因: サイトを有効化し忘れていた sites-available配下のファイルは編集していたが、a2ensiteでsites-enabledへ反映していなかった。 有効なVirtualHostが1つもない状態でもmod_sslはポート443を待ち受け続けるためTCP接続自体は成立するが、 TLSハンドシェイクを引き取るVirtualHostがなく、ClientHelloを素のHTTPとして扱おうとして破綻し「wrong version number」というエラーになっていた。
login-user@新サーバー
$ sudo a2ensite ssl-iseeit_jp.conf iseeit_jp.conf \ ssl-gwaw_jp.conf gwaw_jp.conf \ ssl-appw_jp.conf appw_jp.conf \ ssl-ibe_tokyo.conf ibe_tokyo.conf \ ssl-login-user_tokyo.conf login-user_tokyo.conf $ sudo apache2ctl configtest $ sudo systemctl reload apache2
確認完了 有効化後、phpinfo()が正常に表示された。実行ユーザーがlogin-userであること、Server APIがFPM/FastCGIであること、bcmath等の拡張が読み込まれていること、 ibe.tokyoでは.htmlが実行されず生テキストのまま返ることをすべて確認。確認後、テストファイルは削除した。

08ここまでの状態

  • PHP 8.5をUbuntu標準リポジトリからPHP-FPMとしてインストール(PPA不要)
  • poolはuser/group=login-userに設定、Apache(www-data)とは実行ユーザーを分離
  • .html内PHP実行は4サイトのVirtualHostに個別設定、ibe.tokyoのみ除外
  • サイト未有効化(a2ensite漏れ)によるTLSエラーを解決し、5サイトすべてで動作確認済み
← 前回: ④ Let's Encrypt 次回: ⑥ MariaDB →

『ConoHa VPS移設記 ⑤ PHP』を公開しました。