Rocky Linux 9 で Apache + PHP-FPM を最小構成で立ち上げる

cable network

WordPress や独自 PHP アプリを動かすときの定番、Apache + PHP-FPM を Rocky Linux 9 でゼロから組む手順です。Rocky 9 では既に PHP-FPM がデフォルトの SAPI(旧来の mod_php は廃止)なので、最初から正しい構成で組み立てられます。

前提条件
  • Rocky Linux 9.x が動作するサーバ
  • sudo 権限・システム更新済みホスト名設定済み
  • ドメインの DNS A レコードがサーバを指している(HTTPS化まで進めるなら必須、今回の単純動作確認は不要)

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 とフル両立

通信経路:

text
ブラウザ → Apache (httpd) → mod_proxy_fcgi → PHP-FPM プロセスプール → PHP実行 → 結果
                                              ↑ /run/php-fpm/www.sock (UNIX socket)

2. インストール

Apache(httpd)

bash
sudo dnf install -y httpd

PHP のバージョンを選ぶ

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 のサポートライフサイクルに乗ります。

bash
sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd php-opcache

remi リポジトリを追加 → モジュールを 8.2 に切り替え。

bash
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-opcache

2024 リリース。多くのフレームワークが推奨する現行版。

bash
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 等)を試したい人向け。プロダクション利用前に対応状況を確認してください。

bash
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

導入後、バージョン確認:

bash
php -v
注意

バージョンを後から変える場合は注意: dnf module resetdnf module install で切り替え可能ですが、インストール済みの拡張モジュールは入れ直しが必要です。dnf module switch-to php:remi-8.4 が後継コマンドとして便利。

3. PHP-FPM の起動と確認

bash
sudo systemctl enable --now php-fpm
systemctl status php-fpm --no-pager | head -8

PHP-FPM が listen している socket を確認:

bash
ls -la /run/php-fpm/www.sock
出力
srw-rw---- 1 root root 0 May 28 19:30 /run/php-fpm/www.sock
注意

所有者が root:root のままだと Apache(apache ユーザー)が socket に書けません。Rocky 9 標準の www.conflisten.owner = apache listen.group = apache になっているはずですが、念のため確認:

bash
grep -E '^listen\.(owner|group|mode)' /etc/php-fpm.d/www.conf

4. Apache 設定(仮想ホスト)

/etc/httpd/conf.d/ 配下にドメイン別の設定ファイルを置きます。

bash
sudo mkdir -p /var/www/example.com/html
sudo vi /etc/httpd/conf.d/example.com.conf
/etc/httpd/conf.d/example.com.confapache
<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 を書きます。

設定構文チェック → 反映:

bash
sudo httpd -t
sudo systemctl enable --now httpd
sudo systemctl reload httpd

5. ファイアウォールで HTTP/HTTPS を開放

bash
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
出力
cockpit dhcpv6-client http https ssh

6. 動作確認(phpinfo)

PHP が正しく動くかテスト用に簡単なファイルを置きます:

bash
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 のバージョン・有効モジュール・サーバパスなど攻撃者に有益すぎる情報が露出します。

bash
sudo rm /var/www/example.com/html/info.php

ターミナルからの確認(簡単な PHP ファイルを置いて curl):

bash
echo '<?= "OK: ".phpversion();' | sudo tee /var/www/example.com/html/test.php
curl -s http://example.com/test.php
出力
OK: 8.0.30

確認できたら削除:

bash
sudo rm /var/www/example.com/html/test.php

7. よくある PHP 設定の調整

/etc/php.ini は触らず、サイト固有の上書きは /etc/php.d/zz-local.ini(zz prefix で最後に読まれる)に書くのが安全。

/etc/php.d/zz-local.iniini
; タイムゾーン
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 の再起動が必要:

bash
sudo systemctl restart php-fpm
設定標準WordPress程度なら重い処理
memory_limit128M256M512M〜
upload_max_filesize2M32M64M〜
post_max_size8Mupload と同じupload と同じ
max_execution_time3060180〜

8. SELinux の落とし穴

Rocky 9 は SELinux Enforcing がデフォルト。**「localhost のはずなのに繋がらない」「ファイルが読めない」**のたいていの原因です。

よくある SELinux ブール値

bash
# 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 1

Webroot を標準外の場所に置く場合

/var/www/ 外(例: /data/web/)にドキュメントルートを置くとSELinux ラベルが合わず 403になります。

bash
sudo semanage fcontext -a -t httpd_sys_content_t '/data/web(/.*)?'
sudo restorecon -Rv /data/web
注意

SELinux 関連の不可解な 403 / 500 が出たら、まず sudo ausearch -m avc -ts recent で SELinux 拒否を確認するのが最短ルート。

9. トラブルシューティング早見表

症状確認場所
502 Bad Gatewaysudo journalctl -u php-fpm -n 30 / socket 権限
403 ForbiddenDocumentRoot のパーミッション・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 構築へ進みます。