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

Установка стека LEMH (Nginx, MariaDB, HHVM) на Ubuntu

6 min read Серверы Обновлено 01 Dec 2025
LEMH: Nginx + MariaDB + HHVM на Ubuntu
LEMH: Nginx + MariaDB + HHVM на Ubuntu

Краткие определения

  • LEMH: Linux + E (Nginx) + MariaDB + HHVM. Простая аббревиатура для описанного стека.
  • HHVM: виртуальная машина от Facebook для выполнения PHP/Hack с JIT-компиляцией.
  • php5-fpm: реализация FastCGI для PHP, используемая как резерв или для совместимости.

Предположения

  1. Инструкции проверялись на Ubuntu 14.04; они подойдут и для других Debian-подобных дистрибутивов.
  2. Гайд покрывает установку и базовую настройку стека LEMH, но не заменяет полный аудит безопасности сервера.
  3. У вас должен быть доступ по SSH или физический доступ к машине.

Что важно знать перед началом

  • Nginx не использует файлы .htaccess — все правила нужно переносить в конфигурацию Nginx.
  • MariaDB — drop-in замена MySQL, совместима с существующими базами данных.
  • HHVM даёт прирост производительности на некоторых нагрузках, но не всегда полностью совместим с модульными расширениями PHP; поэтому мы оставляем php5-fpm как fallback.

Установка Nginx

Nginx — лёгкий и производительный веб-сервер/реверс-прокси, ориентированный на высокую конкуренцию и малое потребление памяти.

Добавьте официальный PPA стабильной ветки и обновите списки пакетов:

sudo add-apt-repository ppa:nginx/stable
sudo apt-get update

Если вы хотите экспериментальную ветку, используйте ppa:nginx/development вместо stable:

sudo add-apt-repository ppa:nginx/development
sudo apt-get update

Установка Nginx:

sudo apt-get install nginx

Запустите сервис и проверьте статус:

sudo service nginx start
sudo service nginx status

Команда установки Nginx

Откройте в браузере http://ВАШЕГОСЕРВЕРА> — вы должны увидеть страницу приветствия Nginx, если всё настроено корректно.

Страница работы Nginx по умолчанию

Установка MariaDB

MariaDB — форк MySQL, сохраняющий совместимость и активно развивающийся как open-source проект. В репозиториях есть разные версии; в исходном исходнике использовалась ветка 10.0.

Если на сервере уже установлен MySQL, рекомендуется полностью удалить его перед установкой MariaDB:

sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo rm -rf /var/lib/mysql
sudo apt-get autoclean

Добавьте репозиторий MariaDB (пример для trusty и ветки 10.0 — при необходимости выберите свой регион/ветку):

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu trusty main'
sudo apt-get update

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

sudo apt-get install mariadb-server

Во время установки система предложит задать пароль для root-пользователя базы данных.

Установка пароля root для MariaDB

Запустите сервис MariaDB:

sudo service mysql start

Установка PHP и HHVM

HHVM — это не «замена PHP» в привычном смысле, это виртуальная машина с JIT для выполнения PHP/Hack-кода, дающая выгоду по производительности в ряде сценариев.

Сначала установим минимальный набор PHP через php5-fpm (без Apache-зависимостей):

sudo apt-get install php5-fpm php5-mysql php5-curl

Установка php5-fpm и модулей

Затем устанавливаем HHVM (пример репозиториев для Ubuntu Trusty):

wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
echo 'deb http://dl.hhvm.com/ubuntu trusty main' | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install hhvm

Окно установки HHVM

После установки зарегистрируйте HHVM как FastCGI-процесс для Nginx:

sudo /usr/share/hhvm/install_fastcgi.sh

Установка fastcgi для HHVM

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

sudo service hhvm restart

Создайте файл phpinfo для проверки (в корне сайта Nginx по умолчанию /var/www/html):

sudo nano /var/www/html/phpinfo.php

Вставьте:

Сохраните и откройте в браузере http://ВАШЕГОСЕРВЕРА>/phpinfo.php. Если HHVM работает, в заголовке страницы будет указано «HipHop».

Конфигурация сайта в Nginx с переключением на php5-fpm при падении HHVM

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

sudo nano /etc/nginx/sites-available/my-site

Пример содержимого (адаптируйте server_name и root под свой проект):

