Home » Установка стека Linux Nginx MySQL PHP (LEMP) на Ubuntu
Установка стека Linux Nginx MySQL PHP (LEMP) на Ubuntu

Установка стека Linux Nginx MySQL PHP (LEMP) на Ubuntu

Хоть LAMP (Linux, Apache, MySQL, PHP) и считается классикой веб-разработки, в последние годы LEMP-стек завоевал серьёзную популярность благодаря производительности Nginx. Если вы настраиваете новый сервер или переходите с Apache на Nginx, эта статья поможет развернуть полноценный LEMP-стек на Ubuntu без лишних заморочек. Мы разберём не только пошаговую установку, но и подводные камни, с которыми можете столкнуться, плюс практические кейсы использования.

Что такое LEMP и зачем он нужен?

LEMP — это акроним от Linux, Nginx (Engine-x), MySQL и PHP. Главная фишка в том, что Nginx работает как асинхронный веб-сервер, который гораздо лучше справляется с высокими нагрузками по сравнению с Apache. Особенно это заметно на статическом контенте и при большом количестве одновременных соединений.

Вот основные преимущества LEMP перед LAMP:

  • Меньше потребление памяти — Nginx жрёт в разы меньше RAM
  • Лучшая производительность — особенно для статики
  • Масштабируемость — легко выдерживает тысячи соединений
  • Простота конфигурации — хотя это спорно

Подготовка системы

Перед установкой обновим систему и установим необходимые пакеты. Работаем на свежей Ubuntu 22.04 LTS (хотя инструкция подойдёт и для 20.04):

sudo apt update
sudo apt upgrade -y
sudo apt install curl wget gnupg2 software-properties-common -y

Если у вас ещё нет VPS или нужен более мощный выделенный сервер, самое время это исправить.

Установка Nginx

Nginx в Ubuntu устанавливается из стандартных репозиториев, но можно использовать и официальный репозиторий для получения последней версии:

# Стандартная установка
sudo apt install nginx -y

# Или из официального репозитория (рекомендуется)
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
echo "deb https://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx -y

Запускаем и добавляем в автозагрузку:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

Проверяем, что всё работает — открываем в браузере IP вашего сервера. Должна появиться стандартная страница Nginx.

Установка MySQL

MySQL — это сердце большинства веб-приложений. Устанавливаем MySQL Server:

sudo apt install mysql-server -y
sudo systemctl start mysql
sudo systemctl enable mysql

Обязательно запускаем скрипт безопасности:

sudo mysql_secure_installation

Во время выполнения скрипта:

  • Настройте пароль для root (используйте STRONG policy)
  • Уберите анонимных пользователей
  • Запретите удалённый доступ для root
  • Удалите тестовую базу данных

Создаём тестовую базу данных и пользователя:

sudo mysql -u root -p

CREATE DATABASE testdb;
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Установка PHP

PHP 8.1 идёт по умолчанию в Ubuntu 22.04, но для продакшена часто нужна конкретная версия. Устанавливаем PHP-FPM и необходимые расширения:

sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-json -y

Проверяем версию и статус:

php -v
sudo systemctl status php8.1-fpm

Если нужна другая версия PHP, используем репозиторий Ondřej Surý:

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.0-fpm php8.0-mysql # или другую версию

Настройка Nginx для работы с PHP

Теперь самое интересное — настраиваем Nginx для работы с PHP-FPM. Создаём конфигурационный файл для нашего сайта:

sudo nano /etc/nginx/sites-available/default

Вот рабочая конфигурация:

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    root /var/www/html;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    # Кеширование статики
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

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

sudo nginx -t
sudo systemctl reload nginx

Тестирование установки

Создаём тестовый PHP-файл:

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

Добавляем код:

<?php
phpinfo();
?>

Открываем в браузере `http://your_server_ip/info.php` — должна отобразиться страница с информацией о PHP.

Тестируем подключение к MySQL:

sudo nano /var/www/html/mysql_test.php
<?php
$servername = "localhost";
$username = "testuser";
$password = "strong_password";
$dbname = "testdb";

try {
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Подключение к MySQL успешно!";
} catch(PDOException $e) {
    echo "Ошибка подключения: " . $e->getMessage();
}
?>

Типичные проблемы и их решения

Проблема Причина Решение
502 Bad Gateway PHP-FPM не запущен или неправильный путь к сокету Проверить статус PHP-FPM и путь в конфигурации Nginx
403 Forbidden Неправильные права доступа sudo chown -R www-data:www-data /var/www/html
PHP файлы скачиваются Nginx не обрабатывает PHP Проверить блок location ~ \.php$ в конфигурации
Медленная работа Неоптимальная конфигурация Настроить кеширование и оптимизировать PHP-FPM

