Требования для Laravel на VPS
Laravel 11.x требует PHP 8.2+, расширения: BCMath, Ctype, cURL, DOM, Fileinfo, JSON, Mbstring, OpenSSL, PCRE, PDO, Tokenizer, XML. Также нужны Composer, Node.js (для npm) и база данных (MySQL/MariaDB или PostgreSQL).
Установка зависимостей
sudo apt update && sudo apt install -y php8.2-fpm php8.2-cli php8.2-mysql \
php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip php8.2-bcmath \
php8.2-intl php8.2-redis nginx mysql-server git unzip
# Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composerУстановка Laravel
cd /var/www
composer create-project laravel/laravel myapp
cd myapp
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data .Настройка .env
cp .env.example .env
php artisan key:generate
nano .envAPP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp_db
DB_USERNAME=myapp_user
DB_PASSWORD=StrongPassword123Nginx vhost для Laravel
sudo nano /etc/nginx/sites-available/myappserver {
listen 80;
server_name yourdomain.com;
root /var/www/myapp/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxМиграции и сборка
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
npm install && npm run buildSupervisor для очередей Laravel
sudo apt install supervisor
sudo nano /etc/supervisor/conf.d/laravel-worker.conf[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/myapp/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.logsudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*Cron для Laravel Scheduler
sudo crontab -u www-data -e
# Добавить:
* * * * * cd /var/www/myapp && php artisan schedule:run >> /dev/null 2>&1php artisan optimize — он кэширует конфиг, маршруты и представления, что ускоряет ответы на 30–50%.Реальные ошибки после деплоя Laravel
419 Page Expired
Возникает при рассинхронизации CSRF-токена с сессией: чаще всего — из-за неверного SESSION_DOMAIN в .env за обратным прокси, либо потому что APP_KEY не сгенерирован вовсе после копирования проекта на новый сервер.
Не удаётся открыть storage/logs/laravel.log
The stream or file "/var/www/myapp/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission deniedPHP-FPM работает от имени www-data, а папку storage после деплоя часто оставляют с правами пользователя, из-под которого выполнялся git pull или composer install. Права нужно выставлять после каждого обновления кода, а не один раз при первой установке.
Пустой белый экран вместо страницы
При APP_DEBUG=false Laravel показывает пользователю универсальную страницу «500 | Server Error» без единой технической детали — это правильное поведение для прода, но реальную причину нужно искать не на экране, а в storage/logs/laravel.log.
Когда эта схема не подходит
- Файловые драйверы сессий и кэша по умолчанию хранят данные на диске одного сервера — при масштабировании на несколько инстансов за балансировщиком нужен Redis или база данных как общее хранилище.
numprocs=2в Supervisor рассчитан на лёгкую очередь — под тяжёлые задачи (рассылки, генерация отчётов) двух воркеров быстро становится мало, очередь начинает копиться без предупреждений в логах.- Запуск
php artisan queue:workнапрямую, без Supervisor, обрывает все задачи, находящиеся в обработке, при каждом деплое — Supervisor сstopwaitsecsдаёт воркеру время корректно завершить текущую задачу.
Проверка результата
# Конфигурация и окружение приложения читаются корректно
php artisan about
# Воркеры очередей реально работают
sudo supervisorctl status
# Живой хвост лога приложения при тестовом запросе
tail -f storage/logs/laravel.logphp artisan about в одной таблице показывает версию PHP, окружение, статус кэшей конфигурации и маршрутов — быстрее, чем собирать эту же информацию вручную из десятка файлов. Для очередей поверх Redis смотрите отдельный разбор настройки сессий и драйверов кэша.