MAATRIX / Блог / LEMP против LAMP: что выгоднее и когда

LEMP против LAMP: что выгоднее и когда

LEMP против LAMP: что выгоднее и когда

MAATRIX

Спор «LEMP или LAMP» обычно заканчивается фразой «nginx быстрее» — и это правда наполовину. На статике разрыв трёхкратный, на генерации страницы WordPress — в пределах погрешности, а настоящая разница спрятана в памяти и в одном файле, которого у nginx нет принципиально. Ниже — замеры на одинаковом сервере, арифметика воркеров, дословные ошибки обоих стеков и правила выбора.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Короткий ответ: LEMP или LAMP и в чём разница на самом деле

Оба набора — это Linux, веб-сервер, MySQL или MariaDB и PHP; различается буква E (Engine X, то есть nginx) против A (Apache). Сравнивать веб-серверы в лоб бессмысленно: вместе с буквой меняется способ исполнения PHP, а он и решает всё под нагрузкой.

  • Классический LAMP — Apache с mod_php: интерпретатор живёт внутри каждого процесса, и одно соединение означает полноценный PHP в памяти, даже если клиент качает картинку.
  • LEMP — nginx плюс демон php8.3-fpm со своим пулом: nginx держит соединения и зовёт PHP только за файлами .php.

Отсюда правило: Apache на mpm_event с PHP-FPM — это уже почти LEMP по всем цифрам, кроме статики. Проверьте, что у вас:

apache2ctl -V | grep 'Server MPM'      # Server MPM: prefork  ← классический LAMP
apache2ctl -M | grep -E 'php|proxy_fcgi'

php8_module в списке — интерпретатор внутри Apache; proxy_fcgi_module без php — вы уже на гибриде.

Короткий вердикт. LEMP выгоднее, когда сайт ваш, сервер небольшой (1–4 ГБ), много статики или планируется кеш. LAMP выгоднее с чужим кодом и готовым .htaccess и на хостинге для нескольких клиентов.

Замеры на одном железе: статика, динамика, память

Стенд: VPS 2 vCPU, 4 ГБ RAM, NVMe, Ubuntu 24.04 LTS. Из штатных репозиториев — nginx 1.24.0, Apache 2.4.58, PHP 8.3 с OPcache, MariaDB 10.11. Сайт один и тот же: WordPress с базовой темой, без кеширующих плагинов. Нагрузку подаём с соседнего сервера в том же ЦОД:

wrk -t2 -c100 -d30s http://10.0.0.5/wp-includes/css/dashicons.min.css   # 4 КБ статики
wrk -t2 -c20  -d60s http://10.0.0.5/                                    # главная, кеша нет

Файл маленький намеренно: на 48-килобайтной картинке все три конфигурации упёрлись бы в гигабитный порт (14 200 запросов по 4 КБ — уже 470 Мбит/с).

Показательnginx + PHP-FPMApache event + PHP-FPMApache prefork + mod_php
Статика, RPS (100 соединений)14 2009 8003 900
Статика, задержка p9912 мс27 мс244 мс
Главная WordPress, RPS787571
Динамика, задержка p95258 мс267 мс283 мс
Веб-сервер + PHP в простое95 МБ120 МБ190 МБ
Веб-сервер + PHP на пике720 МБ780 МБ2,7 ГБ

MariaDB во всех трёх случаях съедала 380 МБ и в таблицу не попала.

Выводы. На динамике разница 9 % и она не про веб-сервер: 250 миллисекунд из 260 тратит PHP. На статике разрыв настоящий — три с половиной раза к prefork. По памяти mod_php дороже вчетверо, и вот это, а не RPS, вы оплачиваете тарифом.

Со страничным кешем сайт превращается в раздачу готового HTML — то есть в первую строку таблицы, где разрыв максимальный. Отсюда выигрыш связки «nginx + кеш» на слабых серверах; подробности — в разборе ускорения WordPress на слабом VPS.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть WordPress

Память — вот где LAMP реально стоит денег

Сколько весит один процесс Apache с загруженным WordPress:

ps -ylC apache2 --sort:rss | awk 'NR>1{s+=$8;n++} END{printf "%d процессов, в среднем %.0f МБ\n", n, s/n/1024}'

На стенде вышло 58 процессов, в среднем 46 МБ. Та же команда для nginx даёт два воркера по 18 МБ — хоть сто клиентов на сайте, хоть пять тысяч.

Теперь ловушка, на которую наступают все. В /etc/apache2/mods-available/mpm_prefork.conf из коробки стоит MaxRequestWorkers 150: 150 × 46 МБ = 6,9 ГБ на сервере, где всего 4. Машина уходит в своп, а дальше в dmesg появляется классика:

Out of memory: Killed process 1187 (mariadbd) total-vm:2419016kB, anon-rss:389204kB

База умирает первой, и посетители видят Error establishing a database connection: сайт «упал без причины», хотя Apache жив.

