Введение
Разработка PHP-приложения — это только половина дела. Вторая, не менее важная часть — это деплой, то есть развёртывание готового кода на боевом сервере. Многие начинающие разработчики сталкиваются с трудностями при переносе проекта с локальной машины на VPS (Virtual Private Server). Настройка окружения, работа с веб-сервером, базами данных и безопасностью могут показаться сложными, но на самом деле это последовательный и понятный процесс.
В этой статье мы шаг за шагом разберём, как правильно выполнить деплой PHP приложения на VPS. Вы узнаете, как подготовить сервер, настроить Nginx и PHP-FPM, подключить базу данных MySQL и автоматизировать выкладку обновлений через Git. Материал рассчитан на тех, кто уже имеет базовые навыки работы с Linux и Git, но хочет систематизировать знания.
1. Подготовка сервера и установка LEMP-стека
Первым делом необходимо подключиться к вашему VPS по SSH и установить базовый набор программ, известный как LEMP (Linux, Nginx, MySQL, PHP).
Подключитесь к серверу:
ssh root@ваш-ip-адрес
Обновите пакеты и установите Nginx, MySQL и PHP с необходимыми расширениями:
sudo apt update && sudo apt upgrade -y
sudo apt install nginx mysql-server php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip -y
После установки запустите службы и добавьте их в автозагрузку:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php8.1-fpm # версия может отличаться
sudo systemctl enable php8.1-fpm
На этом этапе базовая инфраструктура готова. Теперь перейдём к настройке базы данных и конфигурации веб-сервера.
2. Настройка MySQL и создание базы данных
Для работы большинства PHP-приложений (например, WordPress, Laravel или самописных проектов) требуется база данных. Выполните первичную настройку MySQL:
sudo mysql_secure_installation
Следуйте инструкциям: установите пароль для root, удалите анонимных пользователей, запретите удалённый вход root'ом и удалите тестовую базу.
Теперь создайте базу данных и пользователя для вашего приложения. Зайдите в консоль MySQL:
sudo mysql -u root -p
Выполните SQL-запросы (замените myapp, myuser и mypassword на свои значения):
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
База готова. Запишите имя базы, пользователя и пароль — они понадобятся при настройке приложения.
3. Размещение кода и настройка виртуального хоста Nginx
Теперь самое время перенести код вашего PHP-приложения на сервер. Самый удобный способ — использовать Git. Допустим, ваш проект хранится на GitHub или GitLab.
Создайте директорию для проекта и склонируйте репозиторий:
sudo mkdir -p /var/www/myapp
sudo chown -R $USER:$USER /var/www/myapp
git clone https://github.com/ваш-username/ваш-репозиторий.git /var/www/myapp
Если проект использует Composer (например, Laravel или Symfony), выполните установку зависимостей:
cd /var/www/myapp
composer install --no-dev --optimize-autoloader
Настройте права доступа. Обычно веб-сервер должен иметь доступ на запись к некоторым папкам (например, storage и bootstrap/cache в Laravel):
sudo chown -R www-data:www-data /var/www/myapp/storage
sudo chown -R www-data:www-data /var/www/myapp/bootstrap/cache
Теперь создадим конфигурацию виртуального хоста для Nginx. Создайте файл:
sudo nano /etc/nginx/sites-available/myapp
Вставьте следующую конфигурацию (адаптируйте под своё приложение):
server {
listen 80;
server_name ваш-домен.ru www.ваш-домен.ru;
root /var/www/myapp/public; # для Laravel — public, для обычного PHP — корень проекта
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Активируйте сайт и перезагрузите Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t # проверка конфигурации
sudo systemctl reload nginx
Теперь, если вы откроете в браузере IP-адрес или домен вашего сервера, должно появиться приветствие вашего приложения. Если нет — проверьте логи Nginx: sudo tail -f /var/log/nginx/error.log.
4. Автоматизация деплоя с помощью Git и хуков
Ручное копирование файлов на сервер при каждом обновлении — это неэффективно. Лучше настроить автоматический деплой. Рассмотрим простой способ через Git-хуки на сервере.
На сервере перейдите в директорию проекта и инициализируйте Git как bare-репозиторий для приёма пушей:
cd /var/www/myapp
git init --bare
Создайте хук post-receive, который будет автоматически обновлять рабочую директорию:
nano /var/www/myapp.git/hooks/post-receive
Вставьте следующий скрипт:
#!/bin/bash
TARGET="/var/www/myapp"
GIT_DIR="/var/www/myapp.git"
BRANCH="main