O Apache falha ao iniciar, o endereço já está em uso (mas não realmente)

58

Estou tentando configurar uma VM executando o Ubuntu 12.04. Eu tenho dois hosts virtuais configurados usando a porta 80, mas o Apache não será iniciado.

Eu recebo este erro:
(98) Address already in use: make_sock: could not bind to address 0.0.0.0:80

A saída de netstat -tulpnmostra que nada está usando a porta 80. O que poderia estar causando isso?

Gunner Barnes
fonte
você está iniciando como root? Por padrão, somente o root pode abrir portas abaixo de 1024.
onse
Sim, eu sou. Ele estava em execução em um momento em que eu tinha apenas um host virtual configurado, então removi o outro host virtual para tentar solucionar o problema, mas também não tive sorte.
quer
Você hospeda algo em execução na porta 80 e está no modo de ponte para o hóspede? Eu não sei o que ele faria isso, mas parece provável
RobotHumans
Você já tentou as sugestões de Iniciando o apache falha (não foi possível vincular ao endereço 0.0.0.0:80) ? E inclua também a saída de grep -ri listen /etc/apachee sudo netstat -ntlp | grep 80.
precisa saber é o seguinte
2
grep -ri listen /etc/apache2saídas: etc / apache2 / httpd.conf: Ouça 80 /etc/apache2/httpd.conf: Ouça 443 /etc/apache2/ports.conf: Ouça 80 /etc/apache2/httpd.conf: Ouça 443 / etc / apache2 / httpd.conf: Listen 443 sudo netstat -ntlp | grep 80não produz nada.
Artilheiro Barnes

Respostas:

38

Verifique se você não está declarando Listen 80duas vezes em arquivos .conf.

Por exemplo, você pode incluí-lo na ports.confpousada sites-enabled/www.conf.

Para descobrir, use: grep -ri listen /etc/apache2

Mantenha Listen 80em apenas um lugar.

Ravi
fonte
19

Respondendo à maneira que resolvi esse problema. Pode ser útil para alguém no futuro.

Experimentar netstat -ltnp | grep :80

Isso retornaria algo como

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

Então corra

sudo kill -9 1047

Onde 1047 é o pid do programa em execução na porta 80. Você pode substituir o pid obtido de netstat

Ornitorrinco Anônimo
fonte
uau! ... e aqui estou 48 horas depois de enviar um ticket para o inmotionhosting e aguardar uma resposta. obrigado
Amjo 24/05
2
O que isto significa? Não estou recebendo um PID ou nome. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
Aaron Franke
@AaronFranke Você pode tentar executar este comando no Terminal depois de maximizar a janela?
Platypus anônimo
2
@AaronFranke executa-o com o sudo. Você pode não ter permissão para visualizar.
Advait S
13

Quando tive esse problema, o meu Apache não pôde ser inicializado porque eu tinha um site SSL que exigia que uma senha fosse inserida para o certificado.

Uma boa maneira de saber se esse é o seu caso é executar um ps -ef | grep apache: se isso retorna processos com aparência semelhante /bin/bash /usr/share/apache2/ask-for-passphrase mysite.com:443 RSA, está aguardando que uma senha seja inserida em um terminal que você nunca verá.

Primeiro, eu matei o processo travado (enviar um kill -HUPpara o ID do processo / usr / sbin / apache2 deve ser suficiente para matar os outros também, mas faça outro ps -ef | grep apachepara ter certeza).

Segui as instruções nesta postagem para criar um arquivo de senha SSL que não exigia que uma senha fosse inserida. Então service apache2 startfuncionou bem, e o Apache começou corretamente após uma reinicialização.

Brendan Quinn
fonte
11

Eu recebi esse erro em uma nova instalação ao iniciar o apache2 Ubuntu 12.10.

É um bug no apache2. É pendurado no fundo. Aqui está o meu passo a passo de onde os erros podem estar no software.

Aqui está o erro que recebi:

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]

Endereço já em uso? O que poderia estar usando isso? Confira:

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

Isso significa que o apache2 está impedindo que o apache2 seja iniciado. Bizarro. Isso confirmará:

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

Sim, neste caso o apache2 está sendo executado, eu estava tentando iniciar o apache2 uma segunda vez na mesma porta.