Оптимизация и безопасность

После базовой установки стоит заняться оптимизацией. Вот несколько важных настроек:

Настройка PHP-FPM

sudo nano /etc/php/8.1/fpm/pool.d/www.conf

Ключевые параметры для оптимизации:

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.process_idle_timeout = 10s
pm.max_requests = 500

Безопасность Nginx

Добавляем в конфигурацию Nginx:

# Скрываем версию Nginx
server_tokens off;

# Базовые заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;

# Отключаем доступ к скрытым файлам
location ~ /\. {
    deny all;
}

Альтернативы и сравнение

LEMP — не единственный вариант для веб-разработки. Вот сравнение с другими популярными стеками:

Стек Преимущества Недостатки Использование
LAMP Простота, .htaccess, много документации Больше потребление памяти Классические веб-приложения
LEMP Производительность, масштабируемость Сложнее конфигурация Высоконагруженные сайты
Node.js JavaScript везде, быстрый I/O Один поток для CPU-задач Реалтайм приложения
Django/Flask Быстрая разработка, Python Медленнее PHP Сложные веб-приложения

Автоматизация и скрипты

Для автоматизации развёртывания можно использовать следующий bash-скрипт:

#!/bin/bash

# Автоматическая установка LEMP стека
set -e

echo "Обновление системы..."
sudo apt update && sudo apt upgrade -y

echo "Установка Nginx..."
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx

echo "Установка MySQL..."
sudo apt install mysql-server -y
sudo systemctl start mysql
sudo systemctl enable mysql

echo "Установка PHP..."
sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip -y

echo "Настройка Nginx..."
sudo tee /etc/nginx/sites-available/default > /dev/null <

Для продакшена рекомендую использовать системы конфигурации типа Ansible или Docker:

# Dockerfile для LEMP
FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    nginx \
    mysql-server \
    php-fpm \
    php-mysql \
    && rm -rf /var/lib/apt/lists/*

COPY nginx.conf /etc/nginx/sites-available/default
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Мониторинг и логирование

Настраиваем логирование для отслеживания работы стека:

# Логи Nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Логи PHP-FPM
sudo tail -f /var/log/php8.1-fpm.log

# Логи MySQL
sudo tail -f /var/log/mysql/error.log

Для автоматического мониторинга можно использовать простой скрипт:

#!/bin/bash

# Проверка работы служб
services=("nginx" "php8.1-fpm" "mysql")

for service in "${services[@]}"; do
    if systemctl is-active --quiet $service; then
        echo "$service: OK"
    else
        echo "$service: ERROR"
        # Здесь можно добавить отправку уведомления
    fi
done

Интересные факты и нестандартные применения

Несколько интересных фактов о LEMP:

  • Nginx изначально создавался для решения проблемы C10K (10 000 одновременных соединений)
  • Название “Engine-X” произносится как “энджин-экс”, отсюда и LEMP вместо LENP
  • Nginx может работать как load balancer для нескольких PHP-FPM пулов
  • С помощью модуля ngx_http_realip_module можно получать реальные IP клиентов за прокси

Нестандартные способы использования:

  • Nginx как API Gateway — можно настроить проксирование на разные бэкенды
  • Кеширование с помощью Redis — интеграция с PHP для быстрого доступа к данным
  • WebSocket поддержка — Nginx может проксировать WebSocket соединения
  • Мультиязыковая поддержка — один Nginx может обслуживать PHP, Python и Node.js приложения

Полезные ссылки

Заключение и рекомендации

LEMP-стек — отличный выбор для современных веб-приложений, особенно когда важна производительность и масштабируемость. Nginx показывает себя значительно лучше Apache при высоких нагрузках, а связка с PHP-FPM даёт дополнительную гибкость в настройке.

Рекомендую использовать LEMP когда:

  • Ожидается высокая нагрузка на сервер
  • Нужна гибкая настройка кеширования
  • Планируется использование микросервисной архитектуры
  • Важна экономия ресурсов сервера

Лучше выбрать LAMP если:

  • Нужна поддержка .htaccess файлов
  • Используются legacy-приложения
  • Команда не готова изучать новые технологии
  • Простота важнее производительности

После установки не забудьте настроить SSL-сертификаты (Let’s Encrypt — отличный бесплатный вариант), файрвол и регулярные бэкапы. Мониторинг логов поможет вовремя выявить проблемы и оптимизировать производительность.

Помните: идеального стека не существует, выбирайте инструмент под задачу. LEMP — это мощное решение, но оно требует понимания принципов работы каждого компонента для эффективного использования.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked