Развертывание 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 из разовой ручной операции в повторяемый процесс.