前提

EC2: Arm64 Ubuntu 26.04 PHP:Ubuntu 公式アーカイブの Apache と mod_php 8.5

必要なパッケージと設定

Symfony の公式ドキュメントで説明されている Apache の構成は PHP-FPM だけで、mod_php の構成は載っていないません。

公式ドキュメント

種類 ドキュメント 書いてあること
Symfony の要件 Installing & Setting up the Symfony Framework (7.4) PHP 8.2 以上。必須の拡張は Ctype・iconv・PCRE・Session・SimpleXML・Tokenizer
Symfony の Web サーバー設定 Configuring a Web Server (7.4) Apache の VirtualHost の例(DocumentRoot …/public、AllowOverride None、FallbackResource /index.php)。例は PHP-FPM 用。.htaccess(symfony/apache-pack)はお試し用で、本番では設定を VirtualHost に移すよう勧めている
Symfony の本番デプロイ How to Deploy a Symfony Application (7.4) composer install --no-dev --optimize-autoloader、cache:clear、composer dump-env prod、APP_SECRET の扱い
Symfony の var/ の権限 Setting up or Fixing File Permissions (7.4) setfacl で www-data と作業ユーザーに var/ の書き込みを許可する(推奨の方法)
Symfony の本番チューニング Performance (7.4) OPcache の設定、realpath キャッシュ、preload、Composer のオートローダーの最適化
Ubuntu での mod_php の導入 Ubuntu Server: How to install and configure PHP sudo apt install php libapache2-mod-php で mod_php が有効になる。/etc/apache2/mods-enabled/php8.*.{conf,load} で確認できる
PHP 公式(Debian 系) PHP Manual: Installing on Debian GNU/Linux apt install php-common libapache2-mod-php php-cli。拡張を入れたら Apache の再起動が必要。php.ini は Apache 用と CLI 用で別
Ubuntu 26.04 のパッケージ packages.ubuntu.com: php8.5(resolute) libapache2-mod-php8.5 などのパッケージの一覧とバージョン

必要なパッケージ

composer.lock から拾い出した PHP 拡張は、次のパッケージで足りる(docker/Dockerfile と同じ)。

sudo apt update
sudo apt install apache2 libapache2-mod-php8.5 php8.5-cli \
  php8.5-curl php8.5-intl php8.5-mbstring php8.5-xml
パッケージ 用途
apache2 Web サーバー
libapache2-mod-php8.5 mod_php。入れると自動で有効になり、MPM は prefork に切り替わる
php8.5-cli bin/console、composer
php8.5-xml dom・xml・simplexml・xmlwriter(symfony/framework-bundle と、HTML を扱う masterminds/html5 が使う)
php8.5-mbstring masterminds/html5
php8.5-curl esa API を呼ぶ Guzzle が使う
php8.5-intl 翻訳やロケールの処理(入れておくのが無難)
  • Ctype・iconv・Tokenizer・Session・JSON は、php8.5-common にデフォルトで含まれている
  • OPcache は PHP 8.5 から本体に含まれている(php -m | grep -i opcache で確認)
  • Composer は、getcomposer.org の手順か apt の composer で入れる。rsync で vendor/ ごと転送する場合は、本番機に Composer は不要

確認

apt-cache policy libapache2-mod-php8.5 
php -v
php -m
ls /etc/apache2/mods-enabled/ | grep -E 'php|mpm|rewrite'

Ubuntu はセキュリティ修正をバックポートで取り込むため、修正が入っているかは php -v ではなくパッケージのバージョン(例:8.5.4-0ubuntu1.5)で判断します。

Apache の設定

案 A:Symfony 推奨の形(VirtualHost に書く。.htaccess も mod_rewrite も不要)

Symfony の公式の例から、PHP-FPM 用の <FilesMatch \.php$> SetHandler proxy:… を除いた形の例です。

<VirtualHost *:80>
    ServerName example.com

    DocumentRoot /var/www/html/public
    <Directory /var/www/html/public>
        AllowOverride None
        Require all granted
        FallbackResource /index.php
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>

有効化

sudo cp example.com.conf /etc/apache2/sites-available/example.com.conf
sudo a2ensite example.com
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

PHP の設定(/etc/php/8.5/apache2/php.ini)

Apache 用(/etc/php/8.5/apache2/php.ini)と CLI 用(/etc/php/8.5/cli/php.ini)は別ファイル。
直接編集するより、/etc/php/8.5/apache2/conf.d/99-foo.ini のように別ファイルで上書きすると、パッケージの更新で衝突しにくくなります。

; OPcache(Symfony Performance より)
opcache.memory_consumption=256
opcache.max_accelerated_files=32531
opcache.interned_strings_buffer=32
; デプロイ後に Apache の再起動(または reload)が必要になる
opcache.validate_timestamps=0

; realpath キャッシュ
realpath_cache_size=4096K
realpath_cache_ttl=600
  • opcache.validate_timestamps=0 にすると、PHP ファイルを書き換えても反映されない。rsync の後に sudo systemctl reload apache2 を実行する。
  • preload(opcache.preload)は Symfony Flex が作る config/preload.php を前提にしている。foo は Flex を使っていないので、使う場合は別に検討する。

var/ の権限(Symfony File Permissions)

デプロイ用ユーザー(例:deploy)と www-data の両方が var/ に書き込めるよう、ACL を設定する。

sudo apt install acl   # 入っていなければ
cd /var/www/example
sudo setfacl -dR -m u:www-data:rwX -m u:deploy:rwX var
sudo setfacl -R  -m u:www-data:rwX -m u:deploy:rwX var
  • 1 行目は、これから作られるファイルに引き継がれる設定(デフォルト ACL)。
  • 2 行目は、今あるファイルへの設定。
  • rsync では var/ を転送対象から外す(--exclude=var/)。