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

LEMP на Fedora 32 — полная установка, настройка и безопасная эксплуатация

• 10 min read • Серверы • Обновлено 26 Nov 2025
LEMP на Fedora 32 — установка и настройка
LEMP на Fedora 32 — установка и настройка

Оглавление

  • Предисловие и цель
  • Требования
  • Подготовка системы и базовые пакеты
  • Отключение SELinux: зачем и альтернативы
  • Настройка Firewall (firewalld)
  • Установка PHP (через REMI)
  • Установка и базовая настройка MariaDB
  • Установка и конфигурация Redis
  • Установка и настройка Nginx
  • Настройка PHP-FPM
  • Установка и защита phpMyAdmin
  • Настройка Opcache
  • Установка SSL через Let’s Encrypt и автопродление
  • Тестирование и критерии приёмки
  • Поддержка, бэкапы и оперативное реагирование
  • Рекомендации по безопасности и отладке
  • Роли и чеклисты
  • Короткий глоссарий
  • Часто задаваемые вопросы
  • Краткое резюме

Предисловие и цель

Это практическое руководство рассчитано на системного администратора или инженера, который хочет развернуть современный LEMP-стек на сервере Fedora 32. Инструкции ориентированы на производственное использование: мы уделим внимание безопасности, резервному копированию, и автоматизации.

Важно: инструкции предполагают, что у вас есть физический или виртуальный сервер с Fedora 32 и пользователь с sudo.

Требования

  • Сервер с Fedora 32 (x86_64).
  • Ненулевой пользователь с правами sudo (не root для безопасности).
  • Доступ к интернету для установки пакетов и получения сертификатов.
  • Доменные имена, если вы хотите SSL для домена (пример: example.com).

Коротко о совместимости: метод применим и к другим версиям Fedora, но команды репозиториев REMI меняются по версии — см. раздел «Совместимость и подсказки по миграции».

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

Обновите систему и установите несколько утилит.

sudo dnf upgrade -y
sudo dnf install wget curl nano -y

Некоторые пакеты могут быть уже установлены.

Важно: перед продолжением создайте снапшот (snapshot) виртуальной машины или снимите резервную копию конфигураций, особенно на продакшн-серверах.

Отключение SELinux: зачем и альтернативы

В исходном руководстве предложено временно отключить SELinux командой setenforce 0. Это быстро снимает ограничения, но снижает безопасность.

Рекомендации:

  • В тестовой среде можно использовать sudo setenforce 0 для ускорения отладки.
  • Для продакшна лучше оставить SELinux включённым и настроить необходимые контексты (semanage, restorecon) или использовать boolean-переменные.

Если всё же нужно перевести SELinux в режим permissive для отладки:

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

Вернуть enforcing можно командой sudo setenforce 1.

Примечание: ниже в разделе безопасности приведены команды для настройки политик SELinux для nginx и php-fpm.

Настройка Firewall (firewalld)

Fedora использует firewalld.

Проверим состояние:

sudo firewall-cmd --state

Если вывод running, продолжайте.

Установим зону по умолчанию и откроем HTTP/HTTPS:

sudo firewall-cmd --set-default-zone=public
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --zone=public --permanent --add-service=https
sudo firewall-cmd --reload

Проверим список сервисов:

sudo firewall-cmd --zone=public --permanent --list-services

Вы должны увидеть как минимум: dhcpv6-client http https mdns ssh.

Если планируете позволить внешним сервисам подключаться к Redis, добавьте порт Redis (в примере ниже 6379):

sudo firewall-cmd --zone=public --permanent --add-port=6379/tcp
sudo firewall-cmd --reload

Важно: если Redis должен быть доступен только локально, не добавляйте правило и оставьте bind 127.0.0.1 в конфиге.

Установка PHP (через REMI)

Fedora 32 содержит PHP 7.4 по умолчанию, но рекомендуем REMI-репозиторий для более свежих пакетов и расширений.

Установим REMI:

sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm
sudo dnf config-manager --set-enabled remi
sudo dnf config-manager --set-disabled remi-modular

