Итак, вы написали крутое приложение на Yii2, всё работает локально, но как только дело доходит до продакшн-сервера — начинается хаос. Ошибки, медленные страницы, белые экраны, и вы в панике гуглите «почему Yii2 не работает на хостинге». Знакомая ситуация? В этой статье я расскажу, как правильно развернуть Yii2 на боевом сервере, избежав типичных граблей. Вы узнаете, как настроить окружение, права на файлы, оптимизировать производительность и автоматизировать деплой. Поехали!

Digital-студия WNDER

Ссылка на оригинальную статью

Готовим окружение: что должно быть на сервере

Перед тем как заливать код, убедитесь, что сервер соответствует требованиям 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
Правило: Никогда не используйте PHP версии ниже 7.4 на продакшне. Это небезопасно и может привести к ошибкам совместимости с современными библиотеками.

Настройка файла конфигурации: секреты не храним в репозитории

В 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 на продакшн-сервере без лишней боли. Главное — не торопиться, проверить каждый шаг, и тогда проблем не будет. Удачи в деплое!

Студия WNDER