Гид по технологиям

Установка полного LEMP (Nginx, MySQL, PHP) на Ubuntu/Debian

8 min read Сервера Обновлено 25 Nov 2025
LEMP на Ubuntu/Debian — полная инструкция
LEMP на Ubuntu/Debian — полная инструкция

Кратко: пошаговая инструкция по установке лёгкого и производительного сервера LEMP (Nginx + MySQL + PHP) с почтовым стеком (Postfix + Dovecot) на минимальной VPS (от ~96 МБ). Включены настройка TLS для почты, FastCGI для PHP, xcache, и рекомендации по безопасности и отладке. Следуйте разделам по порядку и проверяйте сервисы после каждого шага.

Важно: инструкция ориентирована на старые версии Ubuntu/Debian из исходного HowTo; для современных систем адаптируйте пути и команды под systemd и актуальные пакеты.

Введение

Этот документ описывает установку сервера LEMP (Linux, EngineX — Nginx, MySQL, PHP) на минимальной установке Ubuntu/Debian. Мы добавим почтовый стек Postfix + Dovecot (POP3) и ускоритель PHP (xcache). Инструкция полезна для небольших VPS и тестовых окружений.

Кому подходит: системным администраторам, devops-инженерам и разработчикам, которые хотят лёгкий и стабильный HTTP/почтовый сервер с низким потреблением памяти.

Ключевая идея: Nginx даёт меньшую нагрузку на память по сравнению с Apache, а схема FastCGI отделяет обработку PHP в отдельном процессе, что даёт гибкость и масштабируемость.

Термины 1‑строчно:

  • LEMP: Linux + EngineX (Nginx) + MySQL + PHP.
  • FastCGI: протокол для передачи запросов веб-серверу приложений (PHP-CGI).
  • SASL/saslauthd: механизм аутентификации для SMTP (Postfix).

Структура статьи

  • Подготовка: полезные утилиты
    1. Установка и настройка Postfix (SMTP)
    1. Установка и настройка Dovecot (POP3)
    1. Установка PHP5 и xcache
    1. Установка MySQL и phpMyAdmin
    1. Установка Nginx и FastCGI
  • Тесты и проверка
  • Критерии приёмки
  • Рекомендации по безопасности и отказоустойчивости
  • Альтернативы и когда это не сработает
  • Контрольный чеклист для ролей
  • Частые проблемы и их решения
  • Глоссарий

Подготовка — базовые утилиты

Перед началом установите базовые инструменты:

apt-get install wget telnet build-essential

Примечание: в новых версиях Debian/Ubuntu команды и пакеты могут отличаться (например, php7.4-*, systemd вместо /etc/init.d и т.д.). Подстраивайте команды под вашу ОС.

1. Установка Postfix

Установите Postfix и сопутствующие пакеты:

apt-get install postfix libsasl2 sasl2-bin libsasl2-modules libdb3-util procmail

Во время установки вам будут заданы вопросы конфигурации. Пример ответов для типичной конфигурации:

  • General type of configuration? — Internet Site
  • Mail name? — yourdomain.com

После установки рекомендуется перезапустить конфигурацию:

dpkg-reconfigure postfix

Образец команд для настройки Postfix и SASL (вставьте в терминал):

postconf -e 'smtpd_sasl_local_domain ='  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'smtpd_sasl_security_options = noanonymous'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'  
postconf -e 'inet_interfaces = all'  
echo 'pwcheck_method: saslauthd' >> /etc/postfix/sasl/smtpd.conf  
echo 'mech_list: plain login' >> /etc/postfix/sasl/smtpd.conf

Создание самоподписанных сертификатов TLS (они будут использоваться и для Postfix, и для Dovecot):

mkdir /etc/ssl/yourdomain (the folder name can be of course anything such as the name of your mother...)  
cd /etc/ssl/yourdomain  
openssl genrsa -des3 -rand /etc/hosts -out yourdomain.key 1024
chmod 600 yourdomain.key  
openssl req -new -key yourdomain.key -out yourdomain.csr
openssl x509 -req -days 3650 -in yourdomain.csr -signkey yourdomain.key -out yourdomain.crt
openssl rsa -in yourdomain.key -out yourdomain.key.unencrypted
mv -f yourdomain.key.unencrypted yourdomain.key  
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Затем указываем Postfix использовать эти файлы:

