Введение: от локальной разработки к боевому серверу
Разработка 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