Вы разработали крутое приложение на Yii2, протестировали его локально, и теперь пришло время выложить его в интернет. Но как это сделать правильно, чтобы всё работало быстро, безопасно и без сюрпризов? В этой статье я поделюсь своим опытом развертывания Yii2 на продакшн-сервере, расскажу о подводных камнях и дам практические советы.

Digital-студия WNDER

Подготовка сервера: что нужно установить

Прежде чем заливать код, убедитесь, что на сервере есть всё необходимое. Обычно это LAMP или LEMP стек. Для Yii2 требуется PHP версии 7.4 или выше (лучше 8.x), а также расширения: mbstring, intl, pdo, pdo_mysql, openssl, json, curl, dom, simplexml. Не забудьте про Composer — без него никак.

Вот пример установки на Ubuntu:

sudo apt update
sudo apt install php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-intl php8.1-curl php8.1-xml php8.1-zip unzip nginx mysql-server
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Для веб-сервера я предпочитаю Nginx — он быстрее и гибче в настройке. Но можно использовать и Apache. Главное — правильно настроить корневую директорию.

Правило: Никогда не используйте корень проекта как DocumentRoot. Точка входа должна быть в папке web. Это защитит конфиденциальные файлы от прямого доступа.

Настройка Nginx для Yii2

Конфигурация Nginx для Yii2 должна перенаправлять все запросы, кроме существующих файлов, на index.php. Вот проверенный шаблон:

server {
    listen 80;
    server_name example.com;
    root /var/www/yii2-app/web;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

После сохранения конфига не забудьте перезагрузить Nginx: sudo systemctl reload nginx.

Деплой кода и установка зависимостей

Самый простой способ — клонировать репозиторий через Git. Но для продакшена лучше использовать git archive или CI/CD, чтобы не тащить лишние файлы. Я обычно делаю так:

cd /var/www
git clone https://github.com/yourname/yii2-app.git
cd yii2-app
composer install --no-dev --optimize-autoloader

Флаг --no-dev исключает dev-зависимости, а --optimize-autoloader ускоряет автозагрузку классов. После этого нужно настроить окружение. В Yii2 есть файлы init и шаблоны конфигов. Для продакшена используйте:

php init --env=Production --overwrite=All

Затем отредактируйте common/config/main-local.php и frontend/config/main-local.php, указав доступы к БД и другие параметры.

Миграции и права доступа

Примените миграции для создания структуры БД:

php yii migrate --interactive=0

Не забудьте про права на директории runtime и web/assets. Веб-сервер должен иметь возможность писать в них:

sudo chown -R www-data:www-data runtime web/assets
sudo chmod -R 775 runtime web/assets
Лайфхак: Если вы используете Docker, можно избежать проблем с правами, запустив контейнер от пользователя с нужным UID. Но это тема отдельной статьи.

Оптимизация производительности

Yii2 имеет встроенные инструменты для ускорения. В продакшене обязательно включите кэширование схемы БД и классов. В конфиге добавьте:

'components' => [
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=mydb',
        'username' => 'root',
        'password' => '',
        'enableSchemaCache' => true,
        'schemaCacheDuration' => 3600,
        'schemaCache' => 'cache',
    ],
],

Также включите OPcache в PHP. Это даст прирост производительности до 50%. В php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0

Последняя опция отключает проверку изменений файлов — не забудьте сбрасывать OPcache при деплое.

Настройка безопасности

Продакшн-сервер — лакомый кусочек для хакеров. Обязательно сделайте следующее:

  • Отключите отладочную панель и режим разработки в конфиге: YII_DEBUG = false, YII_ENV = 'prod'.
  • Установите сложные пароли для БД и SSH.
  • Настройте firewall (UFW или iptables), оставив только 80, 443 и SSH порт.
  • Используйте HTTPS с Let's Encrypt — это бесплатно и просто.

Для HTTPS установите Certbot:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com

Certbot автоматически настроит редирект с HTTP на HTTPS.

Автоматизация деплоя

Ручной деплой — это прошлый век. Настройте простой скрипт или используйте CI/CD (GitLab CI, GitHub Actions). Вот пример скрипта deploy.sh:

#!/bin/bash
set -e
cd /var/www/yii2-app
git pull origin main
composer install --no-dev --optimize-autoloader
php yii migrate --interactive=0
sudo systemctl reload php8.1-fpm
sudo systemctl reload nginx
echo "Deploy completed!"

Не забудьте сделать его исполняемым: chmod +x deploy.sh.

Совет: Храните секреты (пароли, ключи) в переменных окружения или в файле .env, который не попадает в Git. В Yii2 можно использовать библиотеку vlucas/phpdotenv.

Мониторинг и логирование

После запуска следите за здоровьем приложения. Настройте логи Yii2 на запись в файлы с ротацией. В конфиге:

'components' => [
    'log' => [
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['error', 'warning'],
                'logFile' => '@runtime/logs/app.log',
                'maxFileSize' => 1024 * 10, // 10MB
                'maxLogFiles' => 5,
            ],
        ],
    ],
],

Также рекомендую установить Sentry или аналогичный сервис для отслеживания ошибок в реальном времени. Это сэкономит часы отладки.

Для мониторинга сервера подойдут htop, netdata или Prometheus + Grafana. Главное — знать, что происходит с CPU, памятью и диском.

Что в итоге

Развертывание Yii2 на продакшене — это не магия, а последовательность шагов. Подготовьте сервер, настройте Nginx, задеплойте код, примените миграции, оптимизируйте и защитите. Автоматизируйте процесс, чтобы избежать ошибок. И не забывайте про мониторинг — он поможет вовремя заметить проблемы.

Следуя этим советам, вы сможете развернуть стабильное и быстрое приложение, которое выдержит нагрузку и не подведет пользователей.

Студия WNDER