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

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

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

Начать курс

Введение

Разработка 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                

Блоги

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