Часть серии: распространенные ошибки Apache

В этой серии руководств объясняется, как устранять неполадки и исправлять некоторые из наиболее распространенных ошибок, с которыми вы можете столкнуться при использовании веб-сервера 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 не запускается.