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.

(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

(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через nginxallow/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.comCertbot предложит указать 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:
- Проверить статус сервисов:
sudo systemctl status nginx php-fpm certbot. - Проверить логи nginx:
/var/log/nginx/error.logи access-логи сайта. - Принудительно выполнить
sudo certbot renew --dry-runдля теста. - Если сертификат истёк и автоматическое обновление не сработало, можно временно вернуть 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)
- Подготовка: снимок системы и обновление пакетов.
- Установка основных пакетов (nginx, php-fpm, mariadb, redis).
- Настройка сервисов, создание пула php-fpm и сайтов.
- Развертывание приложения в /var/www и проверка прав.
- Защита интерфейсов (phpMyAdmin), включение SELinux и firewall.
- Получение SSL и настройка автопродления.
- Тестирование и перевод в эксплуатацию.
Тестовые кейсы и проверка приёмки
- Проверка доступности: запросы 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.
- Автоматизируйте бэкапы БД и регулярные проверки сертификатов.
Спасибо за внимание — удачных развёртываний!
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента