- Почему не стартует служба Apache? Решение проблемы
- Ошибка AH00072: make_sock не может подключиться к адресу
- Устранение ошибки с помощью systemctl
- Устранение ошибки с помощью логов journalctl
- Устранение ошибки с помощью утилит ss и ps
- Заключение
- apache2: Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down
Почему не стартует служба Apache? Решение проблемы
Как то раз запускал службу веб-сервера Apache, а он отказался стартовать. Начал разбираться в чём же проблема. Дело было на рабочем компьютере под ОС Microsoft Windows. Полез в журналы операционной системы: Компьютер -> Свойства -> Управление (Управление компьютером) -> Служебные программы -> Просмотр событий -> Журналы Windows -> Приложение. Здесь нашёл множество сообщений касательно Apache. Привожу список сообщений об ошибках найденных в журналах касательно Apache:
- The Apache service named reported the following error: AH00558: httpd.exe: Could not reliably determine the server’s fully qualified domain name, using xxxx::yyyy:zzzz:www:nnnn. Set the ‘ServerName’ directive globally to suppress this message.
- The Apache service named reported the following error: AH00015: Unable to open logs.
- The Apache service named reported the following error: AH00451: no listening sockets available, shutting down.
- The Apache service named reported the following error: (OS 10048) Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). : AH00072: make_sock: could not bind to address 0.0.0.0:80.
Таким образом становится понятно, что Apache не может слушать 80-ый сетевой порт т.к. он уже кем-то занят, поэтому и не хочет стартовать. Т.е. надо либо настроить Apache таким образом, что бы он слушал какой-нибудь другой порт (свободный), либо же освободить 80-ый порт закрыв приложение, которое его использует или перенастроив это приложение на использование другого порта. Указать веб-серверу Apache прослушиваемый порт можно в конфигурационном файле httpd.conf директивой Listen .
Посмотрим кем занят 80-ый порт. В командой строке (она же cmd) вбиваю netstat -ab или так для более полной информации netstat -abno . И узнаю, что 80-ый сетевой порт слушает запущенный Skype. Да, я в курсе, это старая тема про которую все давно знают, что Skype по-умолчанию занимает 80-ый порт. В общем? отключил в Скайпе (Skype) прослушивание 80-ого порта и проблема была решена. Если у вас другое приложение занимает этот порт, то соответственно отключайте или перенастраивайте его.
Ошибка 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 в этом примере:
Вы получите похожий вывод:
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 не запускается.
apache2: Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down
I am trying a very simple tutorial explaining how convert docker-compose to minishift ( Minishift and Kompose. I tried to converted and push the docker-compose.yml example
I successfully compose and push as I can see from these logs:
Nevertheless, I couldn’t reach the web application and looking at the logs I found «The container frontend is crashing frequently. It must wait before it will be restarted again» and clicking in details:
Searching around I found someone suggestion to change from port 80 to some not root privileged port (eg. 8080). So I changed it in my docker-compose, deleted manualy the namespace myproject, recreated it in OpenShift Web Console and I tried to run once again. Exactly same exception with same message.
In case it is relevant, I have another cmd window with
I am quite begginer on moving from docker-compose to minishift (first time using Kompose tool to be honest).
My main question: why I still get same issue if I have alread changed the ports from 80:80 to 8080:8080 in docker-compose
Secondary question: what I have to check to see why I can’t start the pront-end service? It is quite limited the exception provided.
converted docker-compose by kompose (only front-end files)
Added all logs (I removed Redis and left only FrontEnd service since it was the only causing issue):
Edited (trying deploying another sample application)