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

58

Я пытаюсь настроить виртуальную машину под управлением 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. Что может быть причиной этого?

Наводчик барнс
источник
ты запускаешь это как root? По умолчанию только root может открывать порты ниже 1024.
13
Да. В какой-то момент он работал, когда у меня был настроен только один виртуальный хост, поэтому с тех пор я удалил другой виртуальный хост, чтобы попытаться устранить проблему, но с этим тоже не повезло.
Стрелок Барнс
Есть ли на хосте что-то, работающее на порте 80, и вы находитесь в режиме моста для гостя? Я не знаю, что это сделало бы это, но это кажется вероятным
RobotHumans
Вы пробовали предложения из-за сбоя запуска apache (не удалось привязать к адресу 0.0.0.0:80) ? И, пожалуйста, также включите вывод grep -ri listen /etc/apacheи sudo netstat -ntlp | grep 80.
gertvdijk
2
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вообще ничего не выводит.
Стрелок Барнс

Ответы:

38

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

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

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

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

Рави
источник
19

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

Пытаться netstat -ltnp | grep :80

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

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

Тогда беги

sudo kill -9 1047

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

Анонимный утконос
источник
вау! ... и вот я через 48 часов после отправки билета на хостинг и жду ответа. спасибо
Amjo
2
Что это значит? Я не получаю PID или имя. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
Аарон Франке
@AaronFranke Можете ли вы попробовать запустить эту команду в терминале после увеличения окна?
Анонимный утконос
2
@AaronFranke запусти его с помощью sudo. Возможно, у вас нет прав для просмотра.
Advait S
13

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

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

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

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

Брендан Куинн
источник
11

Я получил эту ошибку при новой установке при запуске 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:80
no listening sockets available, shutting down
Unable to open logs
Action '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. Bizarre. Это подтвердит:

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

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

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

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

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

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

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

root@titan:~# /usr/sbin/apache2ctl stop
httpd (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 -l
lrwxrwxrwx   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 и надеяться на лучшее.

Эрик Лещинский
источник
Приятного чтения и использования ваших советов! Спасибо за то, что написали «как вы его отладили»!
Рам
10

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

sudo service nginx stop
sudo service apache2 start
ловкач
источник
Благодаря тонну! После всех попыток это сработало для меня.
Вивек
4

Я понял это. В моем httpd.conf и ports.conf были дублированные команды Listen 80

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

Наводчик барнс
источник
3
У меня также были повторяющиеся Listen 80команды в моем httpd.confиports.conf
Gunner Barnes
2

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

/etc/apache2/ports.conf

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

netstat -antp | grep 80

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

Дилан Доддс
источник
netstat -antp | grep 80ничего не выводит.
Стрелок Барнс
Вы можете скопировать и вставить вывод netstat -antp | grep 80?
Дилан Доддс
Там буквально нет выхода.
Стрелок Барнс
хм, это странно, попробуйте изменить порт на 81, если нет, это не заблокированный порт, есть еще одна ошибка, которую вы можете проверить на ошибки apache2 в /var/log/apache2/error.log
Дилан Доддс
2

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

mschr
источник
2

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

Listen 80

но и упоминание об этом в дополнение к Listen 80

Include ports.conf
Скотт Стенсленд
источник