LEMP установка · 13 min read · Oct 21, 2025
Как установить стек LEMP (Nginx, PHP и MariaDB) на Debian 12

Стек LEMP на Linux — это популярный программный пакет для разработки и хостинга веб-приложений. Он состоит из четырех ключевых компонентов: Linux, Nginx (произносится как “Engine-X”), MySQL или MariaDB (реляционная база данных) и PHP (популярный язык веб-программирования). В этой конфигурации Linux является операционной системой, а Nginx — веб-сервером, который обрабатывает HTTP-запросы и обслуживает статический контент, такой как изображения и .css файлы. MySQL, или в нашем случае MariaDB, используется в качестве системы баз данных. PHP — это язык сценариев, используемый для динамической генерации веб-контента и взаимодействия с базой данных. Эти компоненты формируют надежную и масштабируемую среду для создания и развертывания веб-сайтов и веб-приложений.
Этот гид научит вас устанавливать стек LEMP на сервер Debian 12 (bookworm), выпущенный несколько дней назад. Вы также узнаете, как установить такие приложения, как phpMyAdmin.
Предварительные требования
- Сервер с установленным Debian 12.
- Пользователь, не являющийся root, с правами sudo.
- Полностью квалифицированное доменное имя (FQDN), например
example.com, указывающее на сервер. - Упрощенный брандмауэр (UFW) включен и работает.
- Все обновлено.
$ sudo apt update && sudo apt upgrade - Несколько пакетов, которые нужны вашей системе.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yНекоторые из этих пакетов могут уже быть установлены на вашей системе.
Шаг 1 - Настройка брандмауэра
Первый шаг перед установкой любых пакетов — настроить брандмауэр для разрешения HTTP и HTTPS соединений.
Проверьте статус брандмауэра.
$ sudo ufw status
Вы должны увидеть что-то вроде следующего.
Статус: активен
Кому Действие Откуда
-- ------ ----
OpenSSH ALLOW Везде
OpenSSH (v6) ALLOW Везде (v6)
Разрешите порты HTTP и HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Проверьте статус снова, чтобы подтвердить.
$ sudo ufw status
Статус: активен
Кому Действие Откуда
-- ------ ----
OpenSSH ALLOW Везде
80/tcp ALLOW Везде
443/tcp ALLOW Везде
OpenSSH (v6) ALLOW Везде (v6)
80/tcp (v6) ALLOW Везде (v6)
443/tcp (v6) ALLOW Везде (v6)
Шаг 2 - Установка PHP
Debian 12 по умолчанию поставляется с PHP 8.2. Вы можете установить его, выполнив следующую команду.
$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd
Мы установили расширения MySQL, CLI, GD, Mbstring и XML для PHP. Вы можете установить любые дополнительные расширения в зависимости от ваших требований.
Чтобы всегда оставаться на последней версии PHP или если вы хотите установить несколько версий PHP, добавьте репозиторий PHP от Ondrej.
Сначала импортируйте GPG-ключ репозитория Sury.
$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Добавьте репозиторий PHP от Ondrej Sury.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
Обновите список репозиториев системы.
$ sudo apt update
Теперь вы можете установить любую версию PHP.
$ sudo apt install php8.1-fpm php8.1-cli
Проверьте установленную версию PHP.
$ php --version
PHP 8.2.7 (cli) (собран: 9 июня 2023 г. 19:37:27) (NTS)
Copyright (c) Группа PHP
Zend Engine v4.2.7, Copyright (c) Технологии Zend
с Zend OPcache v8.2.7, Copyright (c), Технологии Zend
Шаг 3 - Установка MariaDB
Debian 12 не поставляется с MySQL по умолчанию, и они еще не выпустили официальный пакет для него. Поэтому мы будем использовать MariaDB. У MariaDB также нет официального пакета для Debian 12, но Debian поставляется с ним. Поэтому установите его, используя следующую команду.
$ sudo apt install mariadb-server
Проверьте версию MySQL.
$ mysql --version
mysql Вер 15.1 Distrib 10.11.3-MariaDB, для debian-linux-gnu (x86_64) с использованием EditLine wrapper
Запустите скрипт безопасной установки MariaDB.
$ sudo mysql_secure_installation
Вам будет предложено ввести пароль root. Нажмите Enter, потому что мы еще не установили для него пароль.
ПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB
В ПРОИЗВОДСТВЕ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!
Чтобы войти в MariaDB и обеспечить ее безопасность, нам нужен текущий
пароль для пользователя root. Если вы только что установили MariaDB и
еще не установили пароль root, вам просто нужно нажать Enter здесь.
Введите текущий пароль для root (нажмите Enter для отсутствия):
Далее вам будет предложено, хотите ли вы переключиться на метод аутентификации Unix socket. Плагин unix_socket позволяет использовать ваши учетные данные операционной системы для подключения к серверу MariaDB. Поскольку у вас уже есть защищенная учетная запись root, введите n, чтобы продолжить.
Хорошо, успешно использован пароль, продолжаем...
Установка пароля root или использование unix_socket гарантирует, что никто
не сможет войти в учетную запись root MariaDB без надлежащей авторизации.
У вас уже есть защищенная учетная запись root, поэтому вы можете безопасно ответить 'n'.
Переключиться на аутентификацию unix_socket [Y/n] n
Далее вам будет предложено изменить пароль root. В Debian 12 пароль root тесно связан с автоматическим обслуживанием системы, поэтому его следует оставить в покое. Введите n, чтобы продолжить.
... пропуск.
У вас уже есть защищенная учетная запись root, поэтому вы можете безопасно ответить 'n'.
Изменить пароль root? [Y/n] n
Далее вам будут заданы определенные вопросы для повышения безопасности MariaDB. Введите Y, чтобы удалить анонимных пользователей, запретить удаленный вход root, удалить тестовую базу данных и перезагрузить таблицы привилегий.
... пропуск.
По умолчанию установка MariaDB имеет анонимного пользователя, позволяя любому
войти в MariaDB, не имея учетной записи пользователя.
Это предназначено только для тестирования и для того, чтобы установка
проходила немного легче. Вы должны удалить их перед переходом в
производственную среду.
Удалить анонимных пользователей? [Y/n] y
... Успех!
Обычно root должен иметь возможность подключаться только с 'localhost'. Это
гарантирует, что кто-то не сможет угадать пароль root из сети.
Запретить удаленный вход root? [Y/n] y
... Успех!
По умолчанию MariaDB поставляется с базой данных с именем 'test', к которой любой может
получить доступ. Это также предназначено только для тестирования и должно быть удалено
перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y/n] y
- Удаление тестовой базы данных...
... Успех!
- Удаление привилегий на тестовую базу данных...
... Успех!
Перезагрузка таблиц привилегий обеспечит, что все изменения, сделанные до сих пор,
вступят в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y/n] y
... Успех!
Очистка...
Все готово! Если вы завершили все вышеперечисленные шаги, ваша установка MariaDB
должна быть теперь безопасной.
Спасибо за использование MariaDB!
Вы можете войти в оболочку MariaDB, набрав sudo mysql или sudo mariadb в командной строке.
Шаг 4 - Настройка MariaDB
Войдите в оболочку MariaDB.
$ sudo mysql
Создайте тестовую базу данных.
MariaDB> CREATE DATABASE exampledb;
Создайте учетную запись SQL пользователя.
MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';
Предоставьте все привилегии на базу данных пользователю.
MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
Поскольку мы не изменяем пользователя root, вам следует создать еще одного SQL пользователя для выполнения административных задач, который использует аутентификацию по паролю. Выберите для него надежный пароль.
MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;
Обновите привилегии пользователей.
MariaDB> FLUSH PRIVILEGES;
Выйдите из оболочки.
MariaDB> exit
Давайте снова войдем в оболочку MySQL, используя вновь созданного пользователя.
$ sudo mysql -u exampleuser -p
Создайте тестовую таблицу.
MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );
Вставьте тестовые данные.
MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");
Повторите вышеуказанную команду несколько раз, чтобы добавить больше записей. Выполните следующую команду, чтобы проверить содержимое таблицы.
MariaDB> SELECT * FROM exampledb.name_list;
Вы получите следующий вывод.
+-----+---------+
| sno | content |
+-----+---------+
| 1 | Navjot |
| 2 | Adam |
| 3 | Josh |
| 4 | Peter |
+-----+---------+
4 строки в наборе (0.00 сек)
Выйдите из оболочки MySQL.
MariaDB> exit
Шаг 5 - Установка Nginx
Debian 12 поставляется со старой версией Nginx. Чтобы установить последнюю версию, вам нужно загрузить официальный репозиторий Nginx.
Импортируйте ключ подписи Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Добавьте репозиторий для стабильной версии Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Обновите системные репозитории.
$ sudo apt update
Установите Nginx.
$ sudo apt install nginx
Проверьте установку. На системах Debian следующая команда будет работать только с sudo.
$ sudo nginx -v
nginx version: nginx/1.24.0
Запустите Nginx.
$ sudo systemctl start nginx
Проверьте статус службы.
$ sudo systemctl status nginx
? nginx.service - nginx - высокопроизводительный веб-сервер
Загружено: загружено (/lib/systemd/system/nginx.service; включено; предустановлено: включено)
Активно: активно (работает) с Чт 2023-06-15 16:33:46 UTC; 1с назад
Документы: https://nginx.org/en/docs/
Процесс: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (код=вышел, статус=0/УСПЕХ)
Основной PID: 2258 (nginx)
Задачи: 2 (лимит: 1108)
Память: 1.8M
CPU: 6ms
CGroup: /system.slice/nginx.service
??2258 "nginx: основной процесс /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??2259 "nginx: рабочий процесс"
Шаг 6 - Настройка PHP-FPM
Откройте php.ini для редактирования.
$ sudo nano /etc/php/8.2/fpm/php.ini
Чтобы установить размеры загружаемых файлов, измените значения переменных upload_max_filesize и post_max_size.
upload_max_filesize = 50M
...
post_max_size = 50M
Настройте лимит памяти PHP в зависимости от ресурсов вашего сервера и требований.
memory_limit = 256M
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Вы также можете использовать следующие команды, чтобы внести изменения, не открывая файл.
$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini
Откройте файл /etc/php/8.0/fpm/pool.d/www.conf.
$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Нам нужно установить Unix пользователя/группу процессов PHP на nginx. Найдите строки user=www-data и group=www-data в файле и измените их на nginx.
...
; Unix пользователь/группа процессов
; Примечание: Пользователь обязателен. Если группа не установлена, будет использована группа по умолчанию.
; будет использована.
user = nginx
group = nginx
...
Также найдите строки listen.owner=www-data и listen.group=www-data в файле и измените их на nginx.
listen.owner = nginx
listen.group = nginx
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Перезапустите процесс PHP-fpm.
$ sudo systemctl restart php8.2-fpm
Шаг 7 - Установка phpMyAdmin
Скачайте архивный файл phpMyAdmin для английского языка. Получите ссылку на последнюю версию на странице загрузки phpMyAdmin.
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz
Создайте публичный каталог для сайта.
$ sudo mkdir /var/www/html/example.com -p
Извлеките архив в публичный каталог.
$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com
Перейдите в публичный каталог.
$ cd /var/www/html/example.com
Переименуйте извлеченный каталог во что-то неясное для повышения безопасности.
$ sudo mv phpMyAdmin-5.2.1-english sm175
Шаг 8 - Настройка phpMyAdmin
Скопируйте файл образца конфигурации.
$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php
Откройте файл конфигурации для редактирования.
$ sudo nano sm175/config.inc.php
Найдите строку $cfg['blowfish_secret'] = ''; и введите случайную строку из 32 символов для аутентификации на основе cookie.
Вы можете использовать онлайн-генератор blowfish от phpSolved или сделать это через командную строку.
Скопируйте значение и вставьте его, как показано.
$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Измените владельца сайта и phpMyAdmin на сервер Nginx.
$ sudo chown -R nginx:nginx /var/www/html/example.com
Удалите каталог установки phpMyAdmin.
$ sudo rm -rf /var/www/html/example.com/sm175/setup
Шаг 9 - Настройка Opcache
Opcache — это система кэширования PHP. Она работает, сохраняя предварительно скомпилированный байт-код скрипта в памяти, так что каждый раз, когда пользователь посещает страницу, она загружается быстрее. Opcache установлен по умолчанию. Чтобы проверить, проверьте версию PHP.
$ php --version
PHP 8.2.7 (cli) (собран: 9 июня 2023 г. 19:37:27) (NTS)
Copyright (c) Группа PHP
Zend Engine v4.2.7, Copyright (c) Технологии Zend
с Zend OPcache v8.2.7, Copyright (c), Технологии Zend
Это говорит нам о том, что Opcache установлен и доступен. В случае, если он не отображается здесь, вы можете установить его вручную, выполнив следующую команду.
$ sudo apt install php-opcache
Чтобы изменить настройки Opcache, откройте файл /etc/php/8.2/fpm/conf.d/10-opcache.ini для редактирования.
$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
Следующие настройки должны помочь вам начать использовать Opcache и обычно рекомендуются для хорошей производительности. Вы можете включить его, добавив следующие строки внизу.
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Перезапустите PHP-FPM.
$ sudo systemctl restart php8.2-fpm
Шаг 10 - Установка Certbot для SSL
Нам нужно установить Certbot, чтобы сгенерировать бесплатные SSL-сертификаты, предлагаемые Let’s Encrypt.
Вы можете установить Certbot, используя репозиторий Debian, или получить последнюю версию с помощью инструмента Snapd. Мы будем использовать версию Snapd.
Debian 12 не поставляется с установленным Snapd. Установите пакет Snapd.
$ sudo apt install snapd
Выполните следующие команды, чтобы убедиться, что ваша версия Snapd актуальна.
$ sudo snap install core
$ sudo snap refresh core
Установите Certbot.
$ sudo snap install --classic certbot
Используйте следующую команду, чтобы убедиться, что команда Certbot может быть выполнена, создав символическую ссылку в директории /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Проверьте, работает ли Certbot правильно.
$ certbot --version
certbot 2.6.0
Шаг 11 - Тестирование демонстрационного сайта
Создание сайта
Создайте и откройте тестовую страницу для редактирования.
$ sudo nano /var/www/html/example.com/index.php
Вставьте следующий код в него.
Список участников";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "- " . $row['content'] . "
";
}
echo "
";
} catch (PDOException $e) {
print "Ошибка!: " . $e->getMessage() . "
";
die();
}
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Создание SSL-сертификата
Выполните следующую команду, чтобы сгенерировать SSL-сертификат.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
Вышеуказанная команда загрузит сертификат в директорию /etc/letsencrypt/live/example.com на вашем сервере.
Сгенерируйте сертификат Diffie-Hellman group.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Проверьте службу планировщика обновления Certbot.
$ sudo systemctl list-timers
Вы найдете snap.certbot.renew.service как одну из служб, запланированных для выполнения.
СЛЕДУЮЩИЙ ОСТАЛОСЬ ПОСЛЕДНИЙ ПРОШЛО ЮНИТ АКТИВИРУЕТ
.....
Вс 2023-02-26 06:32:00 UTC 9ч осталось Сб 2023-02-25 18:04:05 UTC 2ч 59мин назад snap.certbot.renew.timer snap.certbot.renew.service
Вс 2023-02-26 06:43:20 UTC 9ч осталось Сб 2023-02-25 10:49:23 UTC 10ч назад apt-daily-upgrade.timer apt-daily-upgrade.service
Вс 2023-02-26 09:00:06 UTC 11ч осталось Сб 2023-02-25 20:58:06 UTC 5мин назад apt-daily.timer apt-daily.service
Выполните пробный запуск процесса, чтобы проверить, работает ли обновление SSL правильно.
$ sudo certbot renew --dry-run
Если вы не видите ошибок, значит, все готово. Ваш сертификат будет автоматически обновляться.
Настройка Nginx
Создайте и откройте файл /etc/nginx/conf.d/example.conf для редактирования.
$ sudo nano /etc/nginx/conf.d/example.conf
Вставьте следующий код в него.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
root /var/www/html/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Передать PHP-скрипты серверу FastCGI
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #в зависимости от версий PHP
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
# принудить HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Откройте файл /etc/nginx/nginx.conf для редактирования.
$ sudo nano /etc/nginx/nginx.conf
Добавьте следующую строку перед строкой include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Проверьте конфигурацию Nginx.
$ sudo nginx -t
Если вы не видите ошибок, значит, вы готовы к работе. Запустите сервер Nginx.
$ sudo systemctl start nginx
Загрузите ваш сайт, посетив https://example.com в вашем браузере, и вы увидите следующую страницу.

Вы можете получить доступ к вашей установке phpMyAdmin, посетив URL https://example.com/sm175 в вашем браузере. Вы можете ввести своего административного пользователя или пользователя, созданного ранее, чтобы войти.
Заключение
Это завершает наш учебник, в котором вы узнали, как настроить стек LEMP на сервере Debian 12 и создать демонстрационный сайт. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.