Установка LEMP на Debian 13, 12, 11: полное руководство

LEMP — это аббревиатура, обозначающая набор программного обеспечения для веб-сервера: Linux (операционная система), Enginx (веб-сервер, произносится как «Engine X»), MariaDB (база данных) и PHP (язык программирования). Эта комбинация обеспечивает высокую производительность и является отличной альтернативой классическому LAMP (Apache, MySQL, PHP).

В этом руководстве я покажу, как установить и настроить LEMP на Debian 13, 12 и 11 с нуля. Мы установим Nginx, MariaDB и PHP-FPM, создадим тестовый сайт, настроим файрвол и защитим сервер с помощью бесплатного SSL-сертификата Let’s Encrypt.


Оглавление

Предварительные требования

Перед установкой убедитесь, что:

  • У вас есть доступ к интернету
  • Вы имеете права sudo (администратора)

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo whoami

Что делает: sudo — выполняет команду от имени суперпользователя; whoami — показывает имя текущего пользователя.

Ожидаемый вывод в терминале:

root

❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.


Версии компонентов по релизам Debian

КомпонентDebian 13 (Trixie)Debian 12 (Bookworm)Debian 11 (Bullseye)
Nginx1.26.x1.22.x1.18.x
MariaDB11.8.x10.11.x10.5.x
PHP8.4.x8.2.x7.4.x

Часть 1: Установка Nginx

Шаг 1: Обновите систему

sudo apt update && sudo apt upgrade -y

Шаг 2: Установите Nginx

sudo apt install -y nginx

Шаг 3: Проверьте, что сервис запущен

sudo systemctl status nginx --no-pager

Ожидаемый вывод: Active: active (running)

Если Nginx не запущен:

sudo systemctl enable --now nginx

Шаг 4: Проверьте версию Nginx

nginx -v

Ожидаемый вывод: nginx version: nginx/1.x.x


Часть 2: Установка MariaDB

Шаг 1: Установите MariaDB

sudo apt install -y mariadb-server mariadb-client

Шаг 2: Проверьте, что сервис запущен

sudo systemctl status mariadb --no-pager

Ожидаемый вывод: Active: active (running)

Если MariaDB не запущена:

sudo systemctl enable --now mariadb

Шаг 3: Запустите скрипт безопасной настройки

sudo mysql_secure_installation

Что делает: Интерактивный скрипт для повышения безопасности MariaDB.

Рекомендуемые ответы:

ВопросОтветПочему
Enter current password for rootEnter (нажать Enter)Пароль root пуст по умолчанию
Switch to unix_socket
authentication
YИспользовать системную
аутентификацию
Change the root password?Y (или n)По желанию
Remove anonymous users?YУдаляем анонимных
пользователей
Disallow root login remotely?YЗапрещаем root-доступ по сети
Remove test database and
access to it?
YУдаляем тестовую базу
Reload privilege tables now?YПрименяем изменения

Шаг 4: Проверьте версию MariaDB

mariadb --version

Ожидаемый вывод: mariadb from 11.8.x-MariaDB (Debian 13), 10.11.x (Debian 12) или 10.5.x (Debian 11)


Часть 3: Установка PHP и PHP-FPM

Шаг 1: Установите PHP-FPM и расширения

sudo apt install -y php-fpm php php-cli php-mysql php-curl php-gd php-mbstring php-xml php-zip

Что делают расширения:

  • php-mysql — подключение к MariaDB
  • php-curl — работа с HTTP-запросами
  • php-gd — обработка изображений
  • php-mbstring — работа с многобайтовыми строками (кириллица, UTF-8)
  • php-xml — обработка XML, DOM
  • php-zip — работа с ZIP-архивами

Шаг 2: Проверьте версию PHP

php -v

Ожидаемый вывод: PHP 8.4.x (Debian 13), PHP 8.2.x (Debian 12) или PHP 7.4.x (Debian 11)

Шаг 3: Проверьте статус PHP-FPM

Для Debian 13:

sudo systemctl status php8.4-fpm --no-pager

Для Debian 12:

sudo systemctl status php8.2-fpm --no-pager

Для Debian 11:

sudo systemctl status php7.4-fpm --no-pager

Ожидаемый вывод: Active: active (running)

Если PHP-FPM не запущен:

sudo systemctl enable --now php8.4-fpm   # измените версию на вашу

Часть 4: Настройка Nginx для обработки PHP

Шаг 1: Создайте корневую директорию для сайта

Замените example.com на ваше доменное имя:

sudo mkdir -p /var/www/html/example.com
sudo chown -R $USER:$USER /var/www/html/example.com
sudo chmod -R 755 /var/www/html/example.com

Шаг 2: Создайте конфигурационный файл виртуального хоста

sudo nano /etc/nginx/sites-available/example.com.conf

Содержимое файла (замените example.com и укажите правильный сокет PHP-FPM):
(в примере используется PHP 8.4 для Debian 13):

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/html/example.com;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # Debian 13: /run/php/php8.4-fpm.sock
        # Debian 12: /run/php/php8.2-fpm.sock
        # Debian 11: /run/php/php7.4-fpm.sock
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Примечание: Директива fastcgi_pass должна указывать на правильный сокет PHP-FPM для вашей версии Debian. 
Используйте 
/run/php/php8.4-fpm.sock для Debian 13, 
/run/php/php8.2-fpm.sock для Debian 12 или 
/run/php/php7.4-fpm.sock для Debian 11.

Шаг 3: Включите сайт и проверьте конфигурацию

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Часть 5: Проверка работы LEMP

Шаг 1: Создайте тестовый PHP-файл

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/example.com/info.php

Шаг 2: Откройте в браузере

Перейдите по адресу http://example.com/info.php (или http://IP-вашего-сервера/info.php). Вы должны увидеть страницу с информацией о PHP.

Шаг 3: Удалите тестовый файл

sudo rm /var/www/html/example.com/info.php

Часть 6: Проверка подключения PHP к MariaDB

Шаг 1: Создайте тестовую базу данных и пользователя

sudo mariadb
CREATE DATABASE test_db;
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpass';
GRANT ALL PRIVILEGES ON test_db.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Шаг 2: Создайте тестовый PHP-файл для проверки подключения

sudo tee /var/www/html/example.com/test-db.php <<'EOF'
<?php
$conn = new mysqli("localhost", "testuser", "testpass");
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected to MariaDB successfully. Server version: " . $conn->server_info;
$conn->close();
?>
EOF

Шаг 3: Откройте в браузере

Перейдите по адресу http://example.com/test-db.php. Вы должны увидеть сообщение об успешном подключении к MariaDB.

Шаг 4: Удалите тестовые данные

sudo rm /var/www/html/example.com/test-db.php
sudo mariadb -e "DROP DATABASE test_db; DROP USER 'testuser'@'localhost';"

Часть 7: Настройка SSL с Let’s Encrypt (рекомендуется)

Шаг 1: Установите Certbot

sudo apt install -y python3-certbot-nginx

Шаг 2: Получите SSL-сертификат

Замените you@example.com на ваш email, example.com на ваш домен:

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d example.com -d www.example.com

Что делают флаги:

  • --nginx — автоматически настроить Nginx
  • --agree-tos — согласиться с условиями Let’s Encrypt
  • --redirect — перенаправлять HTTP → HTTPS
  • --hsts — включить HTTP Strict Transport Security
  • --staple-ocsp — повысить производительность проверки сертификатов

Шаг 3: Проверьте автоматическое обновление

sudo systemctl status certbot.timer
sudo certbot renew --dry-run

Часть 8: Настройка UFW (файрвола)

Шаг 1: Установите UFW (если не установлен)

sudo apt install -y ufw

Шаг 2: Разрешите SSH, HTTP и HTTPS

sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable

Шаг 3: Проверьте статус

sudo ufw status

Ожидаемый вывод:

Status: active

To                         Action      From
22/tcp                     ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere

Решение типичных проблем

8.1 Ошибка: Nginx не запускается (порт 80 уже используется)

Симптом: systemctl status nginx показывает ошибку bind() to 0.0.0.0:80 failed.

Причина: Другой веб-сервер (например, Apache) уже слушает порт 80.

Пошаговое решение:

Шаг 1: Определите, какой процесс занял порт:

sudo apt install -y lsof
sudo lsof -i :80

Шаг 2: Остановите конфликтующий сервис:

sudo systemctl stop apache2
sudo systemctl disable apache2

Шаг 3: Запустите Nginx:

sudo systemctl start nginx

8.2 Ошибка: PHP-файлы скачиваются, а не выполняются

Симптом: При открытии info.php браузер скачивает файл.

Причина: В конфигурации Nginx отсутствует блок location ~ \.php$.

Пошаговое решение:

Шаг 1: Проверьте, что в конфигурации есть правильный блок для PHP:

grep -A 10 "location ~ \.php" /etc/nginx/sites-available/example.com.conf

Шаг 2: Проверьте, что сокет PHP-FPM существует:

ls -la /run/php/

Шаг 3: Перезагрузите Nginx:

sudo nginx -t && sudo systemctl reload nginx

8.3 Ошибка: 502 Bad Gateway

Симптом: Ошибка 502 при попытке открыть PHP-файл.

Причина: PHP-FPM не запущен или указан неверный путь к сокету.

Пошаговое решение:

Шаг 1: Проверьте статус PHP-FPM:

systemctl status php8.4-fpm   # Debian 13

Шаг 2: Запустите PHP-FPM:

sudo systemctl start php8.4-fpm

Шаг 3: Проверьте путь к сокету в конфигурации Nginx:

grep fastcgi_pass /etc/nginx/sites-available/example.com.conf

Убедитесь, что путь соответствует вашей версии PHP.


8.4 Ошибка: MariaDB Connection Refused

Симптом: PHP-скрипт не может подключиться к MariaDB.

Причина: MariaDB не запущена или используются неверные учётные данные.

Пошаговое решение:

Шаг 1: Проверьте статус MariaDB:

systemctl status mariadb

Шаг 2: Проверьте подключение из командной строки:

sudo mariadb -e "SELECT VERSION();"

Шаг 3: Убедитесь, что пользователь и база данных созданы:

sudo mariadb -e "SHOW DATABASES;"

8.5 Ошибка: 403 Forbidden

Симптом: При открытии сайта появляется ошибка 403.

Причина: Неправильные права на корневую директорию.

Пошаговое решение:

Шаг 1: Проверьте владельца и права:

ls -la /var/www/html/example.com/

Шаг 2: Исправьте права:

sudo chown -R www-data:www-data /var/www/html/example.com
sudo chmod -R 755 /var/www/html/example.com

Шаг 3: Перезагрузите Nginx:

sudo systemctl reload nginx

Чек-лист: что проверить после установки

  • [ ] Nginx работает: systemctl status nginxactive (running)
  • [ ] MariaDB работает: systemctl status mariadbactive (running)
  • [ ] PHP-FPM работает: systemctl status php8.4-fpmactive (running)
  • [ ] Тестовая страница PHP открывается: http://ваш-сервер/info.php → страница phpinfo()
  • [ ] Подключение к БД работает: http://ваш-сервер/test-db.php → сообщение об успехе
  • [ ] HTTPS работает (если настроен): https://ваш-домен → зелёный замок
  • [ ] Файрвол настроен: sudo ufw status → порты 22, 80, 443 открыты

Обновление LEMP

Все компоненты обновляются через стандартный APT:

sudo apt update && sudo apt upgrade -y
sudo systemctl restart nginx mariadb php8.4-fpm

Удаление LEMP

Удаление Nginx

sudo systemctl stop nginx
sudo apt remove --purge nginx nginx-common -y
sudo apt autoremove -y
sudo rm -rf /etc/nginx /var/log/nginx

Удаление MariaDB

sudo systemctl stop mariadb
sudo apt remove --purge mariadb-server mariadb-client mariadb-common -y
sudo apt autoremove -y
sudo rm -rf /var/lib/mysql /etc/mysql /var/log/mysql

Удаление PHP (Debian 13)

sudo apt remove --purge php8.4* -y
sudo apt autoremove -y
sudo rm -rf /etc/php

Часто задаваемые вопросы (FAQ)

Вопрос: В чём разница между LEMP и LAMP?
Ответ: LEMP использует Nginx (Engine X), а LAMP — Apache. Nginx обычно быстрее и потребляет меньше памяти при высоких нагрузках.

Вопрос: Могу ли я использовать MySQL вместо MariaDB?
Ответ: Да, команды установки будут аналогичны: sudo apt install mysql-server mysql-client. Но MariaDB является стандартом для Debian.

Вопрос: Нужно ли перезагружать сервер после установки?
Ответ: Нет, достаточно перезапустить сервисы. Но для проверки автозагрузки можно перезагрузиться один раз.

Вопрос: Как узнать, какая версия PHP у меня установлена?
Ответ: php -v или php-fpm -v.

Вопрос: Нужен ли мне домен для настройки HTTPS?
Ответ: Да, Let’s Encrypt выдаёт сертификаты только на реальные доменные имена. Для тестирования можно использовать HTTP.


Заключение

Теперь на вашем Debian установлен полноценный LEMP-стек: Nginx, MariaDB и PHP-FPM. Вы можете размещать на сервере динамические веб-сайты, например, WordPress, Laravel, Drupal.

Что дальше?