Размещение на сервере
Размещение (деплой) — перенос сайта с компьютера разработчика на сервер, где его увидят посетители. Кроме копирования файлов нужно выключить режим отладки, направить веб-сервер в правильную папку и обновить базу данных.
Режим работы
Режим задают две константы в начале web/index.php:
<?php
// web/index.php
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');YII_DEBUG включает подробные отчёты об ошибках, YII_ENV называет окружение: dev — разработка, prod — рабочий сервер. На сервере посетитель вместо отчёта с кодом увидит обычную страницу ошибки, а панель отладки и Gii отключатся: в config/web.php они подключены внутри условия if (YII_ENV_DEV).
Чтобы не править файл при каждой выкладке, значения читают из переменных окружения сервера:
define('YII_DEBUG', getenv('YII_DEBUG') === 'true');
define('YII_ENV', getenv('YII_ENV') ?: 'prod');Если переменные не заданы, сайт работает в безопасном режиме prod.
Корень сайта
Веб-сервер должен отдавать папку web, а не папку проекта. Пример для nginx:
server {
server_name example.com;
root /var/www/blog/web;
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
}
}Строка try_files передаёт в index.php все запросы, для которых нет файла, — так работают красивые адреса.
Шаги выкладки
git pull
composer install --no-dev --optimize-autoloader
php yii migrate --interactive=0
php yii cache/flush-all| Команда | Что делает |
|---|---|
git pull | Получает новый код |
composer install --no-dev | Ставит библиотеки без инструментов разработки |
php yii migrate --interactive=0 | Выполняет новые миграции без вопросов |
php yii cache/flush-all | Очищает кеш |
Права на папки
Веб-сервер должен иметь право записи в две папки: runtime (журналы, кеш) и web/assets (сюда Yii копирует стили и скрипты из наборов ресурсов). Остальные файлы ему достаточно читать.
Настройки для сервера
Пароль базы данных и адрес почтового сервера на сервере другие. Их читают из переменных окружения:
// config/db.php
return [
'class' => 'yii\db\Connection',
'dsn' => getenv('DB_DSN'),
'username' => getenv('DB_USER'),
'password' => getenv('DB_PASSWORD'),
'charset' => 'utf8mb4',
'enableSchemaCache' => YII_ENV_PROD,
'schemaCacheDuration' => 3600,
];enableSchemaCache сохраняет в кеше структуру таблиц: Yii перестаёт запрашивать её у базы при каждом обращении, и сайт работает заметно быстрее. После миграций этот кеш очищают — поэтому в шагах выкладки есть cache/flush-all.
Проверка после выкладки
- главная страница открывается, панели отладки внизу нет;
- адрес
/giiотвечает ошибкой 404; - несуществующий адрес показывает вашу страницу ошибки, а не отчёт с кодом;
- в
runtime/logs/app.logнет новых ошибок.
Частая ошибка
Если корнем сайта указать папку проекта, а не web, посетителям станут доступны файлы вроде /config/db.php и /runtime/logs/app.log — с паролями и внутренними данными. Корневой папкой всегда указывают web.