Правильное число: (RAM − база − система − запас) / размер воркера. Для 4 ГБ это (4096 − 700 − 400 − 300) / 46 ≈ 58. Ставим 58 — и получаем второй симптом, уже честный:

[mpm_prefork:error] [pid 921] AH00161: server reached MaxRequestWorkers setting,
consider raising the MaxRequestWorkers setting

Совет из самой ошибки плохой: поднять лимит — вернуться к OOM. Лечится кешем перед PHP, переходом на FPM или памятью.

В LEMP этой арифметики нет по конструкции: соединения держит nginx (пятьсот keep-alive стоят ему меньше мегабайта), а число PHP-процессов ограничено pm.max_children и от соединений не зависит. Лишние запросы встают в очередь к сокету — вы получаете замедление вместо смерти сервера. В переводе на тариф: сотня одновременных посетителей на mod_php требует 8 ГБ там, где LEMP обходится двумя.

`.htaccess`: единственное, чего в LEMP нет и за что вы платите

Главный аргумент за Apache, который не закрывается настройкой: каталоговые конфиги меняют правила без перезапуска сервера, и на хостинге для клиентов без этого никак. Цена известна: при AllowOverride All Apache проверяет .htaccess в каждом каталоге пути на каждый запрос. В strace одна картинка выглядит так:

openat(AT_FDCWD, "/var/www/html/.htaccess", O_RDONLY|O_CLOEXEC) = 12
openat(AT_FDCWD, "/var/www/html/wp-content/uploads/.htaccess", O_RDONLY|O_CLOEXEC) = -1 ENOENT

Переключение стенда с AllowOverride All на AllowOverride None подняло статику с 3 900 до 4 750 RPS — плюс 18 % бесплатно: правила переезжают в <Directory> основного конфига.

Обратная сторона: на nginx плагины, которые «сами всё настраивают», молча перестают работать — Wordfence и Really Simple SSL пишут строки в .htaccess и не ругаются, а читать его некому. Типовые правила переводятся так:

ЗадачаApache, .htaccessnginx, серверный блок
ЧПУ WordPressRewriteRule . /index.php [L]try_files $uri $uri/ /index.php?$args;
Закрыть wp-config.php<Files wp-config.php> Require all denied </Files>location = /wp-config.php { deny all; }
Редирект на HTTPSRewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]return 301 https://$host$request_uri;

Двадцать строк переводятся за четверть часа. Триста строк накопленных за десять лет RewriteCond — рабочий день плюс регрессии через неделю. Признак потери: главная открывается, а внутренние страницы отдают 404 — не перенесли try_files. Второй — 413 Request Entity Too Large при загрузке: лимит есть в PHP, но забыт client_max_body_size.

Третий вариант: Apache на mpm_event и связка nginx + Apache

Между «переписать всё» и «терпеть prefork» есть два рабочих решения.

Apache с mpm_event и PHP-FPM. Забирает у LAMP главный недостаток — память — и оставляет .htaccess:

apt -y install php8.3-fpm
a2dismod php8.3 mpm_prefork
a2enmod mpm_event proxy_fcgi setenvif http2
a2enconf php8.3-fpm
systemctl restart apache2 && apache2ctl -V | grep 'Server MPM'

Порядок важен: пока mod_php включён, a2enmod mpm_event откажется работать, а если поднять их вместе, Apache напишет в error.log:

[core:warn] AH00117: Apache is running a threaded MPM, but your PHP Module is not
compiled to be threadsafe. You need to recompile PHP.

Работать это будет до первого падения под нагрузкой. После a2enconf php8.3-fpm запросы уходят в сокет FPM — за это отвечает готовый конфиг с директивой SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost". Дальше тюнинг под 4 ГБ: ThreadsPerChild 25, MaxRequestWorkers 150, MaxConnectionsPerChild 10000. Здесь 150 — потоки, а не процессы по 46 МБ, и в память они помещаются.

nginx впереди, Apache позади. Схема, которую по умолчанию собирают панели ISPmanager, FASTPANEL и aaPanel: статику и SSL держит nginx, PHP и .htaccess остаются на Apache. Плата — два веб-сервера в памяти (+120–180 МБ) и настройка реального IP: Apache переводится на Listen 127.0.0.1:8080, а адрес клиента приезжает через mod_remoteip с RemoteIPHeader X-Forwarded-For и RemoteIPInternalProxy 127.0.0.1. Без этого в логах сплошной 127.0.0.1: fail2ban банит локалхост, а WordPress показывает один IP у всех комментаторов. Появятся 502-е — смотрите разбор ошибки 502 Bad Gateway в nginx.

