Ошибка AH00072: make_sock не может подключиться к адресу

Эта серия мануалов поможет вам предотвратить или устранить самые распространенные ошибки, которые возникают при работе с веб-сервером Apache.

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

Сообщение об ошибке Apache «AH00072: make_sock: could not bind to address» появляется, когда тот порт, который настроен для Apache, уже прослушивает другой процесс (Обычно это стандартный порт 80 для HTTP-соединений или порт 443 для HTTPS-соединений). Однако вызвать ошибку AH00072 может любой другой конфликт порта и процесса.

Ошибка возникает в сетевом стеке базовой операционной системы. Проблема заключается в том, что в любой момент времени к конкретному порту может быть привязан только один процесс. Если на прослушивание порта 80 настроен другой веб-сервер (допустим, Nginx) и он работает, то Apache не сможет запросить порт для себя.

Чтобы обнаружить конфликт порта Apache, вам необходимо изучить вывод systemctl и journalctl, чтобы определить IP-адрес и порт, вызывающие ошибку. Затем вы можете выбрать путь решения проблемы: переключить веб-серверы, изменить IP-адрес или порт для Apache (или подобрать комбинацию этих параметров).

Устранение ошибки с помощью systemctl

Следуя инструкциям по устранению неполадок из мануала Устранение общих ошибок Apache, первым делом мы должны проверить состояние Apache с помощью systemctl.

Если вывод systemctl не содержит данных, описывающих проблему, перейдите к последнему разделу этого руководства. В нем вы узнаете, как с помощью journalctl исследовать логи systemd, чтобы найти конфликтующий порт.

Команда systemctl status во многих случаях может предоставить всю диагностическую информацию, необходимую для устранения ошибки. Ее вывод укажет на IP-адрес, который использует Apache, а также на порт, к которому он пытается подключиться. Из этих выходных данных вы узнаете, как долго Apache не запускался (это поможет определить, как долго эта проблема мешает работе Apache) .

В дистрибутивах Ubuntu и Debian запустите следующую команду, чтобы проверить статус Apache:

sudo systemctl status apache2.service -l --no-pager

В системах CentOS и Fedora для проверки статуса Apache используйте эту команду:

sudo systemctl status httpd.service -l --no-pager

Флаг -l выводит все содержимое строки без сокращений (без замены длинных строк многоточием (…)). Флаг —no-pager выводит весь лог на ваш экран, не вызывая инструмент less, который показывает только один экран контента за раз.

Если у вас есть ошибка AH00072, вы должны получить подобный вывод:

httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-07-28 13:58:40 UTC; 8s ago
Docs: man:httpd.service(8)
Process: 69 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Main PID: 69 (code=exited, status=1/FAILURE)
Status: "Reading configuration..."
Tasks: 213 (limit: 205060)
Memory: 25.9M
CGroup: /system.slice/containerd.service/system.slice/httpd.service
Jul 28 13:58:40 e3633cbfc65e systemd[1]: Starting The Apache HTTP Server…
Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80

Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80

Jul 28 13:58:40 e3633cbfc65e httpd[69]: no listening sockets available, shutting down
Jul 28 13:58:40 e3633cbfc65e httpd[69]: AH00015: Unable to open logs
Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Failed with result 'exit-code'.
Jul 28 13:58:40 e3633cbfc65e systemd[1]: Failed to start The Apache HTTP Server.

Ваш вывод может немного отличаться, если вы используете дистрибутив Ubuntu или Debian (в них имя процесса Apache не httpd, а apache2).

Этот пример вывода systemctl содержит пару строк из лога systemd, описывающих ошибку AH00072 (они выделены красным). Эти строки, каждая из которых начинается с «(98)Address already in use: AH00072: make_sock: could not bind to address», предоставляют вам всю информацию об ошибке AH00072, которая необходима для дальнейшего ее устранения, поэтому вы можете пропустить следующий раздел мануала, посвященный работе с journalctl. Переходите сразу к разделу об утилитах ss и ps в конце этого руководства.

Если ваш вывод systemctl не показывает конкретной информации об IP-адресе и портах, которые вызывают ошибку AH00072, вам необходимо проверить вывод journalctl из логов systemd. В следующем разделе мы расскажем, как использовать journalctl для устранения ошибки AH00072.

Устранение ошибки с помощью логов journalctl

Если ваши выходные данные systemctl не содержат сведений об ошибке AH00072, вам следует продолжить поиски с помощью команды journalctl, которая предназначена для проверки логов systemd для Apache.

В системах, производных от Ubuntu и Debian, выполните следующую команду:

sudo journalctl -u apache2.service --since today --no-pager

В системах типа CentOS, Fedora и RedHat используйте эту команду:

sudo journalctl -u httpd.service --since today --no-pager

Флаг —since today ограничивает вывод команды только записями, созданными с 00:00:00 текущего дня. Использование этой опции поможет ограничить объем записей, которые вам необходимо изучить при поиске ошибок.

Если Apache не может подключиться к используемому порту, найдите в выходных данных следующие записи (в частности строки, содержащие код ошибки AH00072, как показано в этом примере):

-- Logs begin at Tue 2020-07-14 20:10:37 UTC, end at Tue 2020-07-28 14:01:40 UTC. --
. . .
Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
Jul 28 14:03:01 b06f9c91975d apachectl[71]: no listening sockets available, shutting down

