Продвинутый деплой PHP приложения на VPS: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: от локальной разработки к боевому серверу

Разработка PHP-приложения на локальной машине — это только половина дела. Настоящее мастерство начинается, когда код попадает на сервер и начинает обслуживать реальных пользователей. Продвинутый деплой PHP на VPS — это не просто копирование файлов по FTP. Это комплексный процесс, включающий настройку окружения, безопасность, автоматизацию и мониторинг.

В этой статье мы разберем, как настроить VPS для профессионального хостинга PHP-приложений, используя современные инструменты и практики DevOps. Вы узнаете, как развернуть приложение на стеке Nginx + PHP-FPM, настроить CI/CD пайплайн, оптимизировать производительность и внедрить мониторинг.

Предполагается, что у вас есть базовые знания Linux, PHP и веб-серверов. Мы переходим на продвинутый уровень.

1. Подготовка VPS и настройка окружения

Выбор и начальная настройка сервера

Для продвинутого деплоя выбирайте VPS с минимум 2 ГБ RAM и SSD-диском. Рекомендуемые ОС — Ubuntu 22.04 LTS или Debian 12. После получения доступа по SSH выполните базовую настройку:

  • Обновление пакетов: sudo apt update && sudo apt upgrade -y
  • Создание пользователя с sudo-правами: sudo adduser deployer && sudo usermod -aG sudo deployer
  • Настройка SSH-ключей (отключите парольный вход)
  • Установка fail2ban для защиты от брутфорса
  • Настройка UFW (разрешить порты 22, 80, 443)

Установка стека LEMP (Nginx + PHP-FPM + MySQL)

Мы используем Nginx как frontend-сервер и PHP-FPM для обработки PHP. Установите все компоненты одной командой:

sudo apt install nginx mysql-server php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip composer git -y

Проверьте версии:

php -v
nginx -v
mysql --version

Настройка PHP-FPM для высокой производительности

Для продвинутого деплоя измените конфигурацию PHP-FPM. Отредактируйте файл /etc/php/8.3/fpm/pool.d/www.conf (версия может отличаться):

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

Важные настройки php.ini для продакшена:

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
date.timezone = Europe/Moscow

Перезапустите PHP-FPM: sudo systemctl restart php8.3-fpm

2. Деплой приложения: от Git до продакшена

Клонирование и настройка прав

Создайте директорию для проекта и клонируйте репозиторий:

sudo mkdir -p /var/www/yourproject
sudo chown -R deployer:deployer /var/www/yourproject
cd /var/www/yourproject
git clone git@github.com:yourusername/yourproject.git .

Настройте права доступа:

sudo chown -R www-data:www-data /var/www/yourproject/storage
sudo chown -R www-data:www-data /var/www/yourproject/bootstrap/cache
sudo chmod -R 775 /var/www/yourproject/storage
sudo chmod -R 775 /var/www/yourproject/bootstrap/cache

Настройка виртуального хоста Nginx

Создайте конфигурационный файл для вашего домена:

sudo nano /etc/nginx/sites-available/yourproject

Пример продвинутой конфигурации с кэшированием и сжатием:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    root /var/www/yourproject/public;

    index index.php index.html;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
        add_header Cache-Control "public, no-transform";
    }

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
}

Активируйте сайт и перезагрузите Nginx:

sudo ln -s /etc/nginx/sites-available/yourproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Настройка переменных окружения и автозагрузки

Создайте файл .env с продакшен-настройками. Никогда не храните его в Git:

cp .env.example .env
nano .env
# Установите APP_ENV=production, APP_DEBUG=false, DB_* параметры

Сгенерируйте ключ приложения (для Laravel):

php artisan key:generate
php artisan config:cache
php artisan route:cache
php artisan view:cache

3. Автоматизация деплоя с CI/CD

Настройка GitHub Actions для PHP

Создайте файл .github/workflows/deploy.yml в корне проекта:

name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'

      - name: Install dependencies
        run: composer install --no-dev --optimize-autoloader

      - name: Deploy to VPS                

Блоги

Рекомендаций по книгам