こんにちは、レムシステム株式会社のエンジニア、小村(@system_kom)です。今回は、Nextcloud の新バージョン対応を目的に、PHP 8.1 から 8.3 へのアップグレード手順(AlmaLinux/RHEL系・Remi モジュール利用)を、実運用で安全に進めるためのポイントとあわせて詳しく解説します。(Nextcloudを利用していない環境でもPHPのバージョンアップ手順は同じです)
読者はインフラの基礎知識をお持ちの方向けに、事前準備 → モジュール切替 → パッケージ同期 → 設定調整 → 稼働確認 → ロールバックまで一通り網羅しています。
対象と前提
本記事は AlmaLinux 9(※8系でも操作は近似)で、dnf module と Remi のモジュールストリームを用いて PHP を 8.1 から 8.3 に上げるケースを想定します。Nextcloud 本体は別作業とし、ここでは PHP レイヤに焦点を当てます。
本番前には ステージングで検証し、稼働中の Web/AP 停止時間を最小化できるようメンテナンス時間を確保してください。
1. 事前のバージョン確認とバックアップ
まず現状の PHP とモジュール、関連パッケージ一覧を記録し、php.ini と /etc/php.d を丸ごと退避します。復旧や差分確認の生命線です。
command
$ php -v
$ dnf module list php
$ rpm -qa | grep -E '^php(-|$)|^php-pecl' | sort | tee ~/php-packages-8.1.txt
$ sudo cp -a /etc/php.ini /etc/php.ini.bak.$(date +%F)
$ sudo cp -a /etc/php.d /etc/php.d.bak.$(date +%F)
あわせて、後述のロールバック用にも ~/php-packages-8.1.txt は保管しておきましょう。
2. モジュールの切り替え(8.1 → 8.3)
php モジュールをいったん reset し、Remi の php:remi-8.3 を enable します。既存 8.1 からの置換が前提のため、後続の distro-sync を必ず実施します。
command
$ sudo dnf -y module reset php
$ sudo dnf -y module enable php:remi-8.3
Remi/Safe リポジトリが未導入の環境は、事前に公式手順で追加してから進めてください(ここでは既に利用できる前提です)。
3. パッケージを 8.3 系へ同期(置換)
依存の入れ替えが発生するため、--allowerasing を付けて distro-sync を実行します。--refresh でメタデータも更新します。
command
$ sudo dnf -y distro-sync php* php-pecl-* --allowerasing --refresh
完了後、インストール済みの PHP 関連が 8.3 系に揃っているかをざっと確認します。
command
$ dnf list installed | grep php
4. 設定ファイルの差分確認と推奨調整
PHP 8.3 では既定値や警告レベルが変わる箇所があります。アプリ(Nextcloud)運用の観点で、以下を確認・調整してください。ファイルは /etc/php.ini と、/etc/php.d/*.ini に分散しています。
代表的な推奨項目(例)
php.ini 推奨例
I/O とアップロード
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 360
max_input_time = 360
memory_limit = 1G
タイムゾーン
date.timezone = "Asia/Tokyo"
ログ/エラーハンドリング
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
OPCache(/etc/php.d/10-opcache.ini など)
opcache.enable=1
opcache.enable_cli=0
opcache.validate_timestamps=1
opcache.revalidate_freq=60
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=100000
opcache.memory_consumption=256
opcache.jit=0
APCu(/etc/php.d/40-apcu.ini など)
apc.enable_cli=0
apc.shm_size=128M
数値はワークロードやメモリ総量に合わせて調整します。Nextcloud の大容量アップロードを扱う場合、upload_max_filesize と post_max_size は Web サーバのリバースプロキシ設定(Nginx client_max_body_size、Apache LimitRequestBody など)と整合させます。
5. PHP-FPM の設定確認(ソケット/ユーザー/PM)
PHP-FPM を利用している環境では、/etc/php-fpm.d/www.conf を見直します。Web サーバ側の設定(Apache proxy:fcgi / Nginx fastcgi_pass)と ソケットパス(例:/run/php-fpm/www.sock)を合わせ、権限も一致させます。
/etc/php-fpm.d/www.conf
例
; user / group は Web サーバ実行ユーザに合わせる(例:apache / nginx)
user = apache
group = apache
; ソケットパスは Web サーバ設定と一致させる
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
; プロセスマネージャ
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
SELinux を Enforcing で運用している場合、UNIX ソケット利用時は通常追加の設定は不要ですが、TCP リッスンへ切り替える場合は適切なポート型への割当や boolean(例:httpd_can_network_connect)の見直しが必要です。
6. サービスの再起動と起動時確認
設定反映のため、PHP-FPM を再起動します。Apache/Nginx を併用している場合は、その再読込/再起動も実施してください。
command
$ sudo systemctl enable --now php-fpm
$ sudo systemctl restart php-fpm
$ sudo systemctl status php-fpm --no-pager
Apache の例
$ sudo systemctl reload httpd
Nginx の例
$ sudo systemctl reload nginx
稼働確認には、バージョンとモジュール、OPcache/APCu のロード状況をチェックします。
command
$ php -v
$ php -m | egrep 'opcache|apcu|redis|imagick'
$ php -i | egrep 'memory_limit|upload_max_filesize|post_max_size|date.timezone'
7. Nextcloud 観点の最終チェック
Nextcloud の動作要件はリリースごとに更新されます。アップグレード前に必ず公式要件を確認し、CLI の occ コマンドで状態を確認します(sudo -u <webユーザ> php occ status など)。キャッシュ用 Redis を併用している場合は、php-pecl-redis モジュールが 8.3 対応版に更新されているかも確認してください。
command(例)
Nextcloud のメンテナンスモード確認/切替(例)
$ sudo -u apache php /var/www/nextcloud/occ status
$ sudo -u apache php /var/www/nextcloud/occ maintenance:mode --off
8. よくあるハマりどころ(トラブルシュート)
1) 古い設定/拡張子の残骸:/etc/php.d.bak-YYYY-MM-DD と現行の差分で、不要/廃止オプションが残っていないか確認します。
2) Imagick/Policy:PDF/PS の扱いでサムネイルが失敗する場合は /etc/ImageMagick-6/policy.xml の制限を確認。
3) ファイルサイズ制限:Nginx/Apache 側のアップロード制限が PHP 設定と不整合。
4) SELinux:外部接続が必要なプラグイン利用時は boolean の見直し(例:setsebool -P httpd_can_network_connect on)。
5) OPcache/APCu 未ロード:php -m に表示されなければ対応モジュールを追加インストール。
9. ロールバック(必要時)
アプリ互換で問題が出た場合、一時的に 8.1 へ戻すことも可能です。ただし依存関係により完全一致は保証されません。緊急退避の手順例を示します。
command(ロールバック例)
モジュールを 8.1 に戻す
$ sudo dnf -y module reset php
$ sudo dnf -y module enable php:remi-8.1
既存の一覧を参考に同期
$ sudo dnf -y distro-sync php* php-pecl-* --allowerasing --refresh
サービス再起動
$ sudo systemctl restart php-fpm
根本対応としては、アプリ側の互換性やプラグイン更新を優先し、計画的に 8.3 定着を図ることを推奨します。
10. セキュリティと運用のヒント
PHP アップグレードはセキュリティ向上の効果が大きい一方で、定期パッチ適用と監視が伴ってこそ安定します。以下の運用を組み込むと障害予防に有効です。
運用ヒント
代表例
定期的な "dnf makecache && dnf check-update" の実行
php-fpm / httpd / nginx のエラーログウォッチ
php.ini / *.ini の変更点を Git などでバージョン管理
大規模アップロード前の一時的な制限緩和と事後復元の手順化
メンテ時間帯の告知とヘルスチェックの自動化
まとめ
以上、Nextcloud 更新に伴う PHP 8.1 → 8.3 への安全な移行手順でした。
「モジュール切替 → パッケージ同期 → 設定見直し → サービス再起動 → 動作検証」までを通すことで、互換性の落とし穴を避けつつ最新の PHP を活かせます。
レムシステム株式会社では、計画立案・検証・本番移行・監視までエンドツーエンドでご支援可能です。要件に応じた最適値のチューニングや、Nextcloud のクラスタ/オブジェクトストレージ連携などもお気軽にご相談ください。