Разворачиваете веб-приложения на Ubuntu 22.04 и хотите, чтобы они справлялись с высокой нагрузкой? Узнайте, как собрать LEMP-стек — основу для современных CMS, фреймворков и микросервисов. В статье — установка Nginx, PHP-FPM, MySQL/MariaDB и интеграция компонентов LEMP на примере настройки сервера.
Nginx давно зарекомендовал себя как высокопроизводительный и гибкий инструмент для работы с веб-трафиком. В связке с PHP и MySQL он становится основой для современных веб-приложений. Далее мы разберём, как развернуть LEMP-стек (Linux, Nginx, MySQL, PHP) на Ubuntu 22.04, уделяя внимание не только базовой настройке, но и тонкостям, важным в production-среде — особенно при работе на VPS. Вы узнаете, как правильно интегрировать PHP-FPM с Nginx, оптимизировать обработку статических и динамических запросов, а также наладить взаимодействие между компонентами.
Что такое LEMP-стек и когда его использовать
LEMP — это акроним, описывающий набор технологий для развёртывания веб-приложений: ОС Linux, веб-сервер Nginx (произносится как «Engine-X»), СУБД MySQL (или её форки, например MariaDB) и PHP как язык бэкенда. В отличие от LAMP, где Apache обрабатывает запросы через встроенный модуль mod_php, архитектура LEMP асинхронна — Nginx взаимодействует с отдельной службой PHP-FPM. Это позволяет эффективно разделить обработку статического контента (Nginx отдаёт его напрямую) и динамических PHP-скриптов, исполняемых через FPM.
LEMP-стек — это набор технологий для запуска веб-приложений: Linux, веб-сервер Nginx, СУБД MySQL или MariaDB и язык программирования PHP, работающий через PHP-FPM.
Такой подход особенно эффективен при высокой нагрузке — он минимизирует расход ресурсов и обеспечивает параллельную обработку тысяч соединений. Например, Nginx кеширует статические файлы и балансирует запросы, а PHP-FPM позволяет настраивать пул процессов: ограничивать потребление памяти, управлять таймаутами и задавать число воркеров. Конфигурация Nginx даёт широкие возможности — от гибкой маршрутизации URL до настройки безопасности на уровне HTTP-заголовков.
LEMP актуален для CMS (WordPress, Drupal), фреймворков (Laravel, Symfony) и микросервисных архитектур. Его выбирают, когда важны масштабируемость, поддержка HTTP/2 и WebSocket, а также гибкая оптимизация под нагрузки. Единственный нюанс — настройка связи Nginx с PHP-FPM требует понимания FastCGI (в отличие от Apache, где PHP часто работает «из коробки»).
Установка Nginx: репозитории, кастомные сборки и диагностика
Хотя LEMP-стек подразумевает использование Nginx, во многих случаях может потребоваться параллельная установка Apache — например, для работы с устаревшими проектами или модулями, не поддерживающими FastCGI. Ниже — базовая инструкция по установке Apache на популярных дистрибутивах.
Стандартная установка
Этот набор команд обновляет список пакетов, устанавливает веб-сервер Nginx из стандартного репозитория, проверяет его статус и включает автозапуск, чтобы служба запускалась автоматически при загрузке системы.
sudo apt update
sudo apt install nginx -y
sudo systemctl status nginx
sudo systemctl enable --now nginx
Проверка:
curl -I 127.0.0.1
Ожидаемый результат — строка HTTP/1.1 200 OK и Server: nginx.
Установка из репозитория nginx.org
Если вам нужна более свежая версия Nginx или доступ к дополнительным модулям, которых нет в стандартных репозиториях Ubuntu, стоит подключить официальный репозиторий nginx.org. Для начала необходимо импортировать GPG-ключ, которым подписаны пакеты — это обеспечивает проверку подлинности при установке.
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/nginx.gpg
Создание файла nginx.list:
sudo tee /etc/apt/sources.list.d/nginx.list <<EOF
deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx
deb-src http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx
EOF
Установка:
sudo apt update && sudo apt install nginx -y
Проверка модулей:
nginx -V 2>&1 | tr ' ' '\n'
Разрешение портов в UFW:
sudo ufw allow 'Nginx Full'
Проверка занятого порта:
sudo ss -tulpn | grep ':80'
Сборка из исходников
Если требуется полная гибкость — например, включение нестандартных модулей или использование экспериментальных фич — Nginx можно собрать вручную. Перед этим нужно установить все необходимые зависимости, включая компиляторы и библиотеки для работы с регулярными выражениями, сжатием и шифрованием.
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -y
Сборка с модулем Brotli:
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules --with-http_ssl_module \
--with-http_v2_module --add-dynamic-module=/path/to/ngx_brotli
make && sudo make install
Проверка конфигурации:
sudo nginx -t && echo OK || echo FAILED
Установка PHP-FPM и интеграция с Nginx
В LEMP-стеке PHP работает не через встроенный модуль, как в Apache, а как отдельная служба — PHP-FPM. Это позволяет лучше управлять ресурсами и обеспечивает стабильность при высокой нагрузке. Сначала установим сам PHP-FPM и необходимые модули, затем проверим версию, статус службы и включим автозапуск.
sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip -y
php -v
sudo systemctl status php8.1-fpm
sudo systemctl enable --now php8.1-fpm
Установка последних версий PHP
Если вам нужны более новые версии PHP, чем те, что доступны в стандартных репозиториях Ubuntu (например, PHP 8.2 или 8.3), стоит подключить PPA-репозиторий от Ondřej Surý — надёжный и регулярно обновляемый источник. После добавления репозитория можно установить нужную версию PHP-FPM и сопутствующие пакеты.
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2-fpm php8.2-mysql php8.2-cli -y
Настройка пулов
Путь к конфигам:
/etc/php/8.1/fpm/pool.d/www.conf
Пример параметров:
pm = dynamic
pm.max_children = 10
pm.start_servers = 4
Перезапуск:
sudo systemctl restart php8.1-fpm
Интеграция с Nginx
Фрагмент конфига:
location ~ \.php$ {
try_files $uri =404;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Проверка и перезапуск:
sudo nginx -t && sudo systemctl reload nginx
Установка и настройка СУБД
Для хранения данных в LEMP-стеке используются СУБД MySQL или MariaDB. Обе системы совместимы на уровне запросов и клиентов, но имеют отличия в лицензировании и развитии. Ниже рассмотрены два варианта установки: MariaDB — по умолчанию доступна в репозиториях Ubuntu, и MySQL — официальный продукт Oracle, устанавливается через отдельный репозиторий.
Установка MariaDB
MariaDB — открытая и широко используемая альтернатива MySQL, которая поставляется вместе с Ubuntu и подходит для большинства задач. Ниже — команды для установки и запуска службы.
sudo apt install mariadb-server mariadb-client -y
sudo systemctl enable --now mariadb
Установка MySQL
Если вам необходима оригинальная сборка MySQL с последними возможностями (например, улучшенная работа с JSON или оконные функции), подключите официальный репозиторий Oracle. После установки запустите встроенный скрипт базовой настройки безопасности.
curl -fsSL https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb -o mysql.deb
sudo dpkg -i mysql.deb
sudo apt update
sudo apt install mysql-server mysql-client -y
sudo mysql_secure_installation
Создание пользователя и базы
После установки СУБД подключитесь к ней и создайте собственную базу данных и пользователя. Это нужно для изоляции приложений и ограничения прав доступа.
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Настройки СУБД
MariaDB:
/etc/mysql/mariadb.conf.d/50-server.cnf
MySQL:
/etc/mysql/mysql.conf.d/mysqld.cnf
Пример:
[mysqld]
innodb_buffer_pool_size = 3G
max_connections = 200
wait_timeout = 600
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
Перезапуск:
sudo systemctl restart mysql # или mariadb
Проверка подключения
Чтобы убедиться, что пользователь и база данных созданы корректно, подключитесь к СУБД из терминала под созданным пользователем и выполните простой SQL-запрос. Если соединение установлено и команда SHOW TABLES; не вызывает ошибок — всё работает как нужно.
mysql -u app_user -p -D app_db
SHOW TABLES;
Тестовый PHP-файл
Для проверки подключения к базе данных через PHP создайте простой скрипт, используя PDO. Разместите его в корне веб-сервера и откройте через браузер. Если конфигурация правильная, вы увидите сообщение об успешном подключении.
<?php
$host = 'localhost';
$db = 'app_db';
$user = 'app_user';
$pass = 'StrongPassword123!';
$charset = 'utf8mb4';
try {
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, $user, $pass);
echo "Подключение к базе успешно!";
} catch (PDOException $e) {
die("Ошибка: " . $e->getMessage());
}
?>
Удалённый доступ
По умолчанию MySQL и MariaDB принимают подключения только с локального хоста. Чтобы разрешить доступ с других машин в локальной сети, откройте порт 3306 в файрволе, указав диапазон IP-адресов, которым разрешено подключение. Это особенно важно для безопасности — никогда не открывайте доступ к базе из Интернета без защиты.
sudo ufw allow from 192.168.1.0/24 to any port 3306
В конфиге:
bind-address = 0.0.0.0
Обновление прав:
GRANT ALL ON app_db.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';
Заключение
LEMP-стек установлен и готов к использованию. Далее рекомендуем:
- Настроить HTTPS через Let’s Encrypt.
- Включить кеширование (Gzip/Brotli), OPcache, оптимизировать InnoDB.
- Защитить сервер: ограничить доступ к портам, изолировать пулы FPM, запретить доступ к служебным файлам.
- Настроить мониторинг (Prometheus, Netdata).
- Внедрить бекап баз и файлов (mysqldump + cron).
Читайте в блоге:
- Как назначить статический IP-адрес в Ubuntu 22.04
- Как включить и настроить брандмауэр UFW в Ubuntu 22.04
- Установка и настройка Apache на Ubuntu 22.04 LTS и Debian 12