Деплой Laravel на VPS: production-настройка сервера с Ubuntu и Nginx

mr. Cooper 2 дня назад Веб-разработка
Деплой 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>&1

Production-оптимизация 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-разработчик.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи