Развертывание и настройка веб-сервера на Linux: Nginx, PHP-FPM и MySQL/MariaDB | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Развертывание и настройка веб-сервера на Linux: Nginx, PHP-FPM и MySQL/MariaDB

08 апреля 2026 8 мин. чтения
Содержание статьи

Это пошаговое руководство предоставляет готовое, проверенное на практике решение для развертывания высокопроизводительного и безопасного веб-сервера на базе стека LEMP (Linux, Nginx, MySQL/MariaDB, PHP-FPM). Вы получите точные команды для установки на Ubuntu/Debian и CentOS/RHEL, готовые конфигурационные файлы для виртуальных хостов Nginx и пулов PHP-FPM, а также инструкции по автоматическому внедрению HTTPS с Let's Encrypt. Материал структурирован так, чтобы минимизировать риски ошибок и обеспечить стабильную работу вашего приложения под нагрузкой.

Мы подробно разберем каждый этап: от базовой установки и настройки безопасности до тонкой оптимизации производительности и решения типичных проблем интеграции. Все инструкции актуальны на 2026 год и основаны на работе со стабильными версиями дистрибутивов.

Подготовка сервера и установка базовых компонентов

Перед установкой стека необходимо обновить систему и добавить репозитории с актуальными версиями ПО. Это критически важно для безопасности и совместимости компонентов. Приведенные ниже команды гарантируют корректный старт на большинстве популярных дистрибутивов.

Обновление системы и добавление репозиториев (для CentOS/RHEL)

Для систем на базе RHEL (CentOS, AlmaLinux, Rocky Linux) необходимо активировать дополнительные репозитории EPEL и REMI, чтобы получить последние версии Nginx и PHP.

# Обновление системы и установка EPEL
sudo yum update -y
sudo yum install epel-release -y

# Установка репозитория REMI для актуальных версий PHP (например, PHP 8.3)
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
sudo yum-config-manager --enable remi-php83

Для дистрибутивов на базе Debian (Ubuntu, Debian) процесс проще:

sudo apt update && sudo apt upgrade -y

Установка Nginx, PHP-FPM и СУБД

Установите все необходимые компоненты стека одной командой. Обратите внимание на различия в именах пакетов.

Для Ubuntu 22.04 LTS / Debian 12:

sudo apt install nginx php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip mariadb-server -y

Для CentOS 9 / AlmaLinux 9 / Rocky Linux 9:

sudo yum install nginx php-fpm php-mysqlnd php-curl php-gd php-mbstring php-xml php-zip mariadb-server -y

После установки проверьте версии и статус служб:

nginx -v
php-fpm -v  # или php8.3-fpm -v для Ubuntu
mariadb --version

sudo systemctl enable --now nginx php-fpm mariadb  # php8.3-fpm для Ubuntu

Базовая настройка безопасности MySQL/MariaDB и PHP-FPM

Стандартная установка СУБД и PHP-FPM содержит уязвимости по умолчанию. Следующие шаги устраняют основные риски и создают изолированное окружение для вашего приложения.

Защита установки MySQL/MariaDB

Запустите интерактивный скрипт безопасности. Отвечайте «Y» (Yes) на все вопросы, особенно на удаление анонимных пользователей и запрет удаленного входа для root.

sudo mysql_secure_installation

Рекомендуемые ответы:
1. Установить пароль для root? Y, задайте сложный пароль.
2. Удалить анонимных пользователей? Y.
3. Запретить удаленный вход root? Y.
4. Удалить тестовую базу данных? Y.
5. Перезагрузить таблицы привилегий? Y.

Создание базы данных и пользователя для приложения

Войдите в консоль MySQL и выполните команды для создания отдельной базы данных и пользователя. Никогда не используйте root-учетную запись для веб-приложений.

sudo mysql -u root -p

-- В консоли MySQL выполните:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'Strong_P@ssw0rd_Here';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Конфигурация пула PHP-FPM для безопасности и изоляции

Отредактируйте основной файл пула. Для Ubuntu/Debian путь: /etc/php/8.3/fpm/pool.d/www.conf, для CentOS/RHEL: /etc/php-fpm.d/www.conf.

Найдите и измените следующие директивы:

; Пользователь и группа, от имени которых работают процессы PHP
user = www-data  # nginx для CentOS/RHEL
group = www-data # nginx для CentOS/RHEL

; Слушать запросы через Unix-сокет (безопаснее и быстрее TCP)
listen = /run/php/php8.3-fpm.sock  # /run/php-fpm/www.sock для CentOS

; Владелец сокета (должен совпадать с пользователем Nginx)
listen.owner = www-data  # nginx для CentOS
listen.group = www-data  # nginx для CentOS
listen.mode = 0660

; Динамическое управление процессами
pm = dynamic
pm.max_children = 50     # Начальное значение, будет рассчитано позже
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

Примените изменения: sudo systemctl restart php8.3-fpm (или php-fpm).

Настройка виртуального хоста в Nginx и интеграция с PHP-FPM

Ключевой этап — создание конфигурации сайта, которая корректно передает PHP-скрипты на обработку в FPM. Готовый конфиг ниже решает типичную проблему «502 Bad Gateway».

Готовый конфигурационный файл Nginx для обработки PHP

Создайте файл виртуального хоста. Замените example.com на ваш домен и укажите правильный путь к корневой директории.

Для Ubuntu/Debian: /etc/nginx/sites-available/example.com
Для CentOS/RHEL: /etc/nginx/conf.d/example.com.conf

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/public_html;
    index index.php index.html index.htm;

    # Логирование
    access_log /var/log/nginx/example.com_access.log;
    error_log /var/log/nginx/example.com_error.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Критически важный блок для обработки PHP
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock; # Проверьте путь к сокету!
        fastcgi_index index.php;
        include fastcgi_params;
        # Эта директива часто является причиной ошибок
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Запрет доступа к скрытым файлам
    location ~ /\. {
        deny all;
    }

    # Кэширование статики
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|woff|ttf|svg)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Активируйте сайт (для Ubuntu/Debian) и проверьте конфигурацию:

# Для Ubuntu/Debian
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# Для всех: проверка синтаксиса
sudo nginx -t
# Если вывод успешный, перезагрузите Nginx
sudo systemctl reload nginx

Проверка конфигурации и прав доступа

Создайте корневую директорию сайта и тестовый PHP-файл для проверки связки.

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com  # nginx:nginx для CentOS

# Создаем тестовый файл
sudo -u www-data tee /var/www/example.com/public_html/test.php << 'EOF'

EOF

Откройте в браузере http://your_server_ip/test.php. Вы должны увидеть страницу с информацией о PHP. Если страница не загружается или вы видите ошибку 502, перейдите к разделу «Типичные проблемы».

Настройка HTTPS с бесплатным SSL от Let's Encrypt (Certbot)

Внедрение HTTPS стало стандартом. Certbot автоматизирует получение, установку и обновление SSL-сертификатов, избавляя администратора от рутины. Для более детальной ручной настройки SSL, включая работу с цепочками доверия и HSTS, обратитесь к нашему пошаговому руководству по ручной установке SSL-сертификатов на Nginx.

Установка Certbot и получение SSL-сертификата

Установите клиент Certbot в зависимости от вашего дистрибутива.

Ubuntu/Debian (рекомендуемый способ через snap):

sudo apt install snapd -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

CentOS/RHEL (через EPEL):

sudo yum install certbot python3-certbot-nginx -y

Получите и автоматически установите сертификат. Certbot сам изменит конфиг Nginx, добавив редирект с HTTP на HTTPS.

sudo certbot --nginx -d example.com -d www.example.com

Следуйте интерактивным инструкциям. После успешного выполнения ваш сайт будет доступен по HTTPS.

Автоматическое обновление сертификатов

Сертификаты Let's Encrypt действуют 90 дней. Настройте автоматическое обновление.

Сначала выполните тестовый прогон:

sudo certbot renew --dry-run

Добавьте задание в cron (например, для ежедневной проверки в 12:00):

sudo crontab -e
# Добавьте строку:
0 12 * * * /usr/bin/certbot renew --quiet

Оптимизация производительности стека Nginx + PHP-FPM + MySQL

