Как установить Nginx, PHP и MySQL/MariaDB (LEMP-стек) в Ubuntu 22.04

Как установить Nginx, PHP и MySQL/MariaDB (LEMP-стек) в Ubuntu 22.04

Разворачиваете веб-приложения на 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, оптимизировать обработку статических и динамических запросов, а также наладить взаимодействие между компонентами.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

Что такое 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).

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях