Деплой Laravel на VPS: production-настройка сервера с Ubuntu и Nginx
Когда Laravel-проект выходит за пределы локальной разработки, появляется необходимость в полноценном сервере. Shared-хостинг быстро начинает ограничивать возможности: не хватает контроля над PHP, невозможно нормально использовать очереди, Redis, Supervisor или CI/CD. Именно поэтому большинство разработчиков переходят на VPS.
В этой статье разберём полноценный деплой Laravel-приложения на Ubuntu VPS. Настроим сервер, установим PHP, Nginx, MySQL, подключим SSL и подготовим production-окружение для реального проекта.
Почему Laravel лучше запускать на VPS
Laravel хорошо чувствует себя в production, но только если сервер настроен правильно. Современные проекты используют очереди, cron-задачи, WebSocket-соединения, Redis и кеширование. На обычном хостинге всё это либо ограничено, либо работает нестабильно.
VPS даёт полный контроль над окружением. Можно самостоятельно выбирать версии PHP, управлять конфигурацией Nginx, подключать Supervisor и автоматизировать деплой через GitHub Actions.
Для большинства небольших и средних Laravel-проектов достаточно VPS с 1–2 GB оперативной памяти.
Подключение к серверу
После покупки VPS провайдер выдаст IP-адрес и root-доступ. Подключаемся к серверу через SSH:
ssh root@YOUR_SERVER_IPСразу обновляем систему:
apt update && apt upgrade -yСоздание пользователя
Работать напрямую через root - плохая практика, поэтому создадим отдельного пользователя:
adduser laravelВыдадим ему sudo-права:
usermod -aG sudo laravelТеперь можно переключиться:
su - laravelУстановка Nginx
Nginx - один из самых популярных веб-серверов для Laravel.
Устанавливаем его:
sudo apt install nginx -yПроверяем, что сервис работает:
systemctl status nginxЕсли всё прошло успешно, сервер уже будет открываться по IP-адресу VPS.
Установка PHP 8.3
Laravel 11 требует современную версию PHP, поэтому установим PHP 8.3 и необходимые расширения.
Добавляем репозиторий:
sudo add-apt-repository ppa:ondrej/php -y
sudo apt updateТеперь ставим PHP:
sudo apt install php8.3 php8.3-fpm php8.3-mysql \
php8.3-mbstring php8.3-xml php8.3-curl \
php8.3-bcmath php8.3-zip php8.3-gd unzip -yПроверяем версию:
php -vУстановка Composer
Composer нужен Laravel для управления зависимостями.
Устанавливаем его:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composerПроверяем:
composer --versionУстановка MySQL
Теперь устанавливаем базу данных:
sudo apt install mysql-server -yПосле установки запускаем базовую настройку безопасности:
sudo mysql_secure_installationСоздаём новую базу данных:
sudo mysqlВнутри MySQL выполняем:
CREATE DATABASE laravel_app;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON laravel_app.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;Клонирование Laravel-проекта
Обычно Laravel-проект деплоят напрямую из GitHub-репозитория.
Переходим в директорию:
cd /var/wwwКлонируем проект:
sudo git clone https://github.com/your-project/project.gitЗаходим в папку проекта:
cd projectУстановка зависимостей
Laravel автоматически подтянет все пакеты через Composer:
composer install --optimize-autoloader --no-devНастройка .env
Создаём production-конфигурацию:
cp .env.example .envОткрываем файл:
nano .envМеняем параметры окружения:
APP_ENV=production
APP_DEBUG=false
DB_DATABASE=laravel_app
DB_USERNAME=laravel_user
DB_PASSWORD=strong_passwordПосле этого генерируем ключ приложения:
php artisan key:generateНастройка прав
Laravel должен иметь доступ к папкам storage и bootstrap/cache.
Настраиваем права:
sudo chown -R www-data:www-data /var/www/project
sudo chmod -R 775 storage
sudo chmod -R 775 bootstrap/cacheМиграции базы данных
Теперь можно выполнить миграции:
php artisan migrate --forceНастройка Nginx для Laravel
Создаём новый конфиг сайта:
sudo nano /etc/nginx/sites-available/projectДобавляем конфигурацию:
server {
listen 80;
server_name your-domain.com;
root /var/www/project/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Активируем сайт:
sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled/Проверяем конфигурацию:
sudo nginx -tПерезапускаем сервер:
sudo systemctl restart nginxПодключение HTTPS
Для production-сайта HTTPS обязателен. Самый простой способ - Let's Encrypt.
Устанавливаем Certbot:
sudo apt install certbot python3-certbot-nginx -yПодключаем SSL:
sudo certbot --nginxПосле этого Nginx автоматически начнёт использовать HTTPS.
Очереди Laravel и Supervisor
Если проект использует очереди, процесс queue:work должен работать постоянно.
Устанавливаем Supervisor:
sudo apt install supervisor -yСоздаём конфиг:
sudo nano /etc/supervisor/conf.d/laravel-worker.confДобавляем:
[program:laravel-worker]
command=php /var/www/project/artisan queue:work
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/project/worker.logПрименяем изменения:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*Настройка Scheduler
Laravel Scheduler должен запускаться каждую минуту.
Открываем cron:
crontab -eДобавляем строку:
* * * * * php /var/www/project/artisan schedule:run >> /dev/null 2>&1Production-оптимизация Laravel
После деплоя желательно закешировать конфигурацию и роуты:
php artisan config:cache
php artisan route:cache
php artisan view:cacheЭто уменьшает нагрузку и ускоряет работу приложения.
Автоматический деплой через GitHub Actions
Со временем ручной деплой начинает раздражать. Намного удобнее автоматически обновлять сервер после push в GitHub.
Пример workflow:
name: Deploy Laravel
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to VPS
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_IP }}
username: laravel
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/project
git pull origin main
composer install --no-dev
php artisan migrate --force
php artisan optimizeЧастые ошибки при деплое Laravel
Ошибка 403 Forbidden обычно появляется из-за неправильного root в Nginx или проблем с правами доступа.
В конфиге обязательно должна использоваться папка public:
root /var/www/project/public;Если сервер показывает 500 Internal Server Error, первым делом проверяйте лог Laravel:
storage/logs/laravel.logПроблемы с .env часто решаются очисткой кеша:
php artisan config:clearЗаключение
После настройки VPS Laravel начинает ощущаться совершенно иначе. Появляется полный контроль над окружением, нормальный production-деплой, очереди, SSL, автоматизация и возможность масштабирования проекта.
Дальше можно двигаться ещё глубже: подключать Docker, Redis, Laravel Horizon, Octane или полноценный CI/CD pipeline. Но именно VPS-деплой остаётся фундаментом, который должен понимать каждый Laravel-разработчик.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.