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) |
|---|---|---|---|
| Nginx | 1.26.x | 1.22.x | 1.18.x |
| MariaDB | 11.8.x | 10.11.x | 10.5.x |
| PHP | 8.4.x | 8.2.x | 7.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 root | Enter (нажать 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— подключение к MariaDBphp-curl— работа с HTTP-запросамиphp-gd— обработка изображенийphp-mbstring— работа с многобайтовыми строками (кириллица, UTF-8)php-xml— обработка XML, DOMphp-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 nginx→active (running) - [ ] MariaDB работает:
systemctl status mariadb→active (running) - [ ] PHP-FPM работает:
systemctl status php8.4-fpm→active (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.
Что дальше?
- Установите WordPress с Nginx
- Установите phpMyAdmin для управления базами данных
- Настройте кеширование Redis