Прерывистый «Адрес уже используется: AH00072: make_sock: не удалось привязать к адресу. »На порту 80

У нас периодически возникают ошибки «Адрес уже используется: AH00072: make_sock: не удалось привязать к адресу» при сбоях порта 80 на наших серверах. Я просмотрел другие ответы, и они в основном основаны на том, что это постоянный сбой, а LISTEN определяется дважды, что не является нашей проблемой.

Наша проблема возникает только вскоре после загрузки экземпляра, когда мы «sudo service httpd restart» для загрузки новой конфигурации, которую мы устанавливаем, в зависимости от среды.

Мне удалось выявить проблему вживую и убедиться, что на самом деле привязан httpd . Проблема заключается в том, что Apache / httpd зависает и не может перезапуститься, а затем перезапуск не дожидается этого.

Мы используем Apache 2.4 в Amazon Linux 1.

enter image description here

0
задан 19 July 2021 в 21:17
1 ответ

Есть две основные причины получения ошибки Address Already in Use :

  1. Другой сервер использует этот IP: порт

    В этом случае вы пытаетесь запустить две службы, и обе хотят тот же комбинированный адрес и порт, что невозможно. Только одна служба может прослушивать один конкретный порт. Видимо, вы не в этой ситуации.

  2. Тот же сервер слишком быстро перезагружается

    По умолчанию ядро ​​удерживает комбинацию IP: порт в течение нескольких секунд (возможно, минуты), прежде чем разрешить службе использовать их снова. Это необходимо для того, чтобы у всех клиентов была возможность получить правильный сигнал закрытия. Кроме того, из соображений безопасности вы можете получить пакеты, которые должны были быть отправлены старому соединению. Это может вызвать проблемы.

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

      [... snip ...] 
     ;; 
    restart) {{ 1}} log_daemon_msg "Restarting $ DESC" "$ NAME" 
    do_stop stop 
    case "$?" в 
    0 | 1) 
    засыпать 12 # << - засыпать перед перезапуском 
    do_start 
    case "$?" in 
     [... snip ...] 
     

    При использовании systemd вам придется отредактировать файл .service и добавить спящий режим перед запуском сервера apache2.

      ExecStart = sleep 20 && / usr / sbin / apache2 
     

Ваш порядок инициализации также может быть причиной проблемы (если вам нужно запустить, измените что-то, а затем перезапустите apache2 при загрузке; при этом, вероятно, важна возможность перезапустить apache2 в любой момент времени).

1
ответ дан 28 July 2021 в 14:06

Теги

Похожие вопросы