Dockered Apache / httpd:latest не запускается.

Вопрос или проблема

Я пытаюсь запустить контейнеризированный Apache httpd на сервере

Вот мой файл docker-compose.yml

version: '3'
services:
  httpd:
    container_name: httpd
    image: httpd:latest
    network_mode: host
docker-compose up

дает следующее:

Recreating httpd ... done
Attaching to httpd
httpd    | AH00557: httpd: apr_sockaddr_info_get() failed for blast.server.com
httpd    | AH00558: httpd: Не удалось надежно определить полное доменное имя сервера, используется 127.0.0.1. Установите директиву 'ServerName' глобально, чтобы подавить это сообщение
httpd    | AH00557: httpd: apr_sockaddr_info_get() failed for blast.server.com
httpd    | AH00558: httpd: Не удалось надежно определить полное доменное имя сервера, используется 127.0.0.1. Установите директиву 'ServerName' глобально, чтобы подавить это сообщение
httpd    | [Чт Окт 24 19:12:27.242433 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) настроен -- возобновление нормальной работы
httpd    | [Чт Окт 24 19:12:27.263452 2024] [core:notice] [pid 1:tid 1] AH00094: Командная строка: 'httpd -D FOREGROUND'
httpd    | [Чт Окт 24 19:12:27.243243 2024] [mpm_event:alert] [pid 9:tid 9] (1)Операция не разрешена: AH00480: ap_thread_create: невозможно создать рабочий поток
httpd    | [Чт Окт 24 19:12:27.243243 2024] [mpm_event:alert] [pid 10:tid 10] (1)Операция не разрешена: AH00480: ap_thread_create: невозможно создать рабочий поток
httpd    | [Чт Окт 24 19:12:27.243405 2024] [mpm_event:alert] [pid 11:tid 11] (1)Операция не разрешена: AH00480: ap_thread_create: невозможно создать рабочий поток
httpd    | [Чт Окт 24 19:12:29.265647 2024] [mpm_event:alert] [pid 1:tid 1] AH02324: Возникла нехватка ресурсов или другая неисправимая ошибка до успешной инициализации любого дочернего процесса... httpd завершает работу!
httpd вышел с кодом 0

Поскольку он завершает работу на pid 9, 10 и т.д., означает ли это, что моя машина сконфигурирована только на 8 pid, и что первые 8 были созданы? Что мне нужно настроить в файлах conf (и в каком файле)? Это будет ThreadsPerChild? Впервые запускаю apache через docker, не сталкивался с этой проблемой на рабочих серверах.

Ответ или решение

Проблема с запуском контейнера Apache Httpd под Docker

При попытке запуска контейнизированного Apache Httpd с использованием Docker вы сталкиваетесь с рядом ошибок, что может вызвать дополнительные трудности в процессе разработки. Давайте подробно разберем вашу конфигурацию и ошибки, чтобы предлагаемое решение было максимально эффективным.

1. Изучение конфигурационного файла docker-compose.yml

Ваш файл docker-compose.yml выглядит следующим образом:

version: '3'
services:
  httpd:
    container_name: httpd
    image: httpd:latest
    network_mode: host

Здесь вы используете режим сети host, что подразумевает, что контейнер будет использовать сетевой стек хоста напрямую. Это может быть полезно для работы с сервисами, зависящими от сетевых настроек, но стоит учитывать, что это также может ограничить некоторые функциональные возможности изоляции контейнера.

2. Анализ логов

Логи, которые вы получаете, указывают на несколько проблем:

  1. Ошибка определения имени хоста:

    AH00557: httpd: apr_sockaddr_info_get() failed for blast.server.com
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1.

    Эти сообщения говорят о том, что Apache не может разрешить указанный вами домен blast.server.com. Хотя эта ошибка не должна препятствовать запуску сервера, рекомендуется установить директиву ServerName в общем конфигурационном файле Apache, чтобы подавить данные предупреждения.

  2. Ошибка создания потоков:

    AH00480: ap_thread_create: unable to create worker thread

    Эта ошибка – главный индикатор проблемы. Она может быть вызвана недостатком ресурсов на машине или неправильными настройками конфигурации.

3. Возможные решения

Несмотря на сообщение о том, что httpd завершился с кодом 0, что указывает на нормальное завершение работы (а не ошибочное), проблемы, таки, имеются. Вот что вы можете сделать:

A. Настройка ServerName

Добавьте строку в конфигурацию Apache. Для контейнеризованного HTTPD это можно сделать, создав файл httpd.conf и подключив его в Dockerfile, или используя переменные окружения в Docker Compose:

    environment:
      - SERVER_NAME=localhost

Либо создайте файл конфигурации /usr/local/apache2/conf/httpd.conf с содержимым:

ServerName localhost
B. Проверка лимитов ресурсов

Проблемы с созданием потоков могут быть вызваны низким лимитом на количество процессов. Проверьте настройки системы по команде:

ulimit -a

Убедитесь, что параметры, связанные с max user processes (nproc) и max open files (nofile), установлены на достаточно высокие значения. При необходимости скорректируйте эти значения, добавив в файл /etc/security/limits.conf следующие строки:

* soft nproc 4096
* hard nproc 4096
* soft nofile 4096
* hard nofile 4096
C. Настройка httpd.conf

Всё же, если вы предполагаете, что проблема связана с настройками Apache, стоит обратить внимание на параметры ThreadsPerChild и MaxRequestWorkers. Эти настройки могут требовать корректировки, чтобы соответствовать возможностям вашего хоста.

Пример настройки:

<IfModule mpm_event_module>
    ThreadsPerChild 25
    MaxRequestWorkers 75
</IfModule>

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

4. Заключение

После внесения предлагаемых изменений, перезапустите сервер, и ошибки должны повыситься. Если же у вас остаются трудности с запуском Apache в контейнере Docker, возможно, стоит обратиться к логам для более глубокого анализа или увеличить ресурсы вашей виртуальной или физической машины.

Четкое понимание как Docker, так и Apache — это ключ к успешному управлению контейнерными приложениями. Помните, что изменение конфигураций требует тестирования, чтобы убедиться в их положительном влиянии на производительность и стабильность приложения.

Оцените материал
Добавить комментарий

Капча загружается...