VPS для PHP / Symfony: php-fpm и opcache
Symfony на production работает через php-fpm за nginx. Разберём установку PHP, конфиг nginx под фронт-контроллер, настройку opcache и preload для скорости, а также права на каталоги.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Как устроен деплой Symfony
Symfony использует единую точку входа — public/index.php. Все запросы nginx направляет на этот фронт-контроллер, а исполняет PHP-код php-fpm. nginx при этом отдаёт статику напрямую.
Скорость PHP на production критически зависит от opcache — он кэширует скомпилированный байткод и убирает повторную компиляцию на каждом запросе. Без него Symfony работает в разы медленнее.
- php-fpm — пул процессов PHP.
- opcache — кэш байткода, ключ к скорости.
- Фронт-контроллер — весь трафик через index.php.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для SymfonyУстановка PHP и расширений
Ставим php-fpm и типовой набор расширений для Symfony (intl, mbstring, xml, работа с БД).
sudo apt update
sudo apt install -y nginx php-fpm php-cli php-intl php-mbstring php-xml php-curl php-pgsql php-zip unzip git
php -v
systemctl status php8.3-fpm
Composer ставим глобально для управления зависимостями:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
Деплой кода и права
Ставим зависимости в production-режиме и прогреваем кэш. Каталог var/ должен быть доступен на запись пользователю php-fpm (обычно www-data).
cd /var/www/symfony
composer install --no-dev --optimize-autoloader
APP_ENV=prod php bin/console cache:clear
sudo chown -R www-data:www-data var/
Переменные окружения задаются в .env.local или на уровне системы; APP_ENV=prod и APP_DEBUG=0 обязательны для боевого контура. Для скорости скомпилируйте .env в статический файл — тогда Symfony не парсит dotenv на каждом запросе.
composer dump-env prod
APP_ENV=prod php bin/console cache:warmup
Конфиг nginx
nginx отдаёт статику из public и передаёт PHP в сокет php-fpm. Важно направлять на index.php только несуществующие пути.
server {
listen 80;
server_name example.com;
root /var/www/symfony/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ \.php$ { return 404; }
}
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d example.com
opcache и preload
Для production включаем opcache с валидацией по таймауту (или отключаем её вовсе, если деплой сбрасывает кэш). Symfony поддерживает preload — загрузку классов в память при старте php-fpm.
; /etc/php/8.3/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.preload=/var/www/symfony/config/preload.php
opcache.preload_user=www-data
После правок конфига перезапускаем пул: sudo systemctl restart php8.3-fpm. При validate_timestamps=0 не забывайте очищать opcache при каждом деплое. Отдельно стоит настроить число процессов пула: параметр pm.max_children подбирают по объёму RAM и среднему потреблению одного процесса php-fpm.
; /etc/php/8.3/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
Конфигурация сервера и грабли
PHP-FPM хорошо масштабируется по числу процессов, а скорость ответа зависит от CPU и диска. AMD EPYC + NVMe у MAATRIX дают быстрый opcache-прогрев и отзывчивость под нагрузкой, тарифы от $8/мес и ежедневные бэкапы удобны для боевого сайта. Локации UK/США/РФ и оплата из России (карта РФ, СБП, крипта, MAAT) снимают барьер зарубежного хостинга.
- Нет прав на var/ — Symfony не запишет кэш и логи, ошибка 500.
- opcache выключен — медленные ответы, лишняя нагрузка на CPU.
- validate_timestamps=0 без сброса — старый код продолжает работать после деплоя.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для SymfonyОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Нужен ли Apache для Symfony?
Нет, nginx + php-fpm — стандартная и более лёгкая связка для production. Apache с mod_php тоже работает, но требует больше ресурсов.
Как сильно opcache ускоряет Symfony?
Существенно: без кэша PHP компилирует все файлы на каждом запросе. С opcache и preload время ответа падает в разы, особенно на крупных приложениях.
Что делать при ошибке 500 после деплоя?
Проверьте права на var/, очистите кэш командой cache:clear и посмотрите логи в var/log/prod.log и journalctl php-fpm.