O que me confunde é que servicerelata que o apache2 NÃO está sendo executado:

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

E quando você consulta o status do apache2ctl, ele trava.

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

Portanto, o Ubuntu parece estar tendo problemas para gerenciar o apache2 na inicialização. Hora de parar o apache2:

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

Uma grande pista! Você tenta parar o apache2 e ele perdeu a identificação do processo! Portanto, o Ubuntu não pode parar o apache2 porque ele não sabe onde está!

Você pensaria que uma reinicialização iria corrigi-lo, mas não porque o apache2 inicia na inicialização e trava. O processo normal de inicialização do apache2 não está funcionando corretamente.

Então, como consertar isso?

Consegui consertar isso analisando a pssaída do comando. Observe que o pscomando nos diz que esse processo foi iniciado por "/etc/rc2.d/S91apache2 start".

Esse é o programa ofensivo que precisa de um chute rápido.

/etc/rc2.d/S91apache2é o link simbólico usado para iniciar o apache2 quando o computador é iniciado. Por alguma razão, parece estar iniciando o apache2 e depois trava. Então, teremos que dizer para não fazer isso.

Então vá dar uma olhada nisso /etc/rc2.d/S91apache2.

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

É um link simbólico que não queremos que esteja lá. Faça isso para impedir que o apache2 seja iniciado na inicialização:

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

Reinicie o computador para garantir que o apache2 não seja iniciado e travado. Tudo bem. Agora você poderia colocar o apache2 de volta do jeito que estava, mas isso faria com que falhasse novamente.

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

Em vez disso, inicie o apache2 assim:

sudo service apache2 start

E o apache2 está de volta e servindo páginas novamente. Parece haver alguns erros sérios no apache2 / Ubuntu 12.10 que fazem com que o apache2 seja iniciado e travado. Esta é uma solução alternativa, suponho que a correção seja obter versões mais recentes do apache2 e Ubuntu e esperar o melhor.

Eric Leschinski
fonte
Gostei de ler e usar suas dicas! Obrigado por escrever 'do jeito que você depurou'!
Ram
10

Eu tinha um servidor Nginx ouvindo no meu servidor AWS EC2, acho que ele foi configurado quando eu estava construindo o EC2; portanto, estava recebendo erro de endereço já em uso. Então, parei o serviço e iniciei o serviço Apache2:

sudo service nginx stop
sudo service apache2 start
Trapaceiro
fonte
Muito obrigado! Depois de todas as tentativas, isso funcionou para mim.
Vivek
4

Eu descobri isso. Eu tinha comandos Listen 80 duplicados nos meus httpd.conf e ports.conf

Além disso, ao copiar o arquivo de configuração para o servidor que está sendo virtualizado, deixei de notar que o diretório do log de erros havia sido alterado. Examinando esse log de erros, notei que o diretório do mime.typesarquivo de configuração estava incorreto no meu httpd.confarquivo. Atualizei esse parâmetro e o servidor foi iniciado corretamente.

Gunner Barnes
fonte
3
Eu também tinha duplicado Listen 80comandos, tanto o meu httpd.confeports.conf
Artilheiro Barnes
2

Isso significa que a porta 80 já está sendo usada, altere a porta do apache2 (que eu não recomendo) editando:

/etc/apache2/ports.conf

Ou feche o aplicativo em execução na porta 80:

netstat -antp | grep 80

Para encontrar o que está sendo executado na porta 80.

Dylan Dodds
fonte
netstat -antp | grep 80não produz nada também.
quer
você pode copiar e colar sua saída do netstat -antp | grep 80?
Dylan Dodds
Não há literalmente nenhuma saída.
Artilheiro Barnes
hmm isso é estranho, tente mudar a porta para 81 se não, não é a porta que está sendo bloqueada há um outro erro que você pode verificar erros apache2 em /var/log/apache2/error.log
Dylan Dodds
2

Apenas uma dica para quem talvez esteja executando o VirtualBox com redes NAT. Eu descobri que ter uma regra NAT entre meu convidado e host havia se configurado, ligando a porta

mschr
fonte
2

Não apenas menções duplicadas de

Listen 80

mas também mencione isso além de Listen 80

Include ports.conf
Scott Stensland
fonte