Установим PHP 7.4 с необходимыми расширениями:

sudo dnf install -y php-cli php-fpm php-mysqlnd php-opcache php-xml php-json php-mbstring php-gd php-curl php-zip

Проверим версию:

php --version

Ожидаемый вывод содержит строку PHP 7.4.x.

Совет: при необходимости других версий PHP используйте REMI-пакеты с суффиксом (например remi-7.3) — см. документацию REMI.

Установка и базовая настройка MariaDB

MariaDB — drop-in замена MySQL.

Установим MariaDB Server:

sudo dnf install mariadb-server -y
sudo systemctl enable --now mariadb

Проверим версию:

mysql --version

Выполним безопасную первичную настройку:

sudo mysql_secure_installation

Пояснение: MariaDB 10.4 по умолчанию предлагает unix_socket аутентификацию, когда вход в БД осуществляется через системного пользователя. Это удобно и безопасно, но phpMyAdmin и внешние приложения потребуют отдельного пользователя с паролем. В руководстве мы оставляем unix_socket и создадим отдельного пользователя для приложений.

Создание административного пользователя для приложений (пример):

sudo mysql
CREATE USER 'deploy'@'localhost' IDENTIFIED BY 'СильныйПароль123!';
GRANT ALL PRIVILEGES ON *.* TO 'deploy'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Замените пароль на уникальный.

Рекомендация по бэкапам: используйте mysqldump или инструменты для горячего бэкапа (Percona XtraBackup) для больших баз.

Установка и конфигурация Redis

Установим Redis и PHP-расширение:

sudo dnf install redis php-redis -y
sudo systemctl enable --now redis

Редактирование конфигурации Redis:

sudo nano /etc/redis.conf

Ключевые директивы:

  • bind 127.0.0.1 — ограничить локальным доступом. Для удалённого доступа bind 0.0.0.0 и отдельная защита по паролю/брандмауэру.
  • port 6379 — стандартный порт; можно изменить.
  • maxmemory 256mb и maxmemory-policy allkeys-lru — настройка кеширования.
  • requirepass — защита паролем, храни пароль безопасно.

После правок перезапустите:

sudo systemctl restart redis

Если вы меняли порт, не забудьте обновить firewall правило.

Примечание о персистентности: Redis может использовать RDB или AOF. Для кеша обычно выключают персистентность, но если используете Redis как primary datastore — настройте AOF и бэкапы.

Установка и проверка Nginx

Установим Nginx:

sudo dnf install nginx -y
sudo systemctl enable --now nginx
nginx -v

При успешной установке откройте IP-адрес сервера в браузере — должна отобразиться дефолтная страница Nginx.

Страница по умолчанию Nginx на Fedora 32

(Alt: Стандартная страница Nginx, отображаемая после установки на Fedora 32.)

Конфигурация Nginx: серверные блоки, директории и оптимизация

Создадим структуру директорий для сайтов:

sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled
sudo mkdir -p /var/www/example.com/html
sudo chown -R nginx:nginx /var/www/example.com/html
sudo chmod -R 755 /var/www/example.com

Создаём файл конфигурации сайта:

sudo nano /etc/nginx/sites-available/example.com.conf

Вставьте следующий пример конфигурации (адаптируйте под домены):

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

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

  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/example.com.error.log;

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
  }

  location ~* \.well-known/acme-challenge/ {
    allow all;
  }
}

Сделаем ссылку в sites-enabled:

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Откроем основной конфиг nginx и подключим sites-enabled (если ещё не подключено):

sudo nano /etc/nginx/nginx.conf

Добавьте или убедитесь, что присутствует:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

Также увеличим types_hash_max_size:

types_hash_max_size 4096;

Проверим синтаксис и перезагрузим nginx:

sudo nginx -t
sudo systemctl reload nginx

Советы по производительности Nginx:

  • Настройте gzip сжатие для статики.
  • Используйте правильные заголовки Cache-Control для статических ресурсов.
  • Для высоких нагрузок рассмотрите использование upstream с PHP-FPM на сокетах или tcp.

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

Отредактируем пул www.conf чтобы процессы работали от пользователя nginx:

sudo nano /etc/php-fpm.d/www.conf

Измените строки:

user = nginx
group = nginx
listen = /run/php-fpm/www.sock

Обратите внимание на параметры пула (pm):

  • pm = dynamic или ondemand
  • pm.max_children — максимальное количество дочерних процессов
  • pm.start_servers, pm.min_spare_servers, pm.max_spare_servers — для dynamic

Пример для малых VPS (1-2 vCPU, 1–2 GB RAM):

pm = ondemand
pm.max_children = 10

Перезапустим сервис:

sudo systemctl restart php-fpm

Для теста создайте phpinfo файл:

sudo nano /var/www/example.com/html/test.php

Вставьте:

Откройте http://<ваш-ip>/test.php

Тестовая страница PHP

(Alt: Вывод страницы phpinfo() в браузере, подтверждающий работу PHP-FPM.)

После тестирования удалите файл test.php чтобы не раскрывать конфигурацию в продакшне.

Установка phpMyAdmin и защита интерфейса

Установим phpMyAdmin из REMI:

sudo dnf install phpmyadmin -y

Создадим символическую ссылку в корне сайта:

sudo ln -s /usr/share/phpmyadmin /var/www/example.com/html/phpmyadmin
sudo chown -R nginx:nginx /usr/share/phpmyadmin

Рекомендуемые шаги по защите phpMyAdmin:

  • Переименуйте директорию (например sm123) и используйте нестандартный URL.
  • Отключите доступ по root; создайте отдельного пользователя БД.
  • Защитите доступ через HTTP Basic Auth или ограничьте по IP.
  • Ограничьте доступ к phpmyadmin через nginx allow/deny или через SSL-only.

Пример базовой аутентификации через nginx (фрагмент конфигурации):

location /sm123 {
  auth_basic "Restricted";
  auth_basic_user_file /etc/nginx/.htpasswd;
  try_files $uri $uri/ =404;
}

Создание файла паролей htpasswd:

sudo dnf install httpd-tools -y
sudo htpasswd -c /etc/nginx/.htpasswd admin

Далее перезагрузите nginx.

Настройка Opcache

Opcache улучшает производительность PHP, сохраняя байткод в памяти.

Если не установлен:

sudo dnf install php-opcache -y

Проверим наличие в php -v.

Настройки в /etc/php.d/10-opcache.ini рекомендуемые:

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

После изменения параметров перезагрузите PHP-FPM и Nginx:

sudo systemctl restart php-fpm
sudo systemctl reload nginx

Установка SSL через Let’s Encrypt и Certbot

Установим Certbot для nginx:

sudo dnf install certbot-nginx -y

Создаём сертификаты (пример для нескольких доменов):

sudo certbot --nginx -d example.com -d www.example.com -d phpmyadmin.example.com

Certbot предложит указать email, принять условия и выбрать политику редиректов (HTTP -> HTTPS или оставить ambos).

Если всё успешно, Certbot автоматически обновит конфигурацию Nginx и добавит SSL-блоки.

Конфигурация автопродления сертификатов

Добавим задачу в crontab для обновления сертификатов:

EDITOR=nano sudo crontab -e

Добавьте:

25 2 * * * /usr/bin/certbot renew --quiet

Это запускает проверку сертификатов ежедневно в 02:25 и обновляет те, у которых срок истекает.

Альтернатива: systemd timer, создаваемый пакетом certbot, — проверьте systemctl list-timers.

Тестирование и критерии приёмки

Критерии приёмки (минимум для рабочего LEMP):

  • Nginx отвечает на HTTP и (после настройки) HTTPS для указанных доменов.
  • PHP-FPM обрабатывает .php файлы (phpinfo доступна и показывает версию 7.4).
  • MariaDB успешно запущена, и вы можете войти под unix_socket или созданным пользователем.
  • Redis запущен и отвечает (при необходимости авто-тест через redis-cli).
  • phpMyAdmin доступен по защищённому URL и авторизация работает.
  • Certbot выдал сертификат и Nginx обслуживает сайт по HTTPS.

Простейшие команды для проверки:

curl -I http://localhost
curl -I https://example.com
php -v
sudo mysql -e "SHOW DATABASES;"
redis-cli ping

Ожидаемые ответы: HTTP/1.1 200 OK или 302/301 для редиректов; PONG от redis; список баз данных для MySQL.

Поддержка, бэкапы и оперативное реагирование

Рекомендации по бэкапам:

  • Регулярные дампы БД: mysqldump --all-databases с ротацией и удалением старых архивов.
  • Снимки / резервные копии каталогов веб-приложений (/var/www), конфигов (/etc/nginx, /etc/php-fpm.d, /etc/redis.conf).
  • Сохранение приватных ключей и certs (обычно в /etc/letsencrypt) в защищённом хранилище.

Инцидентный план при проблемах с SSL:

  1. Проверить статус сервисов: sudo systemctl status nginx php-fpm certbot.
  2. Проверить логи nginx: /var/log/nginx/error.log и access-логи сайта.
  3. Принудительно выполнить sudo certbot renew --dry-run для теста.
  4. Если сертификат истёк и автоматическое обновление не сработало, можно временно вернуть HTTP или использовать резервный сертификат.

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

Короткий чек-лист улучшения безопасности:

  • Оставьте SELinux в режиме enforcing при возможности.
  • Ограничьте доступ к phpMyAdmin по IP или BasicAuth.
  • Заблокируйте прямой доступ к .git, .env и другим чувствительным файлам.
  • Настройте брандмауэр и закройте ненужные порты.
  • Включите автоматическое обновление пакетов (или отслеживайте обновления вручную).
  • Используйте сильные пароли и ключи SSH, отключите вход по паролю для SSH.
  • Регулярно проверяйте логи на необычную активность.

SELinux: если nginx не может читать файлы, примените контексты:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/html(/.*)?'
sudo restorecon -Rv /var/www/example.com/html

Если PHP-FPM не может работать с сокетом:

sudo setsebool -P httpd_execmem 1
sudo setsebool -P httpd_can_network_connect_db 1

(Применяйте только если понимаете последствия.)

Роли и чеклисты

Администратор сервера:

  • Установить базовые пакеты и обновить систему.
  • Настроить firewall, SELinux и мониторы.
  • Настроить автоматические бэкапы.

DevOps / Разработчик:

  • Подготовить окружение сайта в /var/www.
  • Настроить CI/CD для деплоя.
  • Протестировать php-FPM и Opcache для приложения.

Dev (разработчик):

  • Тестировать на локальной копии конфигураций.
  • Проверить поддержку зависимостей (composer, npm).

Чеклист перед продакшн-пуском:

  • [ ] SSL установлен и тест https:// проходит.
  • Бэкапы настроены и протестированы.
  • Мониторинг (uptime, логи) настроен.
  • Безопасный доступ к phpMyAdmin и административным интерфейсам.

Мини-методология развёртывания (SOP)

  1. Подготовка: снимок системы и обновление пакетов.
  2. Установка основных пакетов (nginx, php-fpm, mariadb, redis).
  3. Настройка сервисов, создание пула php-fpm и сайтов.
  4. Развертывание приложения в /var/www и проверка прав.
  5. Защита интерфейсов (phpMyAdmin), включение SELinux и firewall.
  6. Получение SSL и настройка автопродления.
  7. Тестирование и перевод в эксплуатацию.

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

  • Проверка доступности: запросы HTTP/HTTPS возвращают 200/301/302.
  • Проверка PHP: php -v и вывод phpinfo() на тестовой странице.
  • Проверка БД: успешный вход и выполнение простого SELECT.
  • Проверка Redis: redis-cli ping -> PONG.
  • Проверка SSL: openssl s_client -connect example.com:443 и проверка цепочки сертификатов.
  • Проверка автоматического обновления сертификатов: sudo certbot renew --dry-run.

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

  • REMI использует релизы, специфичные для версии Fedora. При переходе на Fedora 33/34 проверьте URL пакета remi-release.
  • MariaDB версии и PHP версии могут отличаться; перед обновлением проверьте совместимость приложений.

Краткий глоссарий (однострочно)

  • LEMP: стек Linux + Nginx + MariaDB/MySQL + PHP.
  • REMI: сторонний репозиторий RPM с актуальными PHP-пакетами.
  • PHP-FPM: FastCGI Process Manager для PHP.
  • Opcache: кеширование байткода PHP в памяти.
  • Certbot: клиент для получения сертификатов Let’s Encrypt.

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

Вопрос: Нужно ли отключать SELinux навсегда?

О: Нет. В продакшне лучше оставить SELinux в enforcing и настроить правильные контексты.

Вопрос: Как защитить phpMyAdmin?

О: Переименуйте URL, используйте BasicAuth, ограничьте по IP и включите HTTPS.

Вопрос: Redis нужно открывать в интернет?

О: Нет. Redis по умолчанию должен быть доступен только локально. Если нужен удалённый доступ — используйте VPN и аутентификацию.

Вопрос: Как часто нужно обновлять сертификаты?

О: Let’s Encrypt выпускает сертификаты на 90 дней; certbot –renew выполняет проверку и продление автоматически (рекомендуется ежедневно).

Советы по отладке (быстрые команды)

  • Проверка статуса сервисов:
sudo systemctl status nginx php-fpm mariadb redis

# Живые логи
sudo journalctl -u nginx -f
sudo tail -n 200 /var/log/nginx/error.log
  • Проверка конфигураций:
sudo nginx -t
sudo php-fpm -t

Решение типичных ошибок

  • Nginx не может подключиться к PHP-FPM:

    • Убедитесь, что listen = /run/php-fpm/www.sock и права на сокет позволяют чтение nginx (пользователь/группа nginx).
    • Если используется TCP, используйте fastcgi_pass 127.0.0.1:9000;.
  • PHP не видит расширение Redis или Opcache:

    • Проверьте php -m | grep redis и php -v.
    • Перезапустите php-fpm после установки расширений.
  • Certbot не может пройти проверку домена:

    • Убедитесь, что DNS для домена указывает на ваш сервер.
    • Проверьте, что nginx отдаёт .well-known/acme-challenge (разрешения и location в конфиге).

Decision flow: SSL выбор

flowchart TD
  A[Нужен SSL?] -->|Да| B{Домен настроен?}
  B -->|Нет| C[Настроить DNS]
  B -->|Да| D[Запустить certbot]
  D --> E{Проверка успешна?}
  E -->|Да| F[SSL применён]
  E -->|Нет| G[Проверка конфигов и .well-known]
  G --> D
  A -->|Нет| H[Рассмотреть самоподписной сертификат для теста]

Подходящие сценарии и когда это не сработает

Подходит для большинства сайтов и небольших приложений. Сложности могут возникнуть, если:

  • Приложение требует другой версии PHP или специфичных модулей.
  • Требуются горизонтально масштабируемые кластеры с балансировкой нагрузки (тогда добавьте load balancer и внешние хранилища сессий).
  • Требуется поддержка Windows-платформ или нестандартных стэков.

Заключение

Вы развернули LEMP-стек на Fedora 32, установили Nginx, PHP-FPM, MariaDB, Redis, Opcache и настроили phpMyAdmin и SSL от Let’s Encrypt. Дальше — подготовьте бэкапы, мониторинг и автоматизацию деплоя, чтобы поддерживать стабильность и безопасность.

Краткие рекомендации:

  • Оставьте SELinux включённым в продакшне, настраивайте контексты.
  • Защитите административные интерфейсы и phpMyAdmin.
  • Автоматизируйте бэкапы БД и регулярные проверки сертификатов.

Спасибо за внимание — удачных развёртываний!

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

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро