WordPress や独自 PHP アプリを動かすときの定番、Apache + PHP-FPM を Rocky Linux 9 でゼロから組む手順です。Rocky 9 では既に PHP-FPM がデフォルトの SAPI(旧来の mod_php は廃止)なので、最初から正しい構成で組み立てられます。
1. なぜ Apache + PHP-FPM か(背景)
mod_php という Apache 内部で PHP を実行する旧来の方式は、Rocky 9 ではもはや提供されません(RHEL 8 から PHP-FPM 一本化)。
| 観点 | 旧: mod_php | 新: PHP-FPM |
|---|---|---|
| プロセス構成 | Apache と同一プロセス | 別プロセスのプール |
| メモリ消費 | Apache の MPM ごとにPHPもロード = 重い | PHP は必要分だけ常駐 |
| ユーザー分離 | 全VHostがApacheユーザーで実行 | プール単位で実行ユーザー変更可 |
| 複数PHPバージョン | 困難 | プールごとに別バージョン可 |
| 高負荷耐性 | event MPM + mod_php は相性悪い | event MPM とフル両立 |
通信経路:
ブラウザ → Apache (httpd) → mod_proxy_fcgi → PHP-FPM プロセスプール → PHP実行 → 結果
↑ /run/php-fpm/www.sock (UNIX socket)2. インストール
Apache(httpd)
sudo dnf install -y httpdPHP のバージョンを選ぶ
Rocky 9 標準モジュールには PHP 8.0 までしかありません。8.2 / 8.3 / 8.4 を使いたい場合は remi リポジトリを追加します。下のタブから入れたいバージョンを選んで、コマンドをコピーしてください。
よく入れる PHP 拡張: php-mysqlnd(MySQL/MariaDB), php-mbstring(日本語処理), php-gd(画像処理), php-opcache(性能)。PostgreSQL を使うなら php-pgsql を追加。どのバージョンでも同じパッケージ名で入ります。
追加リポジトリ不要・最も安定。Rocky 9 のサポートライフサイクルに乗ります。
sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcacheremi リポジトリを追加 → モジュールを 8.2 に切り替え。
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset -y php
sudo dnf module install -y php:remi-8.2
sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcache2024 リリース。多くのフレームワークが推奨する現行版。
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset -y php
sudo dnf module install -y php:remi-8.3
sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcache最新版。新機能(property hooks 等)を試したい人向け。プロダクション利用前に対応状況を確認してください。
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module reset -y php
sudo dnf module install -y php:remi-8.4
sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcache導入後、バージョン確認:
php -vバージョンを後から変える場合は注意: dnf module reset → dnf module install で切り替え可能ですが、インストール済みの拡張モジュールは入れ直しが必要です。dnf module switch-to php:remi-8.4 が後継コマンドとして便利。
3. PHP-FPM の起動と確認
sudo systemctl enable --now php-fpm
systemctl status php-fpm --no-pager | head -8PHP-FPM が listen している socket を確認:
ls -la /run/php-fpm/www.socksrw-rw---- 1 root root 0 May 28 19:30 /run/php-fpm/www.sock所有者が root:root のままだと Apache(apache ユーザー)が socket に書けません。Rocky 9 標準の www.conf は listen.owner = apache listen.group = apache になっているはずですが、念のため確認:
grep -E '^listen\.(owner|group|mode)' /etc/php-fpm.d/www.conf4. Apache 設定(仮想ホスト)
/etc/httpd/conf.d/ 配下にドメイン別の設定ファイルを置きます。
sudo mkdir -p /var/www/example.com/html
sudo vi /etc/httpd/conf.d/example.com.conf<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
ServerAdmin [email protected]
ErrorLog /var/log/httpd/example.com_error.log
CustomLog /var/log/httpd/example.com_access.log combined
<Directory /var/www/example.com/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# PHP-FPM への振り分け(Rocky 9 ではこの1行で十分)
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>Rocky 9 標準の /etc/httpd/conf.d/php.conf で .php を PHP-FPM に振る設定はサイト共通でも有効化済みです。サイト固有で挙動を変えたい場合のみ上の FilesMatch を書きます。
設定構文チェック → 反映:
sudo httpd -t
sudo systemctl enable --now httpd
sudo systemctl reload httpd5. ファイアウォールで HTTP/HTTPS を開放
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-servicescockpit dhcpv6-client http https ssh6. 動作確認(phpinfo)
PHP が正しく動くかテスト用に簡単なファイルを置きます:
echo '<?php phpinfo();' | sudo tee /var/www/example.com/html/info.php
sudo chown apache:apache /var/www/example.com/html/info.phpブラウザで http://example.com/info.php にアクセス → PHP の設定情報がズラッと出れば成功。
動作確認後 info.php は必ず削除してください。PHP のバージョン・有効モジュール・サーバパスなど攻撃者に有益すぎる情報が露出します。
sudo rm /var/www/example.com/html/info.phpターミナルからの確認(簡単な PHP ファイルを置いて curl):
echo '<?= "OK: ".phpversion();' | sudo tee /var/www/example.com/html/test.php
curl -s http://example.com/test.phpOK: 8.0.30確認できたら削除:
sudo rm /var/www/example.com/html/test.php7. よくある PHP 設定の調整
/etc/php.ini は触らず、サイト固有の上書きは /etc/php.d/zz-local.ini(zz prefix で最後に読まれる)に書くのが安全。
; タイムゾーン
date.timezone = Asia/Tokyo
; メモリ・サイズ系(用途に応じて)
memory_limit = 256M
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 60
; エラー表示(本番では Off / ログだけ残す)
display_errors = Off
log_errors = On
error_log = /var/log/php-fpm/error.log設定反映には PHP-FPM の再起動が必要:
sudo systemctl restart php-fpm| 設定 | 標準 | WordPress程度なら | 重い処理 |
|---|---|---|---|
| memory_limit | 128M | 256M | 512M〜 |
| upload_max_filesize | 2M | 32M | 64M〜 |
| post_max_size | 8M | upload と同じ | upload と同じ |
| max_execution_time | 30 | 60 | 180〜 |
8. SELinux の落とし穴
Rocky 9 は SELinux Enforcing がデフォルト。**「localhost のはずなのに繋がらない」「ファイルが読めない」**のたいていの原因です。
よくある SELinux ブール値
# PHP からネットワーク(外部API / DB / SMTP)への接続を許可
sudo setsebool -P httpd_can_network_connect 1
# PHP から同サーバ内DB(MariaDB等)への接続を許可
sudo setsebool -P httpd_can_network_connect_db 1
# ホームディレクトリ配下を公開する場合
sudo setsebool -P httpd_enable_homedirs 1Webroot を標準外の場所に置く場合
/var/www/ 外(例: /data/web/)にドキュメントルートを置くとSELinux ラベルが合わず 403になります。
sudo semanage fcontext -a -t httpd_sys_content_t '/data/web(/.*)?'
sudo restorecon -Rv /data/webSELinux 関連の不可解な 403 / 500 が出たら、まず sudo ausearch -m avc -ts recent で SELinux 拒否を確認するのが最短ルート。
9. トラブルシューティング早見表
| 症状 | 確認場所 |
|---|---|
| 502 Bad Gateway | sudo journalctl -u php-fpm -n 30 / socket 権限 |
| 403 Forbidden | DocumentRoot のパーミッション・SELinuxラベル |
| 500 + 空の画面 | /var/log/httpd/*_error.log / php-fpm ログ |
| PHP ソースがそのまま表示 | httpd 再起動・FilesMatch 設定の不在 |
| データベース接続不可 | httpd_can_network_connect_db 未許可 |
| アップロードが途中で切れる | upload_max_filesize / post_max_size |
まとめ
httpd と php-fpm を導入
dnf install httpd php php-fpm
PHP-FPM 起動
systemctl enable --now php-fpm
Apache vhost 作成
/etc/httpd/conf.d/example.com.conf を配置
Apache 起動・ファイアウォール開放
systemctl enable --now httpd + firewall-cmd --add-service=http
動作確認 → テストファイル削除
phpinfo 確認後、必ず消す
php.ini 系の調整は zz-local.ini に分離
/etc/php.d/zz-local.ini
これで PHP アプリが動く土台ができました。次は Let’s Encrypt + Nginx で HTTPS化 (次の記事予定)や、WordPress を入れる場合は MariaDB 構築へ進みます。




