LEMP — связка Linux, Nginx (произносится «engine-x», отсюда буква E), MySQL и PHP. В отличие от LAMP с Apache, Nginx обрабатывает статику и проксирует динамические запросы в PHP-FPM по отдельному сокету — это меньше потребления памяти на много одновременных соединений и требует явной настройки моста между Nginx и PHP.
Установка LEMP на Ubuntu 22.04
Порядок важен только формально — компоненты независимы, но удобнее ставить веб-сервер первым, чтобы сразу видеть, что порт 80 отвечает.
1. Установка Nginx
apt update
apt install nginx -y
systemctl enable nginx
systemctl start nginx
# Проверка: должен ответить заголовок Server: nginx
curl -I http://localhost
2. Установка MySQL
apt install mysql-server -y
mysql_secure_installation
Мастер mysql_secure_installation задаёт пароль root, отключает анонимных пользователей, запрещает удалённый вход под root и удаляет тестовую базу — все четыре шага стоит подтверждать положительно на продакшн-сервере.
3. Установка PHP
apt install php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip -y
# Проверить, что демон FPM запущен и слушает сокет
systemctl status php8.2-fpm
ls -l /run/php/php8.2-fpm.sock
Модули подбираются под задачу: php8.2-mysql нужен для подключения к базе, php8.2-mbstring — для корректной работы с UTF-8 в CMS вроде WordPress, php8.2-gd — для обработки изображений. Список конкретных модулей для популярных приложений обычно указан в их документации.
4. Настройка Nginx для PHP
Отредактируйте /etc/nginx/sites-available/default или создайте отдельный конфиг для сайта:
server {
listen 80;
server_name yourdomain.com;
root /var/www/yourdomain.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
Директива fastcgi_pass указывает на unix-сокет PHP-FPM — тот же путь, что показала команда ls из предыдущего шага. Если сокет называется иначе (например, задан TCP-порт 127.0.0.1:9000 в пуле FPM), нужно указать именно его.
5. Перезапустите Nginx
nginx -t && systemctl reload nginx
Проверка синтаксиса командой nginx -t перед reload — не формальность: она отличает опечатку в конфиге от реальной проблемы после перезапуска, когда сайт вдруг не открывается.
Разбор типичных ошибок
502 Bad Gateway — Nginx принял запрос, но не смог получить ответ от PHP-FPM. Причины обычно две: сокет из fastcgi_pass не совпадает с реальным путём сокета FPM, либо сам процесс php8.2-fpm не запущен. Проверяется командой systemctl status php8.2-fpm и логом /var/log/nginx/error.log, где будет строка вида connect() to unix:/run/php/php8.2-fpm.sock failed (2: No such file or directory).
Скачивание PHP-файла вместо его выполнения в браузере значит, что блок location ~ \.php$ не сработал — обычно из-за опечатки в регулярном выражении или отсутствия fastcgi_params в подключаемых директивах.
Сравнение LEMP и LAMP
| Параметр | LEMP (Nginx) | LAMP (Apache) |
|---|---|---|
| Модель обработки запросов | Событийная, один процесс на тысячи соединений | Процессы или потоки на соединение (mod_php) либо через FPM |
| Память на много соединений | Ниже при высокой конкурентности | Выше при mod_php, сравнимо при связке с FPM |
| .htaccess | Не поддерживается, правила переносятся в конфиг сайта | Поддерживается «из коробки» |
| Порог входа | Выше, нужно явно настраивать связку с PHP | Ниже, mod_php работает сразу |
Когда LEMP не подходит
- Приложение или его хостинг-инструкция жёстко полагается на
.htaccessдля переопределения правил на уровне директории — в Nginx такого механизма нет, все правила централизованы в конфиге сайта. - На сервере уже работает панель управления, которая сама генерирует конфигурацию Apache (например, привычная связка с cPanel) — смешивать два веб-сервера на одном порту без явного проксирования не стоит.
- Команда привыкла отлаживать через
.htaccessи не имеет доступа к перезагрузке Nginx (например, при общем хостинге) — LEMP предполагает контроль над конфигом сервера, а не только над файлами сайта.
Проверка результата
- Создайте тестовый файл
info.phpс содержимым<?php phpinfo();в корне сайта и откройте его в браузере — должна отобразиться страница конфигурации PHP, а не её исходный код. - Удалите
info.phpсразу после проверки — эта страница раскрывает версии ПО и пути на сервере, оставлять её в продакшне нельзя. - Проверьте подключение PHP к MySQL:
mysql -u root -p -e "SELECT VERSION();"и аналогичный запрос через тестовый PHP-скрипт сmysqliили PDO. - Убедитесь, что все три сервиса поднимаются автоматически после перезагрузки:
systemctl is-enabled nginx mysql php8.2-fpmдолжно вернутьenabledдля каждого.
Дальнейшая настройка виртуального хоста, gzip и кэширования статики разобрана в статье про настройку Nginx для сайта на VDS, а привязка домена к TLS — в статье про установку SSL через Certbot.