SELinux (Security-Enhanced Linux) даёт мандатный контроль доступа к файлам и процессам. Вместе с Nginx это режет лишние пути к файлам WordPress, даже если у процесса есть обычные Unix-права. Отключать enforcing «чтобы заработало» – плохой рефлекс; ниже рабочая схема меток и boolean.
Контекст: WordPress под Nginx (PHP-FPM) на RHEL/CentOS/Alma/Rocky-подобной системе. Пути и сокеты подставьте свои.
WordPress и Nginx
Пакет WordPress (если есть в репозитории) и копирование в document root:
sudo yum install wordpress sudo cp -r /usr/share/wordpress /var/www/html/
Минимальный vhost Nginx с PHP-FPM:
server {
listen 80;
server_name your_domain.com;
root /var/www/html/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Сокет PHP-FPM зависит от дистрибутива и версии PHP – проверьте unit/pool конфиг, не копируйте путь вслепую.
Контексты SELinux для каталога WordPress
По умолчанию SELinux может запретить чтение/запись там, где веб-стеку это нужно. Пометьте дерево как контент httpd и примените метки:
sudo semanage fcontext -a -t httpd_sys_content_t '/var/www/html/wordpress(/.*)?' sudo restorecon -Rv /var/www/html/wordpress
Каталоги, куда WordPress пишет (uploads, cache, иногда wp-content целиком на dev), обычно требуют httpd_sys_rw_content_t:
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/wordpress/wp-content/uploads(/.*)?' sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/wordpress/wp-content/cache(/.*)?' sudo restorecon -Rv /var/www/html/wordpress/wp-content
Без rw-метки обновления плагинов и загрузка медиа часто сыпятся в audit.log, при этом Unix-права выглядят «нормально».
Boolean: БД и сеть
Если MySQL/MariaDB на том же или другом хосте, веб-процессу нужен сетевой доступ к БД:
sudo setsebool -P httpd_can_network_connect_db 1
Флаг -P делает boolean постоянным после перезагрузки. Если PHP ходит наружу (обновления, API, SMTP через TCP), иногда нужен и более широкий:
# только если реально требуется исходящий TCP из httpd/php-fpm sudo setsebool -P httpd_can_network_connect 1
Не включайте все boolean «на всякий случай» – смотрите отказы в audit и включайте точечно.
Проверка и разбор отказов
После смены меток и boolean пройдите по сайту: просмотр страниц, вход в админку, правка записи, загрузка файла в медиабиблиотеку. Если что-то режется:
sudo ausearch -m avc -ts recent | tail -50 # или sudo grep denied /var/log/audit/audit.log | tail -30 # пояснение отказа: sudo ausearch -m avc -ts recent | audit2why
По выводу решаете: дописать fcontext, boolean или (реже) локальный модуль policy. Не ставьте setenforce 0 на прод как «решение».
Проверить текущие метки:
ls -Z /var/www/html/wordpress ls -Z /var/www/html/wordpress/wp-content/uploads getsebool -a | grep httpd
Регулярные обновления ОС, Nginx, PHP и WordPress по-прежнему обязательны. SELinux – слой контроля доступа, а не замена патчам.