Docker/httpd: Ошибка конфигурации: нет загрузки MPM

У меня есть докер-контейнер, основанный на официальном образе httpd. Из ниоткуда (после новой сборки) он начал сбой с ошибкой:

AH00534: httpd: Configuration error: No MPM loaded.

Ничего больше.

Я использую официальный образ httpd (FROM httpd:2.4), и до сих пор все работало нормально.
Ошибка появилась только после удаления всех изображений в моей системе с помощью docker system prune -af

Ответ 1

(редактируйте, спасибо delboy1978uk) Эту ошибку можно избежать, если применить простую рекомендацию: прикрепите изображения докера к определенной версии, а не к latest.


После поиска коммитов официального образа httpd я нашел решение. (возможно, этот вопрос/ответ может помочь другим)

Для тех, кто сталкивается с этой заметкой во время поиска решения, просто добавьте LoadModule mpm_event_module modules/mod_mpm_event.so в httpd.conf над другими директивами LoadModule.

(из комментариев к коммиту № 17166574)

Итак, поскольку я переопределял файл /usr/local/apache2/conf/httpd.conf без явного объявления модуля MPM, после этой фиксации мой образ начал давать сбой.
С этим быстрым исправлением все в порядке.

Для полного исправления добавьте это в ваш файл httpd.conf (спасибо svinther):

LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

или, для более перспективного решения, вы можете изменить исходный файл http.conf, используя sed.

Ответ 2

После сравнения моей конфигурации с последней конфигурацией httpd: 2.4 я обнаружил, что эти новые строки необходимо объединить в conf/httpd.conf

LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

Примечание для себя: при создании производного изображения докеры httpd, вероятно, было бы лучше модифицировать файлы conf с помощью sed, а не просто копировать в статическом файле

Ответ 3

Как бы ни работало принятое решение, оно не идеально. Настоящая причина, по которой вы получаете эту ошибку, - это, скорее всего, тот факт, что ваш Dockerfile начинается со следующей строки:

FROM httpd:latest

Эта latest часть, вы спрашиваете о последней и лучшей версии Apache.

Не делай этого. Это ваша инфраструктура. Зафиксируйте его до номера версии.

Что-то вроде

FROM apache:2.4.0

Это настоящий ответ. Невыполнение этого требования может привести к сбою вашей собственной базы кода, когда сторонние поставщики программного обеспечения обновят свой код.

Получите последнюю версию httpd.conf, запишите номер версии, затем внесите в него изменения и получите :latest черты из вашего Dockerfile.