Linux & Administration

LEMP-стек

Связка Linux, Nginx, MySQL и PHP для запуска веб-приложений — вариант классического LAMP, где Apache заменён на Nginx.

Что такое LEMP-стек

LEMP — набор из четырёх программ, на которых работает типовой сайт:

Буква Компонент Роль
L Linux операционная система
E Nginx веб-сервер, принимает запросы
M MySQL / MariaDB база данных
P PHP (реже Python, Perl) язык приложения

Буква E, а не N, потому что Nginx читается «engine x». Аббревиатура получилась кривоватой, но прижилась.

LEMP — не продукт, который скачивают одним файлом, а соглашение о том, из чего собран сервер. Аналогично устроены LAMP (с Apache), MEAN и прочие «стеки».

LEMP или LAMP

Разница ровно в одной букве — веб-сервер:

LAMP (Apache) LEMP (Nginx)
Модель соединений процесс или поток на клиента событийный цикл
Память под нагрузкой растёт с числом клиентов почти не растёт
PHP mod_php внутри процесса сервера отдельный php-fpm
Статика медленнее быстрее
Настройки на уровне папки .htaccess, без root только основной конфиг
Готовые инструкции для CMS их больше их меньше

LEMP выигрывает там, где много одновременных соединений и мало памяти — то есть на типовом VPS. LAMP удобнее на шаред-хостинге и в проектах, завязанных на .htaccess.

Отдельная деталь: в LEMP PHP работает не внутри веб-сервера, а самостоятельным демоном php-fpm (FastCGI Process Manager). Nginx не умеет исполнять PHP и не пытается — он передаёт запрос php-fpm по сокету и отдаёт клиенту готовый ответ. Пул воркеров php-fpm при этом настраивается независимо от веб-сервера.

Установка на Ubuntu

sudo apt update
sudo apt install -y nginx mariadb-server php-fpm php-mysql
sudo mysql_secure_installation      # снять дефолтные настройки, задать пароль root
sudo systemctl enable --now nginx mariadb php8.3-fpm

Точное имя пакета php-fpm зависит от версии PHP в дистрибутиве — посмотрите apt search php-fpm.

Связка Nginx и php-fpm

server {
    listen 80;
    server_name example.ru;
    root /var/www/example;
    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 ~ /\.(env|git) {
        deny all;
    }
}

Три вещи, на которых спотыкаются:

  • try_files ... /index.php?$query_string — то, что в Apache делал .htaccess с mod_rewrite. Без этой строки красивые URL любой CMS отдают 404.
  • Права на сокет — Nginx работает от www-data, php-fpm должен слушать сокет, доступный этому пользователю. Иначе 502 Bad Gateway и Permission denied в error.log.
  • Явный запрет .env и .git — в LAMP это часто было прописано в .htaccess из коробки, в Nginx придётся написать самому. Открытый .env с паролем базы — классическая утечка.

Применять правки — только после проверки синтаксиса: sudo nginx -t && sudo systemctl reload nginx.

Что добавляют сверху

Голый LEMP на боевом сервере обычно дополняют:

Альтернатива ручной сборке — Docker Compose: те же компоненты описываются одним файлом и не зависят от версий пакетов в дистрибутиве. Для нового проекта это чаще правильный выбор; ручной LEMP остаётся там, где сервер один и давно живой.

Связанные термины

  • Nginx — буква E в аббревиатуре
  • Apache — веб-сервер из LAMP, альтернатива Nginx
  • MySQL / MariaDB — база данных стека
  • Linux — фундамент всей связки
  • Локальный / веб-сервер — как поднять тот же стек у себя
  • VPS — типичное место обитания LEMP

Готовы запустить GPU-задачу?

Запустить GPU-сервер