Эти выходные данные указывают на две ошибки AH00072. Первая строка объясняет, что Apache не может связаться с адресом [::]:80 (это порт 80 на всех доступных интерфейсах IPv6). Вторая строка с адресом 0.0.0.0:80 указывает, что Apache не может подключиться к порту 80 на всех доступных интерфейсах IPv4. В зависимости от конфигурации вашей системы IP-адреса могут отличаться, вывод может отображать только отдельные IP-адреса и включать только ошибки IPv4 или только IPv6.

Несмотря на то, что ваша система может иметь разные конфликтующие интерфейсы и порты, ваши ошибки будут похожи на показанный здесь вывод. Получив данные journalctl, вы сможете диагностировать проблему с помощью ss, о чем мы и поговорим в следующем разделе этого руководства.

Устранение ошибки с помощью утилит ss и ps

Чтобы устранить ошибку AH00072, вам необходимо определить, какой именно процесс прослушивает IP-адрес и порт, которые пытается использовать Apache. Большинство современных дистрибутивов Linux включают утилиту ss, которую можно использовать для сбора информации о состоянии сетевых сокетов системы.

В предыдущем разделе (о journalctl) вы видели, что какой-то процесс уже был привязан к адресам IPv4 и IPv6 на порту 80. Следующая команда определит имя процесса, который привязан к интерфейсу IPv4 на порту 80. Убедитесь, что вы заменили номер порта (если в вашем сообщении об ошибке указан другой порт, а не 80):

sudo ss -4 -tlnp | grep 80

Флаги команды ss изменяют ее стандартный вывод следующим образом:

  • -4 запрашивает только информацию о сокетах, связанных с IPv4.
  • -t ограничивает вывод только сокетами tcp.
  • -l отображает все прослушивающие сокеты с учетом ограничений -4 и -t.
  • -n отображает номера портов вместо имен протоколов типа «http» или «https». Это важно, поскольку Apache может пытаться подключиться к нестандартному порту, а имя сервиса будет сбивать с толку, в таком случае фактический номер порта удобнее.
  • -p выводит информацию о процессе, который привязан к порту.

Запустив команду со всеми этими флагами, вы получите следующий вывод:

LISTEN   0         511                 0.0.0.0:80               0.0.0.0:*        users:(("nginx",pid=40,fd=6))

Первые три поля не важны для устранения ошибок AH00072, поэтому их можно игнорировать. Важными полями являются четвертое (0.0.0.0:80), которое соответствует обнаруженной ранее (с помощью journalctl) ошибке, а также последнее поле «users:((«nginx»,pid=40,fd=6))», в частности, фрагмент pid=40.

Если у вас есть ошибка AH00072, связанная с интерфейсом IPv6, повторите вызов ss, на этот раз используя флаг -6, чтобы ограничить интерфейсы IPv6:

sudo ss -6 -tlnp |grep 80
LISTEN   0         511                    [::]:80                  [::]:*        users:(("nginx",pid=40,fd=7))

Убедитесь, что вы заменили номер порта (если в вашем сообщении об ошибке указан другой порт, а не 80).

Независимо от IPv4 и IPv6, выходные данные ss указывают, что программа с идентификатором процесса 40 (pid=40) привязана к интерфейсам 0.0.0.0:80 и [::]:80 соответственно. Этот процесс препятствует запуску Apache, поскольку он уже занимает необходимый порт. Чтобы определить имя программы, используйте утилиту ps, указав идентификатор процесса из вашего вывода вместо условного значения 40 в этом примере:

sudo ps -p 40

Вы получите похожий вывод:

PID TTY          TIME CMD
40 ?        00:00:00 nginx

nginx – это имя процесса, который прослушивает нужные интерфейсы. Теперь, когда у вас есть имя программы, которая препятствует запуску Apache, вы можете решить, как устранить ошибку. Например, вы можете остановить процесс nginx, перенастроить его на другой интерфейс и порт или перенастроить Apache, чтобы избежать конфликта портов.

Обратите внимание: при поиске ошибки AH00072 в вашем случае это может быть не nginx, а другой процесс; порт и IP-адреса не обязательно будут 0.0.0.0 или [::], это может быть любой порт и адрес. Часто на одном сервере используются разные веб-серверы и прокси. Каждый может пытаться подключиться к разным портам IPv4 и интерфейсам IPv6 для обработки разного веб-трафика. Например, сервер, на котором настроен HAProxy, прослушивающий loopback адрес IPv4 (также называемый localhost) по порту 8080, будет отображаться в выводе ss следующим образом:

LISTEN   0         2000              127.0.0.1:8080            0.0.0.0:*       users:(("haproxy",pid=545,fd=7))

Важно научиться объединять вывод systemctl или journalctl, который указывает определенные IP-адреса и порты, с диагностическими данными из ss, а затем и ps, чтобы сузить диапазон поиска и обнаружить процесс, который вызывает сбой Apache.

Заключение

В этом мануале вы узнали, как устранить ошибку Apache «AH00072 make_sock: could not bind to address» на интерфейсах IPv4 и IPv6. Вы также узнали, как использовать systemctl для проверки состояния сервера Apache, как с помощью journalctl изучить логи systemd на предмет конкретной информации об ошибке AH00072.

Собрав данные об ошибках, вы использовали утилиту ss для проверки состояния сетевых сокетов системы. После этого мы объединили информацию утилиты ss с утилитой ps, чтобы узнать имя процесса, из-за которого Apache не запускается.

Tags: , ,

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