Apache: конфликт модулей многопроцессности и PHP
Модуль PHP для Apache работает только с одним видом многопроцессности. При включённом потоковом модуле сервер либо не запускается, либо предупреждает о небезопасной работе. Поэтому связку обычно собирают иначе: PHP через обработчик, а не модулем.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Модуль PHP включён вместе с потоковой многопроцессностью
Модуль PHP не потокобезопасен в такой сборке. Apache отказывается стартовать или предупреждает.
-
Включены два модуля многопроцессности
Их может быть активен только один. При двух Apache сообщает об ошибке конфигурации.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Какие модули активны.
sudo apache2ctl -M 2>/dev/null | grep -iE "mpm|php"Проверка конфигурации: сообщает о конфликте.
sudo apachectl configtestРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Модуль PHP не потокобезопасен в такой сборке. Apache отказывается стартовать или предупреждает.
- Как проверить
-
Посмотрите включённые модули.
sudo apache2ctl -M 2>/dev/null | grep -iE "mpm|php"
- Как исправить
-
Переведите PHP на обработчик через php-fpm и оставьте потоковую многопроцессность: это и быстрее, и надёжнее.
sudo a2dismod php8.3 && sudo a2enmod proxy_fcgi setenvif && sudo a2enconf php8.3-fpm && sudo systemctl restart apache2
- Почему происходит
- Их может быть активен только один. При двух Apache сообщает об ошибке конфигурации.
- Как проверить
-
Посмотрите активные модули.
sudo apache2ctl -M 2>/dev/null | grep -i mpm
- Как исправить
-
Отключите лишний модуль:
a2dismod mpm_preforkили соответствующий.
Пример вывода
Модуль PHP несовместим с активной многопроцессностью. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
apachectl[4200]: Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
apachectl[4200]: AH00013: Pre-configuration failed
systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- nginx 502 Bad Gateway: connect() failed к приложению nginx работает, а приложение недоступно: connect() failed, connection refused, no such file or directory для сокета. Разбор 502.
- Веб-сервер не соединяется с обработчиком PHP Ответ 502 при работающем обработчике: веб-сервер и обработчик используют разные способы связи.
- Фоновые задания веб-приложения не выполняются Задания по расписанию не идут: неверный пользователь, не тот интерпретатор или задача не включена.
- BIND: порт 53 занят systemd-resolved named не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
Где встречается чаще всего
Источники
- Документация Apache: модули многопроцессности
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено включением модуля PHP при активной потоковой многопроцессности.