К основному содержимому

Установка LEMP стека на VDS (Ubuntu)

VDS / VPS · 18.02.2025 · 4 мин чтения
Иллюстрация к статье «Установка LEMP стека на VDS (Ubuntu)»

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 предполагает контроль над конфигом сервера, а не только над файлами сайта.

Проверка результата

  1. Создайте тестовый файл info.php с содержимым <?php phpinfo(); в корне сайта и откройте его в браузере — должна отобразиться страница конфигурации PHP, а не её исходный код.
  2. Удалите info.php сразу после проверки — эта страница раскрывает версии ПО и пути на сервере, оставлять её в продакшне нельзя.
  3. Проверьте подключение PHP к MySQL: mysql -u root -p -e "SELECT VERSION();" и аналогичный запрос через тестовый PHP-скрипт с mysqli или PDO.
  4. Убедитесь, что все три сервиса поднимаются автоматически после перезагрузки: systemctl is-enabled nginx mysql php8.2-fpm должно вернуть enabled для каждого.

Дальнейшая настройка виртуального хоста, gzip и кэширования статики разобрана в статье про настройку Nginx для сайта на VDS, а привязка домена к TLS — в статье про установку SSL через Certbot.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке