Установка полного LEMP (Nginx, MySQL, PHP) на 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).
Структура статьи
- Подготовка: полезные утилиты
- Установка и настройка Postfix (SMTP)
- Установка и настройка Dovecot (POP3)
- Установка PHP5 и xcache
- Установка MySQL и phpMyAdmin
- Установка 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 1024chmod 600 yourdomain.key
openssl req -new -key yourdomain.key -out yourdomain.csropenssl x509 -req -days 3650 -in yourdomain.csr -signkey yourdomain.key -out yourdomain.crtopenssl rsa -in yourdomain.key -out yourdomain.key.unencryptedmv -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 restartsaslauthd: 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 stopmysqld --skip-grant-tables --skip-networking &mysql mysqlUPDATE 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.bz2tar -xvjf lighttpd-1.4.18.tar.bz2 cd lighttpd-1.4.18./configuremakecp 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 с содержимым:
echo phpinfo(); ?>Откройте страницу в браузере и проверьте, что 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, и тестирование каждого сервиса.
Заметки
- Внимательно следите за логами после каждого шага.
- На современных дистрибутивах многие команды и пути изменились — используйте официальную документацию пакетов.
Похожие материалы
Восстановление кэша значков в Windows
Стрелки не работают в Excel — быстрое решение
Шифрование USB‑накопителя с VeraCrypt
PowerShell: история команд — просмотр и сохранение
Nandroid — полная резервная копия Android