server {
    listen 80;
    listen [::]:80;

    root /var/www/html;

    index index.html index.htm index.php;

    server_name mywebsite.com;
    include hhvm-with-fallback.conf;

    location / {
        try_files $uri $uri/ =404;
    }

    location @fallback {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

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

Обратите внимание: в блоке location @fallback мы явно направляем запросы в php5-fpm через unix-сокет. Это наша резервная стратегия при падении HHVM.

Создаём файл hhvm-with-fallback.conf:

sudo nano /etc/nginx/hhvm-with-fallback.conf

Вставьте:

location ~ \.(hh|php)$ {
    proxy_intercept_errors on;
    error_page 500 501 502 503 = @fallback;

    fastcgi_keep_conn on;

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Проверьте синтаксис Nginx и перезапустите сервис:

sudo nginx -t
sudo service nginx restart

Когда это работает и когда — нет (ограничения и контрпримеры)

  • HHVM даёт преимущество на CPU-интенсивных приложениях и там, где код «горячий» и многократно выполняемый. Для простых сайтов с низкой нагрузкой выигрыш может быть незаметен.
  • Некоторые PHP-расширения или специфичные фреймворки/плагины могут быть несовместимы с HHVM — тестируйте на стейдже.
  • Если вам критичны низкие задержки первого байта для динамических страниц, сравните php5-fpm vs HHVM на реальных нагрузках.

Альтернативные подходы

  • Оставить Apache, но переключить на PHP-FPM и MariaDB — минимальные изменения при частичной оптимизации.
  • Использовать PHP 7+ (если доступно) вместо HHVM — в современности PHP 7/8 часто даёт такое же или лучшее ускорение и совместимость.
  • Использовать контейнеры (Docker) для изоляции разных версий PHP/HHVM и упрощения отката.

Методология миграции (мини-план)

  1. Подготовьте резервные копии: файлы сайта и дамп баз данных.
  2. Разверните LEMH на отдельном тестовом сервере.
  3. Перенесите код и БД, прогоните тесты (unit/integration).
  4. Нагрузочное тестирование (ab, wrk, siege) для сравнения.
  5. Поэтапный rollout: DNS/балансировщик -> наблюдение -> full cutover.

Факты и версии (факти-бокс)

  • Пример в гайде использует Nginx 1.6.2 (стабильная ветка) и dev 1.7.8 для экспериментов.
  • MariaDB в примере — репозиторий ветки 10.0.
  • HHVM требует отдельного репозитория; поведение и поддержка зависят от конкретной версии OS.

Чек-лист ролей

  • Системный администратор:
    • Резервные копии файлов и БД, мониторинг сервисов (HHVM, Nginx, MariaDB).
    • Настроить logrotate, мониторинг (Prometheus/Datadog) и алерты.
  • Разработчик:
    • Проверить совместимость кода с HHVM, провести интеграционные тесты.
    • Обеспечить корректную обработку ошибок и логирование.
  • Девопс/релиз-инженер:
    • Провести canary-deploy, прогнать нагрузочные тесты и откатный план.

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

  • Nginx успешно обслуживает статические файлы.
  • PHP-страницы корректно обрабатываются HHVM; при падении HHVM сайт продолжает работать через php5-fpm.
  • Все функциональные тесты приложения проходят.
  • Мониторинг отлавливает падения HHVM и оповещает админов.

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

  • Тест 1: Запрос phpinfo.php — ожидается текст «HipHop».
  • Тест 2: Принудительный стоп hhvm и повторный запрос — ожидаем обработку через php5-fpm (HTTP 200).
  • Тест 3: Нагрузочный тест (1000 RPS) — сравнить p95 и p99 для HHVM vs php5-fpm.

Устранение неполадок (Runbook)

  1. Если Nginx не стартует: sudo nginx -t и посмотреть /var/log/nginx/error.log.
  2. Если HHVM не отвечает: sudo service hhvm status; посмотреть логи /var/log/hhvm/error.log.
  3. Если сайт возвращает 500 и в конфиге указан fallback: убедиться, что php5-fpm работает (sudo service php5-fpm status) и сокет /var/run/php5-fpm.sock доступен.
  4. Для восстановления после некорректного обновления HHVM: откатить пакет, рестартовать hhvm и nginx.

Безопасность — краткие рекомендации

  • Закройте доступ к административным портам (SSH по ключам, отключите root-login).
  • Настройте брандмауэр (ufw/iptables) и ограничьте входящие соединения только по нужным портам.
  • Ограничьте доступ к сокетам php5-fpm и файлам конфигурации правами.
  • Регулярно обновляйте пакеты и применяйте патчи безопасности.

Совместимость и миграция от MySQL к MariaDB

  • MariaDB позиционируется как drop-in замена MySQL: большинство SQL-запросов и клиентских библиотек останутся работоспособны.
  • Тестируйте специфические функции (например, плагины хранения, пользовательские UDF), прежде чем переключать продакшн.

Резюме

Вы установили и настроили стек LEMH: Nginx для отдачи контента, MariaDB вместо MySQL и HHVM для ускорения PHP-кода с php5-fpm в качестве резервного исполнителя. Тщательно протестируйте приложение и настройте мониторинг/алерты перед переводом в продакшн.

Важно: прежде чем применять HHVM в продакшне, выполните полное тестирование совместимости и нагрузочное тестирование, чтобы оценить реальную выгоду для вашего приложения.

Авторитетная цитата: «Выбор стека всегда компромисс между производительностью, совместимостью и простотой поддержки. Тестируйте и автоматизируйте откат».

Сводка действий (коротко): резервная копия → установка Nginx → установка MariaDB → php5-fpm → HHVM → конфигурация Nginx с fallback → тесты → мониторинг.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Установка Windows 11 на неподдерживаемые ПК
Windows

Установка Windows 11 на неподдерживаемые ПК

Устранение ошибки Epson 1131: полное руководство
Поддержка принтеров

Устранение ошибки Epson 1131: полное руководство

Отключить Bluetooth в Arch Linux быстро и безопасно
Linux

Отключить Bluetooth в Arch Linux быстро и безопасно

Windows netstat: прослушиваемые порты
Сеть

Windows netstat: прослушиваемые порты

Ограничения ресурсов в Kubernetes: CPU, память и хранилище
Kubernetes

Ограничения ресурсов в Kubernetes: CPU, память и хранилище

Вредоносное ПО в облаке: что это и как защититься
Кибербезопасность

Вредоносное ПО в облаке: что это и как защититься