Итак, вы написали крутое приложение на Yii2, всё работает локально, но как только дело доходит до продакшн-сервера — начинается хаос. Ошибки, медленные страницы, белые экраны, и вы в панике гуглите «почему Yii2 не работает на хостинге». Знакомая ситуация? В этой статье я расскажу, как правильно развернуть Yii2 на боевом сервере, избежав типичных граблей. Вы узнаете, как настроить окружение, права на файлы, оптимизировать производительность и автоматизировать деплой. Поехали!
Ссылка на оригинальную статьюГотовим окружение: что должно быть на сервере
Перед тем как заливать код, убедитесь, что сервер соответствует требованиям Yii2. Это как перед дальней поездкой проверить уровень масла и давление в шинах. Если что-то не так — будет беда.
Минимальные требования для Yii2:
- PHP версии 7.4 или выше (лучше 8.0+, так как старые версии уже не поддерживаются).
- Расширения PHP: PDO, PDO_MySQL (или другой драйвер БД), OpenSSL, Mbstring, Intl, Ctype, Curl (желательно).
- Веб-сервер: Apache или Nginx. Я рекомендую Nginx — он быстрее и легче настраивается.
- MySQL 5.7+ или MariaDB 10.2+.
- Git (для деплоя) и Composer (для управления зависимостями).
Как проверить, что всё необходимое установлено? Откройте терминал и выполните:
php -v
php -m | grep -E 'PDO|mbstring|openssl|intl|curl'
Если какой-то модуль отсутствует, установите его через пакетный менеджер вашей ОС. Например, для Ubuntu:
sudo apt install php8.1-mbstring php8.1-intl php8.1-curl
Настройка файла конфигурации: секреты не храним в репозитории
В Yii2 конфигурация хранится в папке config. Обычно есть main.php и params.php. На локальной машине вы используете одни настройки, на продакшне — другие. Главное правило: не храните секреты (пароли, ключи) в репозитории. Для этого используйте переменные окружения или отдельный файл, который не попадает в Git.
Создайте файл config/env.php (и добавьте его в .gitignore), который будет содержать чувствительные данные:
<?php
return [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=myapp_prod',
'username' => 'prod_user',
'password' => 'super_secret_password',
],
'cookieValidationKey' => 'random_string_here',
];
А в main.php подключаем этот файл:
<?php
$env = require __DIR__ . '/env.php';
return [
'id' => 'my-app',
'basePath' => dirname(__DIR__),
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => $env['db']['dsn'],
'username' => $env['db']['username'],
'password' => $env['db']['password'],
],
// ... другие компоненты
],
];
Также убедитесь, что cookieValidationKey — уникальная строка. Её можно сгенерировать с помощью команды:
php -r "echo bin2hex(random_bytes(32));"
Права на файлы и папки: не давайте лишнего
Одна из самых частых ошибок — неправильные права доступа. Если вы поставите права 777 на все папки, то ваш сервер могут взломать. Но если поставить 644 — могут возникнуть ошибки при записи в кэш или логи.
Рекомендуемые права:
| Путь | Права | Владелец |
|---|---|---|
web/assets |
775 | www-data:www-data (или ваш веб-пользователь) |
runtime |
775 | www-data:www-data |
| Все остальные файлы | 644 | ваш пользователь |
Как это сделать на сервере? Например, если веб-сервер работает от пользователя www-data:
sudo chown -R www-data:www-data /var/www/myapp/web/assets /var/www/myapp/runtime
sudo chmod -R 775 /var/www/myapp/web/assets /var/www/myapp/runtime
Но лучше использовать setfacl для более гибкого управления, если ваш сервер поддерживает ACL.
Оптимизация производительности: ускоряем Yii2
Продакшн — это не место для дебага. Отключите режим отладки и включите кэширование. В Yii2 это делается в web/index.php:
defined('YII_DEBUG') or define('YII_DEBUG', false);
define('YII_ENV', 'prod');
Также включите кэширование схемы БД и используйте APC или Memcached для кэша:
'cache' => [
'class' => 'yii\caching\MemCached',
'servers' => [
['host' => 'localhost', 'port' => 11211],
],
],
И не забудьте про включение opcache в PHP. Это даст значительный прирост скорости.
yii config/check для проверки конфигурации перед деплоем. Это сэкономит вам кучу нервов.
Автоматизация деплоя: не делайте всё руками
Ручной деплой — это дорога к ошибкам. Лучше настроить автоматическое развертывание через Git и CI/CD. Например, с помощью GitHub Actions или GitLab CI.
Простой скрипт деплоя на сервере может выглядеть так:
#!/bin/bash
cd /var/www/myapp
git pull origin master
composer install --no-dev --prefer-dist --optimize-autoloader
php yii migrate --interactive=0
php yii cache/flush-all
# Обновление прав
sudo chown -R www-data:www-data web/assets runtime
sudo chmod -R 775 web/assets runtime
А в CI/CD вы можете запускать этот скрипт после каждого пуша в мастер.
Если вы используете Nginx, настройте его правильно. Пример конфигурации для Yii2:
server {
listen 80;
server_name example.com;
root /var/www/myapp/web;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Не забудьте перезапустить Nginx после изменений.
Что в итоге: чек-лист перед запуском
Итак, вы всё настроили. Но перед тем как открыть сайт для пользователей, пройдитесь по чек-листу:
- YII_DEBUG выключен, YII_ENV = prod.
- Права на runtime и web/assets правильные.
- Кэш включен (Memcached или файловый).
- Миграции применены.
- Проверьте, что нет открытых портов, кроме 80/443.
- Включите HTTPS с помощью Let's Encrypt.
- Настройте резервное копирование БД.
Не пренебрегайте этими шагами, и ваш сайт будет работать стабильно и быстро.
Теперь вы знаете, как развернуть Yii2 на продакшн-сервере без лишней боли. Главное — не торопиться, проверить каждый шаг, и тогда проблем не будет. Удачи в деплое!


