サーバー環境
前提
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/)。