Apache nie uruchamia się, adres jest już w użyciu (ale nie tak naprawdę)

58

Próbuję skonfigurować maszynę wirtualną z systemem Ubuntu 12.04. Mam dwa wirtualne hosty skonfigurowane przy użyciu portu 80, ale Apache się nie uruchomi.

Otrzymuję ten błąd:
(98) Address already in use: make_sock: could not bind to address 0.0.0.0:80

Dane wyjściowe netstat -tulpnpokazują, że nic nie używa portu 80. Co może być przyczyną tego?

Strzelec Barnes
źródło
zaczynasz jako root? Domyślnie tylko root może otwierać porty poniżej 1024.
Jeden
Tak, jestem. Działał w pewnym momencie, gdy skonfigurowałem tylko jednego wirtualnego hosta, więc od tego czasu usunąłem drugiego wirtualnego hosta, aby spróbować rozwiązać problem, ale nie mam z tym szczęścia.
Strzelec Barnes,
Czy Twój host działa na porcie 80 i jesteś w trybie pomostowym dla gościa? Nie wiem, czy tak by się stało, ale wydaje się prawdopodobne
RobotHumans
Czy próbowałeś sugestii z początkowego apache nie udaje się (nie można powiązać z adresem 0.0.0.0:80) ? I proszę również dołączyć dane wyjściowe grep -ri listen /etc/apachei sudo netstat -ntlp | grep 80.
gertvdijk
2
grep -ri listen /etc/apache2wyjścia: etc / apache2 / httpd.conf: Listen 80 /etc/apache2/httpd.conf: Listen 443 /etc/apache2/ports.conf: Listen 80 /etc/apache2/httpd.conf: Listen 443 / etc / apache2 / httpd.conf: Listen 443 sudo netstat -ntlp | grep 80nie generuje nic.
Gunner Barnes,

Odpowiedzi:

38

Upewnij się, że nie deklarujesz Listen 80dwa razy w plikach .conf.

Na przykład możesz mieć go zarówno w, jak ports.confi w gospodzie sites-enabled/www.conf.

Aby się dowiedzieć, użyj: grep -ri listen /etc/apache2

Trzymaj Listen 80w jednym miejscu.

ravi
źródło
19

Odpowiadając na sposób, w jaki rozwiązałem ten problem. Może być pomocny dla kogoś w przyszłości.

Próbować netstat -ltnp | grep :80

To zwróci coś w rodzaju

tcp6 0 0 ::: 80 ::: * LISTEN 1047 / apache2

Następnie uruchomić

sudo kill -9 1047

Gdzie 1047 to pid programu działającego na porcie 80. Możesz zastąpić pid, który uzyskałeś netstat

Anonimowy Dziobak
źródło
wow! ... a oto jestem 48 godzin po wysłaniu biletu na inmotionhosting i czekaniu na odpowiedź. dziękuję
Amjo
2
Co to znaczy? Nie dostaję PID ani imienia. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
Aaron Franke
@AaronFranke Czy możesz spróbować uruchomić to polecenie w terminalu po zmaksymalizowaniu okna?
Anonimowy Dziobak
2
@AaronFranke uruchom go z sudo. Możesz nie mieć uprawnień do przeglądania.
Advait S
13

Kiedy miałem ten problem, okazało się, że mój Apache nie mógł się uruchomić podczas rozruchu, ponieważ miałem witrynę SSL, która wymagała podania hasła do certyfikatu.

Dobrym sposobem na stwierdzenie, czy tak jest w twoim przypadku, jest uruchomienie ps -ef | grep apache: jeśli to zwróci procesy, które wyglądają tak, /bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSAto czeka na podanie hasła w terminalu, którego nigdy nie zobaczysz.

Najpierw zabiłem zawieszony proces (wysłanie a kill -HUPdo identyfikatora procesu dla procesu / usr / sbin / apache2 powinno wystarczyć, aby zabić również inne, ale ps -ef | grep apachedla pewności wykonaj inne ).

Następnie wykonałem instrukcje zawarte w tym poście, aby utworzyć plik hasła SSL, który nie wymagał podania hasła. Potem service apache2 startzadziałało dobrze, a Apache zaczął poprawnie po ponownym uruchomieniu.

Brendan Quinn
źródło
11

Wystąpił ten błąd podczas nowej instalacji podczas uruchamiania Apache2 Ubuntu 12.10.

To błąd w apache2. Zawiesza się w tle. Oto mój przewodnik, gdzie mogą znajdować się błędy w oprogramowaniu.

Oto błąd, który dostałem:

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]

Adres już w użyciu? Co może go używać? Sprawdź to:

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

Oznacza to, że apache2 uniemożliwia uruchomienie apache2. Dziwaczny. To potwierdzi:

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

Tak, w tym przypadku działa apache2, próbowałem uruchomić apache2 po raz drugi na tym samym porcie.

