Apache не запускается, адрес уже используется (но не совсем)

Я пытаюсь настроить виртуальную машину под управлением Ubuntu 12.04. У меня есть два виртуальных хоста, настроенных с использованием порта 80, но Apache не запускается.

Я получаю эту ошибку:
(98) Address already in use: make_sock: could not bind to address 0.0.0.0:80

Выход из netstat -tulpn показывает, что порт 80 не используется. Что может быть причиной этого?

Убедитесь, что вы не объявляете Listen 80 дважды в файлах .conf.

Например, у вас может быть это как в ports.conf и гостиница sites-enabled/www.conf.

Чтобы выяснить это, используйте: grep -ri listen /etc/apache2

Держи Listen 80 только в одном месте.

Отвечая на то, как я решил эту проблему. Может быть кому-то полезно в будущем.

Попробуй netstat -ltnp | grep :80

Это вернет что-то вроде

tcp6 0 0 :::80 :::* СЛУШАТЬ 1047/apache2

Затем беги

sudo kill -9 1047

Где 1047 - это pid программы, запущенной на порту 80.Вы можете заменить pid, который вы получили из netstat

У меня был сервер Nginx, прослушивающий мой сервер AWS EC2, я думаю, что он был настроен, когда я создавал EC2, поэтому я получал ошибку Address already in use. Поэтому я остановил службу и запустил службу Apache2:

sudo service nginx stopsudo service apache2 start

Я получил эту ошибку при новой установке при запуске apache2 Ubuntu 12.10.

Это ошибка в apache2. Он зависает на заднем плане. Вот мое пошаговое руководство о том, где могут быть ошибки в программном обеспечении.

Вот ошибка, которую я получил:

el@titan:~$ sudo service apache2 start * Starting web server apache2               (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80no listening sockets available, shutting downUnable to open logsAction 'start' failed.The Apache error log may have more information.                                                                         [fail]

Адрес уже используется? Что могло бы его использовать? Проверить это:

el@titan:~$ grep -ri listen /etc/apache2/etc/apache2/apache2.conf:#   supposed to determine listening ports for incoming connections, and which/etc/apache2/apache2.conf:# Include list of ports to listen on and which to use for name based vhosts/etc/apache2/ports.conf:Listen 80/etc/apache2/ports.conf:    Listen 443/etc/apache2/ports.conf:    Listen 443

Это означает, что apache2 препятствует запуску apache2. Странный. Это подтвердит:

el@titan:~$ ps -ef | grep apache2root      1146   954  0 15:51 ?        00:00:00 /bin/sh /etc/rc2.d/S91apache2 startroot      1172  1146  0 15:51 ?        00:00:00 /bin/sh /usr/sbin/apache2ctl startroot      1181  1172  0 15:51 ?        00:00:00 /usr/sbin/apache2 -k startroot      1193  1181  0 15:51 ?        00:00:00 /bin/bash /usr/share/apache2/ask-for-passphrase 127.0.1.1:443 RSAel        5439  5326  0 16:23 pts/2    00:00:00 grep --color=auto apache2

Да, в этом случае apache2 запущен, я пытался запустить apache2 во второй раз на том же порту.

Что меня смущает, так это то, что service сообщает, что apache2 НЕ запущен:

el@titan:~$ sudo service apache2 statusApache2 is NOT running.

И когда вы запрашиваете apache2ctl для его статуса, он зависает.

root@titan:~# /usr/sbin/apache2ctl status**hangs until Ctrl-C is pressed.

Таким образом, Ubuntu, похоже, испытывает проблемы с управлением apache2 при загрузке. Время остановить apache2:

root@titan:~# /usr/sbin/apache2ctl stophttpd (no pid file) not running

Большая подсказка! Вы пытаетесь остановить apache2, и он потерял идентификатор процесса! Таким образом, Ubuntu не может остановить apache2, потому что он не знает, где он находится!

Вы могли бы подумать, что перезагрузка исправит это, но это не так, потому что apache2 запускается при загрузке и зависает. Обычный процесс загрузки apache2 работает неправильно.

Так как же это исправить?

Я смог это исправить путем анализа ps вывод команды. Обратите внимание, что ps команда сообщает нам, что этот процесс был запущен с помощью "/etc/rc2.d/S91apache2 start".

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

/etc/rc2.d/S91apache2 это символическая ссылка, используемая для запуска apache2 для вас при запуске компьютера. По какой-то причине кажется, что он запускает apache2, а затем зависает. Так что нам придется сказать ему, чтобы он этого не делал.

Так что иди и взгляни на это /etc/rc2.d/S91apache2.

el@titan:/etc/rc2.d$ ls -llrwxrwxrwx   1 root root    17 Nov  7 21:45 S91apache2 -> ../init.d/apache2*

Это символическая ссылка, и мы не хотим, чтобы она там была. Сделайте это, чтобы предотвратить запуск apache2 при загрузке:

root@titan:~# sudo update-rc.d -f apache2 remove Removing any system startup links for /etc/init.d/apache2 ...   /etc/rc0.d/K09apache2   /etc/rc1.d/K09apache2   /etc/rc2.d/S91apache2   /etc/rc3.d/S91apache2   /etc/rc4.d/S91apache2   /etc/rc5.d/S91apache2   /etc/rc6.d/K09apache2

Перезагрузите компьютер, чтобы убедиться, что apache2 не запускается и не зависает. Хорошо, хорошо. Теперь вы МОГЛИ бы вернуть apache2 в прежнее состояние, но это снова привело бы к сбою.

root@titan:~$ sudo update-rc.d apache2 defaults     //(don't do this) Adding system startup for /etc/init.d/apache2 ...   /etc/rc0.d/K20apache2 -> ../init.d/apache2   /etc/rc1.d/K20apache2 -> ../init.d/apache2   /etc/rc6.d/K20apache2 -> ../init.d/apache2   /etc/rc2.d/S20apache2 -> ../init.d/apache2   /etc/rc3.d/S20apache2 -> ../init.d/apache2   /etc/rc4.d/S20apache2 -> ../init.d/apache2   /etc/rc5.d/S20apache2 -> ../init.d/apache2

Вместо этого запустите apache2 следующим образом:

sudo service apache2 start

И apache2 снова работает и снова обслуживает страницы. Похоже, в apache2 / Ubuntu 12.10 есть несколько серьезных ошибок, из-за которых apache2 запускается и зависает. Это обходной путь, я полагаю, что решение состоит в том, чтобы получить более новые версии apache2 и Ubuntu и надеяться на лучшее.

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

Хороший способ определить, так ли это для вас, - это запустить ps -ef | grep apache: если это возвращает процессы, которые выглядят как /bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSA затем он ожидает ввода пароля в терминале, который вы никогда не увидите.

Во-первых, я остановил зависший процесс (отправив kill -HUP к идентификатору процесса для процесса / usr /sbin / apache2 должно быть достаточно, чтобы убить и другие, но выполнить другое ps -ef | grep apache чтобы быть уверенным).

Затем я последовал инструкциям в этом посте чтобы создать файл пароля SSL, который не требовал ввода пароля. Затем в service apache2 start работал нормально, и Apache запустился должным образом после перезагрузки.

Я уже все понял. У меня были дубликаты команд Listen 80 как в моем httpd.conf, так и в ports.conf

Кроме того, при копировании конфигурационного файла для этого виртуализируемого сервера я забыл заметить, что каталог журнала ошибок был изменен. Просматривая этот журнал ошибок, я заметил, что каталог для mime.types конфигурационный файл был неверным в моем httpd.conf файл. Я обновил этот параметр, и сервер запустился нормально.

Не просто повторяющиеся упоминания о

Listen 80

но и упоминание об этом в дополнение к прослушиванию 80

Include ports.conf

Это означает, что ваш порт 80 уже используется, либо измените порт для apache2 (что я не рекомендую), отредактировав:

/etc/apache2/ports.conf

Или закройте приложение, запущенное на порту 80:

netstat -antp | grep 80

Чтобы найти то, что запущено на порту 80.

Просто подсказка для тех, кто, возможно, использует VirtualBox с сетями NAT. Я обнаружил, что наличие правила NAT между моим гостем и хостом установило само себя, привязав порт

Попробуй sudo service apache2 stopИ снова перезапустите Apach

выходные данные `grep -ri listen /etc/apache2’:
etc/apache2/httpd.conf: Прослушивание 80
/etc/apache2/httpd.conf: Прослушивание 443
/etc/apache2/ports.conf: Прослушивание 80
/etc/apache2/httpd.conf: Прослушивание 443
/etc/apache2/httpd.conf: Прослушивание 443

sudo netstat -ntlp | grep 80 вообще ничего не выдает.

Эта ошибка появляется также, если вы дважды или более определили порт прослушивания xx… в этом случае слушайте 80

вы запускаете его от имени root? По умолчанию только root может открывать порты ниже 1024.

Да, я. В какой-то момент он работал, когда у меня был настроен только один виртуальный хост, поэтому с тех пор я удалил другой виртуальный хост, чтобы попытаться устранить проблему, но и с этим не повезло.

У вашего хоста что-то запущено на порту 80, и вы находитесь в мостовом режиме для гостя? Я не знаю, что это могло бы сделать, но это кажется вероятным

Пробовали ли вы предложения из Сбой запуска apache (не удалось привязать к адресу 0.0.0.0:80)? И, пожалуйста, также включите выходные данные grep -ri listen /etc/apache и sudo netstat -ntlp | grep 80.