postconf -e 'smtpd_tls_auth_only = no'  
postconf -e 'smtp_use_tls = yes'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtp_tls_note_starttls_offer = yes'  
postconf -e 'smtpd_tls_key_file = /etc/ssl/yourdomain/yourdomain.key'  
postconf -e 'smtpd_tls_cert_file = /etc/ssl/yourdomain/yourdomain.crt'  
postconf -e 'smtpd_tls_CAfile = /etc/ssl/yourdomain/cacert.pem'  
postconf -e 'smtpd_tls_loglevel = 1'  
postconf -e 'smtpd_tls_received_header = yes'  
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'  
postconf -e 'tls_random_source = dev:/dev/urandom'  
postconf -e 'myhostname = yourdomain.com'

Перезапустите Postfix:

/etc/init.d/postfix restart

saslauthd: Postfix работает в chroot (/var/spool/postfix), поэтому нужно создать каталог для сокета и настроить /etc/default/saslauthd. Пример команд и конфигурации см. ниже:

mkdir -p /var/spool/postfix/var/run/saslauthd

Отредактируйте /etc/default/saslauthd и установите:

START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
MECHANISMS="pam"
THREADS=5

Запустите saslauthd:

/etc/init.d/saslauthd start

Проверка SMTP-AUTH и TLS (telnet):

telnet yourdomain.com 25

Затем в сессии:

ehlo yourdomain.com

Ожидаемый ответ содержит 250-STARTTLS и строки AUTH PLAIN LOGIN.

