VPS для PHP / Symfony: php-fpm и opcache
Symfony на production работает через php-fpm за nginx. Разберём установку PHP, конфиг nginx под фронт-контроллер, настройку opcache и preload для скорости, а также права на каталоги.
Содержание
Как устроен деплой 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\nsudo apt install -y nginx php-fpm php-cli php-intl php-mbstring php-xml php-curl php-pgsql php-zip unzip git\nphp -v\nsystemctl status php8.3-fpm', 'Composer ставим глобально для управления зависимостями:', 'curl -sS https://getcomposer.org/installer | php\nsudo mv composer.phar /usr/local/bin/composer']
Деплой кода и права
['Ставим зависимости в production-режиме и прогреваем кэш. Каталог var/ должен быть доступен на запись пользователю php-fpm (обычно www-data).', 'cd /var/www/symfony\ncomposer install --no-dev --optimize-autoloader\nAPP_ENV=prod php bin/console cache:clear\nsudo chown -R www-data:www-data var/', 'Переменные окружения задаются в .env.local или на уровне системы; APP_ENV=prod и APP_DEBUG=0 обязательны для боевого контура. Для скорости скомпилируйте .env в статический файл — тогда Symfony не парсит dotenv на каждом запросе.', 'composer dump-env prod\nAPP_ENV=prod php bin/console cache:warmup']
Конфиг nginx
['nginx отдаёт статику из public и передаёт PHP в сокет php-fpm. Важно направлять на index.php только несуществующие пути.', 'server {\n listen 80;\n server_name example.com;\n root /var/www/symfony/public;\n location / {\n try_files $uri /index.php$is_args$args;\n }\n location ~ ^/index\\.php(/|$) {\n fastcgi_pass unix:/run/php/php8.3-fpm.sock;\n fastcgi_split_path_info ^(.+\\.php)(/.*)$;\n include fastcgi_params;\n fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n fastcgi_param DOCUMENT_ROOT $realpath_root;\n internal;\n }\n location ~ \\.php$ { return 404; }\n}', 'sudo nginx -t && sudo systemctl reload nginx\nsudo certbot --nginx -d example.com']
opcache и preload
['Для production включаем opcache с валидацией по таймауту (или отключаем её вовсе, если деплой сбрасывает кэш). Symfony поддерживает preload — загрузку классов в память при старте php-fpm.', '; /etc/php/8.3/fpm/conf.d/10-opcache.ini\nopcache.enable=1\nopcache.memory_consumption=256\nopcache.max_accelerated_files=20000\nopcache.validate_timestamps=0\nopcache.preload=/var/www/symfony/config/preload.php\nopcache.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\npm = dynamic\npm.max_children = 20\npm.start_servers = 4\npm.min_spare_servers = 2\npm.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Частые вопросы
Нужен ли 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.