- Home »

Установка стека 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 — это мощное решение, но оно требует понимания принципов работы каждого компонента для эффективного использования.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.