rzaripov.kz

Развертывание PHP-приложения на Ubuntu Server: пошаговое руководство

Ubuntu Server подходит для размещения PHP-сайтов, интернет-магазинов, API и внутренних сервисов. Система имеет стабильные LTS-релизы, развитую документацию и удобный пакетный менеджер APT, поэтому базовую серверную конфигурацию можно подготовить без сложных инструментов.

В руководстве используется связка Nginx, PHP-FPM, MariaDB и Certbot. Такой стек подходит для Laravel, Symfony, WordPress и собственных PHP-приложений. Команды рассчитаны на Ubuntu Server 22.04 или 24.04, а запуск выполняется от пользователя с правами sudo.

Компонент Назначение Рекомендуемый вариант
Веб-сервер Принимает HTTP-запросы и раздает статические файлы Nginx
Интерпретатор PHP Выполняет серверный код PHP 8.2 или 8.3
Менеджер процессов Связывает Nginx с PHP PHP-FPM
СУБД Хранит данные приложения MariaDB или PostgreSQL
HTTPS Шифрует соединение Let’s Encrypt и Certbot
Управление кодом Доставка исходников на сервер Git

Подготовка Ubuntu Server

После подключения к серверу по SSH обновите списки пакетов и установленные компоненты:

sudo apt update
sudo apt upgrade -y

Создайте отдельного пользователя для административных задач, если он еще не настроен, и запретите прямой вход под root. Для этого отредактируйте конфигурацию SSH:

sudo nano /etc/ssh/sshd_config

Параметр PermitRootLogin следует установить в значение no, после чего перезапустить службу:

sudo systemctl restart ssh

Перед публикацией сайта настройте межсетевой экран. Откройте SSH, HTTP и HTTPS, а остальные входящие подключения запретите:

sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Проверьте, что доменное имя направлено на публичный IP-адрес сервера. Для этого создайте A-запись вроде example.com и, при необходимости, отдельную запись для www. DNS-изменения могут распространяться несколько часов.

Установка веб-сервера и PHP

Установите Nginx, PHP-FPM и расширения, которые чаще всего нужны современным приложениям:

sudo apt install nginx php-fpm php-cli php-mysql php-xml \
php-mbstring php-curl php-zip php-gd php-intl unzip git -y

Версию интерпретатора можно проверить командой:

php -v

Ubuntu выбирает пакет PHP, доступный в репозиториях конкретного релиза. Если приложению требуется более новая версия, подключайте проверенный внешний репозиторий только после оценки совместимости и рисков обновления. Для продакшена важнее единая версия PHP на локальной машине, тестовом окружении и сервере.

Убедитесь, что службы запущены и добавлены в автозагрузку:

sudo systemctl enable --now nginx
sudo systemctl enable --now php8.3-fpm
sudo systemctl status nginx
sudo systemctl status php8.3-fpm

Имя службы может отличаться: например, для PHP 8.2 используется php8.2-fpm. Точный путь к сокету можно узнать через каталог /run/php/. Он понадобится в конфигурации Nginx.

Размещение файлов приложения

Создайте каталог сайта и назначьте владельцем пользователя веб-сервера:

sudo mkdir -p /var/www/example.com
sudo chown -R $USER:www-data /var/www/example.com
sudo chmod -R 775 /var/www/example.com

Код можно скопировать через Git. Для этого перейдите в каталог и клонируйте репозиторий:

cd /var/www/example.com
git clone https://github.com/username/project.git .

Если приложение использует Composer, установите его официальным способом и выполните установку зависимостей без пакетов разработки:

composer install --no-dev --optimize-autoloader

Файл конфигурации окружения обычно создают на основе шаблона:

cp .env.example .env

Укажите в .env параметры подключения к базе данных, секретный ключ, адрес сайта и режим работы. Значения паролей и токенов нельзя хранить в открытом Git-репозитории. Для Laravel после заполнения переменных обычно выполняют:

php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache

У разных PHP-фреймворков команды отличаются, поэтому перед запуском проверьте документацию проекта. Каталог, доступный из браузера, должен быть ограничен директорией public, если такое устройство предусмотрено фреймворком. Это предотвращает раскрытие .env, исходников и служебных файлов.

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

Создайте конфигурацию сайта:

sudo nano /etc/nginx/sites-available/example.com

Пример минимального виртуального хоста:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    root /var/www/example.com/public;

    index index.php index.html;

    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;
    }
}

Если приложение не использует каталог public, замените значение root на фактическую директорию с входным файлом index.php. Проверьте путь к сокету PHP-FPM: при другой версии PHP его необходимо изменить.

Активируйте конфигурацию и отключите стандартную страницу Nginx:

sudo ln -s /etc/nginx/sites-available/example.com \
/etc/nginx/sites-enabled/example.com

sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Команда nginx -t обязательна перед перезагрузкой. Она обнаруживает синтаксические ошибки и помогает избежать недоступности всех сайтов на сервере. Если страница не открывается, проверьте DNS, журнал Nginx и права на каталоги:

sudo tail -f /var/log/nginx/error.log
sudo journalctl -u php8.3-fpm -e

Подключение базы данных, HTTPS и обслуживание

Для MariaDB установите сервер и запустите базовую защиту:

sudo apt install mariadb-server -y
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation

Создайте отдельную базу и пользователя приложения. Не используйте учетную запись администратора СУБД в файле окружения:

sudo mariadb

CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'сложный_пароль';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

После того как домен начал открываться по HTTP, установите Certbot и получите сертификат Let’s Encrypt:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

Certbot добавит HTTPS-настройки и предложит перенаправлять обычные HTTP-запросы на защищенный протокол. Проверьте автоматическое продление:

sudo certbot renew --dry-run

Для диагностики приложения используйте журналы Nginx, PHP-FPM и самой программы. Регулярно устанавливайте обновления Ubuntu, PHP и зависимостей, но сначала тестируйте их на отдельном окружении. Резервное копирование должно включать базу данных, пользовательские загрузки и конфигурационные секреты, хранящиеся в защищенном месте.

В продакшене отключите вывод подробных ошибок в браузер, ограничьте права файлов и каталогов, настройте мониторинг свободного места и срока действия TLS-сертификата. После каждого релиза проверяйте главную страницу, авторизацию, загрузку файлов, фоновые задания и соединение с базой данных. Такой порядок превращает развертывание PHP-приложения на Ubuntu Server из разовой ручной операции в повторяемый процесс.