Важно: на современных системах используйте systemctl вместо /etc/init.d/* и адаптируйте пути к файлам конфигурации.

2. Установка Dovecot

Мы будем использовать только POP3, чтобы сэкономить память.

apt-get install dovecot-common dovecot-pop3d

В /etc/dovecot/dovecot.conf укажите протоколы:

# Protocols we want to be serving: imap imaps pop3 pop3s
# If you only want to use dovecot-auth, you can set this to "none".
#protocols = imap imaps
protocols = pop3s pop3

Укажите пути до сертификатов, созданных ранее:

ssl_cert_file = /etc/ssl/yourdomain/yourdomain.crt
ssl_key_file = /etc/ssl/yourdomain/yourdomain.key

Перезапустите Dovecot:

/etc/init.d/dovecot restart

Почтовый сервер теперь должен принимать POP3(S) соединения.

3. Установка PHP5 и xcache

Установите PHP и xcache:

apt-get install php5-cli php5-cgi php5-mysql php5-xcache

Добавьте конфигурацию xcache в /etc/php5/cgi/php.ini (пример ниже — настройте под ваш сервер):

[xcache-common]
extension = xcache.so
[xcache.admin]
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""
[xcache]
; ini only settings, all the values here is default unless explained
; select low level shm/allocator scheme implemenation
xcache.shm_scheme =        "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size  =                32M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count =                 1
; just a hash hints, you can always store count(items) > slots
xcache.slots =                8K
; ttl of the cache item, 0=forever
xcache.ttl   =                 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval =           0
; same as aboves but for variable cache
xcache.var_size  =            32M
xcache.var_count =             1
xcache.var_slots =            8K
; default ttl
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300
xcache.test =                Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path =    "/dev/zero"
; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory =   ""
; per request settings
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =            On
[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager =          Off
; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""

Примечание: xcache.size и xcache.var_size надо выставить в зависимости от памяти VPS. Если значение 0 — xcache отключён. Если VPS имеет 2 CPU, увеличьте xcache.count до 2.

4. Установка MySQL и phpMyAdmin

Установите MySQL:

apt-get install mysql mysql-server

Иногда при установке возникают проблемы с установкой root-пароля. Вручную сбросить/установить пароль можно так:

/etc/init.d/mysql stop
mysqld --skip-grant-tables --skip-networking &
mysql mysql
UPDATE user SET password=PASSWORD('yourrootpassword') WHERE User="root" AND Host="localhost";
quit
/etc/init.d/mysql restart

Примечание: в новых версиях MySQL/MariaDB используются другие столбцы/функции для аутентификации; в этом случае используйте официальную документацию для безопасного сброса пароля.

Если нужно, установите phpMyAdmin отдельно из пакетов или вручную через composer/вендор.

5. Установка Nginx и FastCGI (Ubuntu примечание для Debian)

Автор исходного HowTo использовал пакет nginx устаревшей версии и собрал spawn-fcgi из lighttpd. В современных дистрибутивах пакеты nginx и spawn-fcgi могут быть в репозиториях. Приведу воспроизводимую последовательность из оригинала.

Скачать .deb (пример из исходного текста):

wget http://technokracy.net/nginx/nginx_0.5.32~grrr-1_i386.deb

Установить пакет:

dpkg -i nginx_0.5.32~grrr-1_i386.deb

По умолчанию Nginx мог слушать порт 8000, а корневая папка — /var/www/nginx-default. Измените конфигурацию сайта в /etc/nginx/sites-available/default, чтобы включить обработку php через FastCGI:

        location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
    }

Если spawn-fcgi отсутствует в репозитории, один из способов — собрать вспомогательную утилиту из исходников lighttpd и скопировать src/spawn-fcgi:

wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2
tar -xvjf lighttpd-1.4.18.tar.bz2 
cd lighttpd-1.4.18
./configure
make
cp src/spawn-fcgi /usr/bin/spawn-fcgi

Создайте скрипт /usr/bin/php-fastcgi, который будет запускать PHP-FastCGI:

touch /usr/bin/php-fastcgi

Вставьте в него:

#!/bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi

Создайте init-скрипт для автоматического старта:

touch /etc/init.d/init-fastcgi
#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
    start)
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    stop)
      killall -9 php
      RETVAL=$?
  ;;
    restart)
      killall -9 php
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac      
exit $RETVAL

Сделайте скрипт исполняемым и добавьте в автозагрузку:

chmod 755 /etc/init.d/init-fastcgi
/etc/init.d/init-fastcgi start
update-rc.d init-fastcgi defaults

Проверьте, что php-fcgi запущен:

ps ax | grep php

Создайте тестовый файл в /var/www/nginx-default, например info.php с содержимым:

Откройте страницу в браузере и проверьте, что PHP отображает информацию.

Тесты и проверка

Проверки после каждого шага:

  • Postfix слушает порт 25 и отвечает на EHLO с STARTTLS и AUTH
  • saslauthd запущен и доступен в chroot (/var/spool/postfix/var/run/saslauthd)
  • Dovecot слушает POP3/POP3S и использует указанные сертификаты
  • MySQL принимает подключения локально и root-пароль установлен
  • Nginx отдаёт статические файлы и проксирует PHP на 127.0.0.1:9000
  • PHP-FastCGI запущен и отвечает на запросы

Проверьте логи: /var/log/mail.log, /var/log/nginx/error.log, /var/log/mysql/error.log, /var/log/syslog

Критерии приёмки

  • Web-сайт отдает страницу PHP с корректной информацией phpinfo
  • Можно отправить почту через SMTP с авторизацией и STARTTLS
  • Можно принимать почту по POP3 с TLS
  • MySQL корректно запущен и можно подключиться как root

Рекомендации по безопасности и эксплуатация

  • TLS: используйте сертификаты от доверенных CA (Let’s Encrypt) вместо самоподписанных.
  • Ограничьте доступ к MySQL (bind-address = 127.0.0.1), настройте сильные пароли.
  • Защитите SSH (ключи, отключите root, поменяйте порт или firewall).
  • Настройте fail2ban для блокировки попыток подбора пароля для SSH и Postfix/Dovecot.
  • Отключите ненужные службы, используйте минимальные привилегии для процессов (www-data).
  • Регулярно обновляйте систему и пакеты безопасности.

Альтернативные подходы и когда этот рецепт не подойдёт

  • Если вам нужен полный почтовый функционал с IMAP и большим объёмом хранилища — используйте Dovecot с IMAP и настройте Sieve/LMTP, учтите рост потребления памяти.
  • Для современных проектов лучше использовать systemd-юниты вместо самописных init-скриптов.
  • Если нужен PHP-FPM, используйте php-fpm (предпочтительный и поддерживаемый способ для современных дистрибутивов) вместо spawn-fcgi.
  • Для высоконагруженных систем рассмотрите отдельные сервера для БД, почты и веб-приложений.

Ментальные модели и heuristics

  • Разделяй и властвуй: Nginx — статика и прокси; PHP — отдельные worker-процессы; БД — собственный сервис.
  • Минимум памяти на уровне соединений: используйте POP3 вместо IMAP, если не нужен постоянный доступ к почте.
  • Надёжность через изоляцию: выставляйте сервисы с минимальными правами и в отдельных контейнерах/виртуалках при возможности.

Роли и чеклист при развёртывании

Admin (системный администратор):

  • Установить и обновить базовую ОС
  • Настроить firewall (ufw/iptables)
  • Установить и настроить Postfix + saslauthd
  • Создать и защитить сертификаты TLS
  • Настроить автозапуск php-fcgi

Developer / DevOps:

  • Проверить phpinfo и работоспособность сайта
  • Настроить виртуальные хосты в /etc/nginx/sites-available
  • Подготовить конфигурации xcache и оптимизировать их

Security operator:

  • Подключить fail2ban и правила для почты и веба
  • Настроить мониторинг и алерты по основным метрикам

Частые проблемы и как их решать

  • Postfix не принимает аутентификацию: проверьте, что saslauthd запущен и сокет доступен в chroot.
  • PHP не исполняется: проверьте, что spawn-fcgi/ php-fpm запущен и Nginx настроен на правильный fastcgi_pass.
  • MySQL не стартует после смены пароля: проверьте логи /var/log/mysql/error.log и корректность команды UPDATE (для новых версий могут быть другие столбцы).

Советы по миграции и совместимости

  • Для Debian без systemd: используйте init-скрипты как в инструкции. Для systemd создайте unit-файлы.
  • Для современных PHP используйте пакеты php7.4-fpm / php8.1-fpm и настройку fastcgi_pass к unix-сокету (/run/php/php7.4-fpm.sock).
  • При обновлении MySQL на MariaDB проверьте совместимость паролей и плагинов аутентификации.

Пример плана восстановления (rollback)

  • Если изменение конфигурации Postfix привело к сбою: верните /etc/postfix/main.cf из резервной копии и перезапустите сервис.
  • При некорректном обновлении PHP: переключитесь на предыдущую версию пакета или используйте резервную виртуальную машину.
  • Перед любым серьёзным изменением делайте snapshot VPS или резервную копию конфигураций.

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

Можно ли использовать IMAP вместо POP3?

Да, но IMAP потребляет больше памяти, особенно при одновременных подключениях. Для минимальных VPS рекомендуется POP3.

Подойдет ли эта инструкция для современных Ubuntu 20.04+?

Принцип — да, но конкретные пакеты, пути и systemd-юниты отличаются. Рекомендуется использовать php-fpm, apt-пакеты nginx и актуальные сертификаты (Let’s Encrypt).

Как безопасно получить SSL-сертификат бесплатно?

Используйте Certbot от Let’s Encrypt и автоматизируйте обновление (certbot renew).

Глоссарий 1 строкой

  • TLS: криптографический протокол для шифрования соединений.
  • FastCGI: протокол между веб-сервером и интерпретатором приложений.
  • SASL: фреймворк аутентификации для SMTP.

Итог

Мы прошли весь цикл: установка Postfix (с TLS и SASL), Dovecot (POP3), PHP + xcache, MySQL, Nginx и запуск FastCGI. Инструкция рассчитана на минимальные ресурсы и даёт быстрый старт для небольшого VPS. Для продакшена адаптируйте под современные пакеты, используйте php-fpm, systemd и доверенные SSL-сертификаты.

Ключевые шаги: установка пакетов, генерация сертификатов, привязка Nginx к FastCGI, запуск saslauthd в chroot, и тестирование каждого сервиса.

Заметки

  • Внимательно следите за логами после каждого шага.
  • На современных дистрибутивах многие команды и пути изменились — используйте официальную документацию пакетов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Восстановление кэша значков в Windows
Windows

Восстановление кэша значков в Windows

Стрелки не работают в Excel — быстрое решение
Excel

Стрелки не работают в Excel — быстрое решение

Шифрование USB‑накопителя с VeraCrypt
Безопасность

Шифрование USB‑накопителя с VeraCrypt

PowerShell: история команд — просмотр и сохранение
PowerShell

PowerShell: история команд — просмотр и сохранение

Nandroid — полная резервная копия Android
Android.

Nandroid — полная резервная копия Android

Ошибка 0x800f0806 в Windows 11 22H2
Windows 11

Ошибка 0x800f0806 в Windows 11 22H2