Базовые настройки рассчитаны на среднюю нагрузку. Для проектов с высокой посещаемостью необходима тонкая настройка. Эти параметры также критически важны при использовании Nginx в качестве балансировщика нагрузки в высокодоступном кластере.

Тонкая настройка PHP-FPM для вашей памяти

Ключевой параметр — pm.max_children. Рассчитайте его по формуле:
pm.max_children = (Общая RAM - RAM для MySQL, Nginx, системы) / Средний размер памяти PHP-процесса.

Примерные конфигурации для разных серверов (в файле пула www.conf):

; Сервер с 1 ГБ RAM
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 6

; Сервер с 2 ГБ RAM
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

; Сервер с 4 ГБ RAM
pm.max_children = 50
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 16

Узнать средний размер памяти процесса можно командой: ps --no-headers -o "rss,cmd" -C php-fpm8.3 | awk '{ sum+=$1 } END { printf ("%i\n", sum/NR/1024) }' (выдаст значение в МБ).

Буферизация и кэширование в Nginx

Добавьте в секцию http {} файла /etc/nginx/nginx.conf следующие директивы для улучшения обработки статики и FastCGI-ответов:

http {
    ...
    # Оптимизация буферов для клиентских запросов
    client_body_buffer_size 16k;
    client_max_body_size 20m;

    # Буферизация ответов от FastCGI (PHP-FPM)
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;

    # Кэш метаданных открытых файлов
    open_file_cache max=2000 inactive=20s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    ...
}

Базовый тюнинг InnoDB в MySQL/MariaDB

Самая значимая настройка для производительности — размер буферного пула InnoDB. Отредактируйте файл конфигурации (/etc/my.cnf или /etc/mysql/mariadb.conf.d/50-server.cnf).

[mysqld]
...
# Выделите 70-80% от доступной RAM, если сервер выделен под БД.
# Для сервера с 2 ГБ RAM:
innodb_buffer_pool_size = 1G

# Дополнительные настройки для SSD-дисков
innodb_flush_log_at_trx_commit = 1
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

После изменения перезапустите MariaDB: sudo systemctl restart mariadb.

Типичные проблемы после установки и их решение

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

Ошибка 502 Bad Gateway: причины и исправление

Самая частая проблема в связке Nginx + PHP-FPM. Алгоритм диагностики:

  1. Проверьте статус службы PHP-FPM: sudo systemctl status php8.3-fpm.
  2. Сравните пути к сокету:
    В конфиге Nginx (fastcgi_pass) и в конфиге пула PHP-FPM (listen) должен быть указан один и тот же путь к Unix-сокету (например, /run/php/php8.3-fpm.sock).
  3. Проверьте права на сокет:
    ls -la /run/php/php8.3-fpm.sock
    Владелец и группа должны позволять чтение/запись пользователю, от которого работает Nginx (обычно www-data или nginx). Если права неверные, перезапустите PHP-FPM: sudo systemctl restart php8.3-fpm.
  4. Просмотрите логи:
    sudo tail -f /var/log/nginx/error.log
    sudo journalctl -u php8.3-fpm --since "5 minutes ago"

Проблемы с правами на файлы и директории

Ошибки 403 Forbidden или невозможность загрузки файлов часто связаны с правами.

  • Корректный владелец: Файлы сайта должны принадлежать пользователю PHP-FPM (www-data), а Nginx должен иметь права на чтение.
    sudo chown -R www-data:www-data /var/www/example.com/public_html
    sudo find /var/www/example.com/public_html -type d -exec chmod 755 {} \;
    sudo find /var/www/example.com/public_html -type f -exec chmod 644 {} \;
  • Для директорий кэша/загрузок может потребоваться разрешение на запись для веб-сервера. Иногда проще использовать списки контроля доступа (ACL):
    sudo setfacl -R -m u:www-data:rwx /var/www/example.com/public_html/storage/

Если вы столкнулись с более сложными атаками или нуждаетесь в продвинутой защите веб-сервера, изучите наше практическое руководство по защите Nginx в 2026 году, где рассмотрены настройки WAF, rate limiting и защита от DDoS.

Поделиться:
Сохранить гайд? В закладки браузера