Два честных факта 2026 года в пользу разных сторон. HTTP/3 у Apache 2.4 нет; nginx умеет QUIC с 1.25 (listen 443 quic reuseport; и http3 on;), но в Ubuntu 24.04 лежит 1.24 — нужен репозиторий mainline. И наоборот: ModSecurity с правилами OWASP CRS на Apache ставится пакетами libapache2-mod-security2 и modsecurity-crs, а для nginx готового модуля в репозиториях нет.

Что выбрать под конкретный проект

  • Новый сайт на WordPress, сервер 2 ГБ — LEMP, без вариантов; пошаговая сборка с конфигами разобрана в статье WordPress на LEMP.
  • Магазин на WooCommerce — LEMP плюс Redis: корзина и оформление заказа не кешируются в принципе, а память, сэкономленная на веб-сервере, уходит в пул FPM, где нужнее.
  • 1С-Битрикс — гибрид nginx + Apache: штатное окружение устроено именно так, часть модулей рассчитывает на каталоговые правила, и воевать с этим ради 5 % смысла нет.
  • Самописное приложение или старая CMS с длинным .htaccess — оставайтесь на Apache, но на mpm_event с FPM: почти весь выигрыш по памяти и ноль риска сломать правила.
  • Хостинг для нескольких клиентов — Apache с AllowOverride All на каждый vhost или панель с гибридом: изоляция важнее RPS.
  • Laravel, Symfony, API, вебсокеты и раздача медиа — LEMP. Там .htaccess декоративный, а try_files делает то же дешевле.

Про «выгоднее» в деньгах. Софт бесплатен в обоих случаях, платите вы за память и за часы. Переезд на LEMP окупается, если снимает шаг тарифа: 2 ГБ вместо 4 ГБ экономят в месяц примерно столько же, сколько стоит день работы инженера. Если перевод правил займёт неделю с регрессиями в оформлении заказа, дешевле доплатить за память и остаться на Apache.

Чеклист после переезда: открываются внутренние страницы, а не только главная; файл больше 8 МБ загружается; в логах виден реальный IP; nginx -t и apache2ctl configtest молчат.

Какой сервер под LEMP или LAMP взять в MAATRIX

Минимум: 1 vCPU, 2 ГБ RAM, 25 ГБ NVMe. Под LEMP: nginx, 6–8 воркеров PHP-FPM, MariaDB и запас; сайт с посещаемостью до 800 визитов в сутки живёт здесь спокойно. Честное ограничение: LAMP с mod_php на 2 ГБ брать не стоит — по формуле выше вам достанется 28 воркеров, и первый всплеск закончится тем самым AH00161 или OOM. Redis сюда тоже не помещается.

Комфортный вариант: 2 vCPU, 4 ГБ RAM, 60–80 ГБ NVMe. На LEMP помещаются Redis, FastCGI-кеш, ночной mysqldump и копия сайта под тесты. Это же минимум для гибрида nginx + Apache. Для Битрикса с живым трафиком или магазина от 5000 позиций закладывайте 4 vCPU и 8 ГБ — узкое место там не веб-сервер, а PHP и база.

Локация — Великобритания, Лондон. До Москвы 40–50 мс, до Петербурга 35–45, до Берлина и Амстердама 10–20 мс: аудитория в ЕС получает сайт мгновенно, российские посетители не замечают разницы на фоне 250 мс генерации. Оговорка прямая: если сайт собирает персональные данные граждан России — а форма заявки с телефоном это уже они, — 152-ФЗ требует держать первичную базу в РФ, и тогда сервер берите в российской локации. Подробнее — в обзоре лучших VPS для WordPress в Великобритании.

Команды из этой статьи нужны, когда вы собираете стек руками. При заказе в MAATRIX это не требуется: WordPress есть в каталоге apps.maatrix.io и ставится на сервер автоматически при оформлении — вместе с nginx, PHP-FPM и базой, то есть сразу на LEMP-связке. Автоустановка работает на Ubuntu и Debian, а адрес сайта, логин и пароль администратора появляются в личном кабинете, в разделе «Доступ». Нужен Apache под чужой код — берите чистый образ и переводите его на mpm_event с FPM. Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть WordPress

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Что быстрее — LEMP или LAMP?

На статике и под кешем nginx быстрее в 1,5–3,5 раза, на генерации страницы WordPress разница около 9 % и теряется в шуме. Главный выигрыш LEMP не в скорости, а в памяти: 720 МБ против 2,7 ГБ.

Можно ли перенести сайт с LAMP на LEMP без переписывания?

Код PHP не меняется, меняются только правила из .htaccess — ЧПУ, редиректы, запреты доступа: для WordPress это десять строк, для старой самописки — рабочий день. Вариант без переписывания — оставить Apache, но перевести его на mpm_event с PHP-FPM.

Apache совсем устарел?

Нет. Он проигрывает на статике и в памяти с mod_php, но даёт .htaccess, простую установку ModSecurity и совместимость с чужим кодом. На mpm_event с FPM он отстаёт от nginx на единицы процентов — этого хватает почти любому проекту.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.