Ошибка Apache Network Error AH00072: make_sock: could not bind to address
В этой серии руководств объясняется, как устранять неполадки и исправлять некоторые из наиболее распространенных ошибок, с которыми вы можете столкнуться при использовании веб-сервера Apache.
Каждый учебник в этой серии включает описание распространенных ошибок конфигурации Apache, сети, файловой системы или разрешений. Серия начинается с обзора команд и файлов журнала, которые вы можете использовать для устранения неполадок Apache. В последующих руководствах подробно рассматриваются конкретные ошибки.
Вступление
Сообщение об ошибке Apache AH00072: make_sock: could not bind to address
генерируется, когда другой процесс прослушивает тот же порт, который настроен для использования Apache. Обычно это стандартный порт 80
для HTTP-соединений или порт 443
для HTTPS-соединений. Однако любой конфликт порта с другим процессом может вызвать ошибку AH00072.
Ошибка возникает из сетевого стека базовой операционной системы. Проблема в том, что только один процесс может быть привязан к порту в любой момент времени. Если другой веб-сервер, такой как Nginx, настроен на прослушивание порта 80
и работает, то Apache не сможет запросить порт для себя.
Чтобы обнаружить конфликт порта с Apache, вам необходимо изучить вывод systemctl
и journalctl
, чтобы определить IP-адрес и порт, вызывающие ошибку. Затем вы можете решить, как решить проблему, будь то переключение веб-серверов, изменение IP-адреса, используемого Apache, порта или любой комбинации этих параметров.
Устранение неполадок с systemctl
Следуя инструкциям по устранению неполадок из руководства «Как устранить распространенные ошибки Apache» в начале этой серии, первым шагом при устранении неполадок AH00072: make_sock: could not bind to address
является проверка состояния Apache с помощью systemctl
.
Если systemctl
не включает вывод, описывающий проблему, то последний раздел этого руководства, Устранение неполадок с использованием журналов journalctl, объясняет, как исследовать журналы systemd
, чтобы найти конфликтующий порт.
Выходные данные systemctl status
во многих случаях будут содержать всю диагностическую информацию, необходимую для устранения ошибки. Он будет включать IP-адрес, который использует Apache, а также порт, к которому он пытается привязаться. В выходных данных также будет указано, как долго Apache не запускался, чтобы вы могли определить, как долго проблема затрагивала Apache.
В дистрибутивах Linux, производных от Ubuntu и Debian, запустите следующую команду, чтобы проверить статус Apache:
sudo systemctl status apache2.service -l --no-pager
В системах CentOS и Fedora используйте эту команду для проверки статуса Apache:
sudo systemctl status httpd.service -l --no-pager
Флаг -l
гарантирует, что systemctl
выводит все содержимое строки вместо замены длинных строк многоточием (…
). Флаг --no-pager
выводит весь журнал на ваш экран без вызова такого инструмента, как less
, который показывает только экран содержимого за раз.
Поскольку вы устраняете неполадки с сообщением об ошибке AH00072: make_sock
, вы должны получить вывод, подобный следующему:
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
, (98) Адрес уже используется: AH00072: make_sock: не удалось привязать к адресу, предоставляют вам всю информацию об ошибке 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
ограничиваетss
отображением только информации о сокетах, связанных с 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))
Опять же, замените соответствующий номер порта из выходных данных journalctl
, если он отличается от выделенного 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
, перенастроить nginx для прослушивания другого интерфейса и порта или перенастроить Apache, чтобы избежать конфликта портов.
Важно отметить, что процесс может отличаться от nginx
, а порт и IP-адреса не всегда могут быть 0.0.0.0
или [::]
, если вы диагностируете ошибку AH00072. Часто на одном сервере используются разные веб-серверы и прокси. Каждый может пытаться подключиться к разным портам IPv4 и интерфейсам IPv6 для обработки разного веб-трафика. Например, сервер, на котором настроен HAProxy, прослушивающий петлевой адрес 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 не запускается.