To, co mnie dezorientuje, to to, że serviceraporty, że apache2 NIE działa:

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

A kiedy pytasz apache2ctl o jego status, zawiesza się.

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

Wydaje się, że Ubuntu ma problem z zarządzaniem apache2 podczas uruchamiania. Czas zatrzymać apache2:

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

Wielka wskazówka! Próbujesz zatrzymać apache2, a on utracił identyfikator procesu! Więc Ubuntu nie może zatrzymać apache2, ponieważ nie wie gdzie jest!

Można by pomyśleć, że ponowne uruchomienie go naprawi, ale tak się nie dzieje, ponieważ apache2 uruchamia się podczas uruchamiania i zawiesza. Normalny proces uruchamiania apache2 nie działa poprawnie.

Jak to naprawić?

Udało mi się to naprawić , analizując dane pswyjściowe polecenia. Zauważ, że pspolecenie mówi nam, że proces ten został uruchomiony przez „/etc/rc2.d/S91apache2 start”.

To jest program obrażający, który wymaga szybkiego kopnięcia.

/etc/rc2.d/S91apache2jest dowiązaniem symbolicznym używanym do uruchomienia apache2 podczas uruchamiania komputera. Z jakiegoś powodu wydaje się, że uruchamia apache2, a następnie się zawiesza. Więc musimy to powiedzieć, żeby tego nie robić.

Więc spójrz na to /etc/rc2.d/S91apache2.

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

Jest to symboliczny link, którego nie chcemy, żeby tam był. Zrób to, aby zapobiec uruchamianiu apache2 podczas uruchamiania:

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

Uruchom ponownie komputer, aby upewnić się, że apache2 nie uruchomi się i nie zawiesi. Ok dobrze. Teraz MUSISZ przywrócić apache2 z powrotem tak, jak było, ale to spowodowałoby, że znów się nie powiedzie.

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

Zamiast tego uruchom apache2 w następujący sposób:

sudo service apache2 start

A apache2 ponownie tworzy kopie zapasowe i wyświetla strony. Wydaje się, że istnieją poważne błędy w Apache2 / Ubuntu 12.10, które powodują, że apache2 uruchamia się i zawiesza. Jest to obejście, jak sądzę, poprawką jest uzyskanie nowszych wersji apache2 i Ubuntu i nadzieja na najlepsze.

Eric Leschinski
źródło
Miłej lektury i korzystania ze wskazówek! Dziękujemy za napisanie „sposobu, w jaki to debugowałeś”!
Ram
10

Miałem serwer Nginx nasłuchujący na moim serwerze AWS EC2, myślę, że został skonfigurowany, kiedy budowałem EC2, dlatego otrzymywałem błąd już używanego adresu. Zatrzymałem więc usługę i uruchomiłem usługę Apache2:

sudo service nginx stop
sudo service apache2 start
Cwaniak
źródło
Wielkie dzięki! Po wszystkich próbach zadziałało to dla mnie.
Vivek
4

Zrozumiałem to. Miałem zduplikowane polecenia Listen 80 zarówno w httpd.conf, jak i ports.conf

Ponadto, kopiując plik konfiguracyjny dla tego serwera, który jest wirtualizowany, zaniedbałem zauważenia, że ​​katalog dziennika błędów został zmieniony. Przeglądając ten dziennik błędów, zauważyłem, że katalog mime.typespliku konfiguracyjnego jest niepoprawny w moim httpd.confpliku. Zaktualizowałem ten parametr i serwer zaczął działać poprawnie.

Strzelec Barnes
źródło
3
Miałem także zduplikowane Listen 80polecenia zarówno w moim, jak httpd.confiports.conf
Gunner Barnes
2

Oznacza to, że Twój port 80 jest już używany, albo zmień port dla Apache2 (co nie jest zalecane), edytując:

/etc/apache2/ports.conf

Lub zamknij aplikację działającą na porcie 80:

netstat -antp | grep 80

Aby znaleźć to, co działa na porcie 80.

Dylan Dodds
źródło
netstat -antp | grep 80również nic nie produkuje.
Gunner Barnes
czy możesz skopiować i wkleić dane wyjściowe polecenia netstat -antp | grep 80?
Dylan Dodds
Nie ma dosłownie żadnych wyników.
Gunner Barnes
hmm, to dziwne, spróbuj zmienić port na 81, jeśli nie to nie jest blokowany port, istnieje kolejny błąd, który możesz sprawdzić błędy apache2 w /var/log/apache2/error.log
Dylan Dodds
2

Tylko wskazówka dla każdego, kto być może korzysta z VirtualBox z sieciami NAT. Zauważyłem, że ustawiłem regułę NAT między moim gościem a gospodarzem, wiążąc port

mschr
źródło
2

Nie tylko powielają wzmianki o

Listen 80

ale także wspomnieć o tym oprócz Listen 80

Include ports.conf
Scott Stensland
źródło