nginx - nginx: [emerg] bind () para [::]: 80 falhou (98: endereço já em uso)

248

De repente, estou recebendo o erro nginx abaixo

 * Restarting nginx
 * Stopping nginx nginx
   ...done.
 * Starting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
   ...done.
   ...done.

Se eu correr

lsof -i :80 or sudo fuser -k 80/tcp 

Eu não recebo nada. Nada na porta 80

Então eu corro o abaixo:

sudo netstat -pan | grep ":80"
tcp        0      0 127.0.0.1:8070          0.0.0.0:*               LISTEN      15056/uwsgi     
tcp        0      0 10.170.35.97:39567      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39564      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39584      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39566      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39571      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39580      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39562      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39582      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39586      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39575      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39579      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39560      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39587      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39591      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39589      10.158.58.13:8080       TIME_WAIT   - 

Estou perplexo. Como depuro isso?

Estou usando o uwsgi com uma passagem de proxy na porta 8070. o uwsgi está em execução. Nginx não é. Estou usando o ubuntu 12.4

Abaixo estão as partes relevantes do meu arquivo conf nginx

upstream uwsgi_frontend {
          server 127.0.0.1:8070;
        }
server {
listen 80;
        server_name 127.0.0.1;
        location = /favicon.ico {
                  log_not_found off;
                }



                location / {
                       include uwsgi_params;
                       uwsgi_buffering off;

                       uwsgi_pass 127.0.0.1:8070;
                 }
        }

Aqui está como eu instalo o nginx no ubuntu 12.04

nginx=stable;add-apt-repository ppa:nginx/$nginx;
apt-get update
apt get install nginx-full
Tampa
fonte
19
Encontrei o problema que nunca tive antes. Eu tive que excluir / etc / nginx / sites-available / default. Então funcionou. Meu conf estava em / etc / nginx / default
Tampa
Eu estava executando o Nginx + Varnish e tive esse erro. A solução foi parar os dois por cima, depois iniciar o nginx primeiro e depois verniz.
Ben
você pode tentar parar o serviço nomeado.
Amal
você removeu seu padrão dos sites ativados?
Wolfpack'08
Eu tentei todas as soluções aqui. Verifiquei todas as portas em uso (estava sendo usada pelo próprio NGINX), então eu matei a porta e a reiniciei. Funcionou como um encanto.
gavin

Respostas:

202

[::]:80 é um endereço ipv6.

Este erro pode ser causado se você tiver uma configuração nginx que esteja escutando na porta 80 e também na porta [::]:80.

Eu tinha o seguinte no meu arquivo disponível em sites padrão:

listen 80;
listen [::]:80 default_server;

Você pode corrigir isso adicionando ipv6only=ono [::]:80seguinte:

listen 80;
listen [::]:80 ipv6only=on default_server;

Para mais informações, veja:

http://forum.linode.com/viewtopic.php?t=8580

http://wiki.nginx.org/HttpCoreModule#listen

Nathan
fonte
11
Você também pode corrigi-lo removendo o listen 80; porque ouça [::]: 80 ouvintes do IPv4 e IPv6. Cuidado, porém, porque alguns sistemas (como o FreeBSD) separam os soquetes IPv4 e IPv6 e, em seguida, não funcionam, mas para Linux, tudo deve estar bem. wiki.nginx.org/HttpCoreModule#listen
gitaarik 13/13
4
Obrigado por se aprofundar nisso e fornecer uma explicação do motivo pelo qual a exclusão /etc/nginx/sites-available/defaultajuda no erro acima.
Oliver
1
Mesmo quando eu comento a linha ipv6, ainda recebo o mesmo erro ao tentar sudo service nginx restart. Quando faço isso netstat -tulpn |grep 80, recebo apenas uma vez o processo nginx (0.0.0.0:80). Alguma idéia de por que não será reiniciado?
Roman
Eu segundo o @rednaw disse, mas em vez de remover o ouvir, você pode simplesmente comentar it out
d4nyll
A configuração ipv6only=oncorrigiu o problema, mas o nginx deve realmente detectar que está tentando se conectar à mesma interface: porta duas vezes.
Dan Dascalescu
246

Corrigi isso executando sudo apachectl stop- verifica-se que o apache estava sendo executado em segundo plano e impediu que o nginx iniciasse na porta desejada.

No ubuntu run sudo /etc/init.d/apache2 stop

lfender6445
fonte
8
Use sudo /etc/init.d/apache2 stoppara parar o apache no Ubuntu 14.04
Footniko 15/10
3
O motivo é que você não pode ter dois servidores Web ouvindo a mesma porta. Escolha um e, se necessário, proxy. Por exemplo, use nginx, mas para certas solicitações (como phparquivos), proxy para a porta Apache.
d4nyll
O mesmo aqui em uma nova instalação do debian 9.
Jirarium
Obrigado. Mas alguma idéia de por que começou de repente? Não toquei no servidor por uma semana, mas ele começou na noite passada.
Ajay Singh
1
Obrigado pela sua solução. Funciona para mim, eu uso o Google Cloud Platform
congle em
92

Meu caso é diferente, tive que matar o Nginx para reiniciá-lo.

Ao invés de

sudo systemctl restart nginx

Eu tive que usar:

sudo pkill -f nginx & wait $!
sudo systemctl start nginx
datdinhquoc
fonte
1
Eu estava usando o 404 Not Found e usei sua sugestão, agora resolvi meu problema. Obrigado.
Bay
3
Isso funcionou para mim. Nada mais fez. Não tenho certeza de qual processo inicia quando o sistema é reiniciado, mas apenas adicionarei isso na minha rotina de reinicialização nginx. Obrigado!
Khom Nazid 9/02/19
38

Encontrei o problema que nunca tive antes.

Eu apenas tive que excluir /etc/nginx/sites-available/default. Então funcionou.

Meu conf estava dentro /etc/nginx/default.

Tampa
fonte
2
+1 Essa solução funcionou para mim, mas achei que deveria haver algo padrão que realmente está causando o problema. Por isso, me aprofundou um pouco mais e forneci uma resposta com mais informações.
26413 Nathan
11
Eu diria que excluir o modelo de configuração do site padrão não é a melhor solução - comentar a linha que contém listen 80;o mesmo modelo já resolve o problema e corretamente. Seu truque funciona, mas não é o que eu gostaria que os futuros leitores de sua pergunta fizessem. Por isso, sugiro que você selecione a resposta de @ Nathan como a resposta correta.
Oliver
4
Tive o mesmo problema após a execução apt-get dist-upgrade, que atualizou o pacote nginx, que criou um link /etc/nginx/sites-enabledpara /etc/nginx/sites-available/default. O nginx estava tentando carregar essa configuração padrão, que escuta a porta 80 pelo IPv6, e também carregava minhas configurações reais de leitura. A remoção desse link simbólico corrigiu o problema.
Dan Dascalescu
15
VOCÊ NÃO PRECISA EXCLUIR /etc/nginx/sites-available/default , basta remover o link simbólico para elesudo rm /etc/nginx/sites-enabled/default
#
Eu experimentei esse problema ao tentar executar nginxna porta 8080 e varnishna porta 80 e semelhante a esta resposta, encontrei o problema em uma nginxconfiguração padrão ainda ouvindo na porta 80, mesmo que minhas sites-availableconfigurações tenham escutado na porta 8080. Isso estava localizado em/etc/nginx/conf.d/default
zigojacko
24

Eu também estava recebendo o mesmo erro.

nginx: [emerg] bind () a [::]: 80 falhou (98: endereço já em uso)

e quando eu digitei o host local no navegador, estava recebendo

Funciona!

Essa é a página da web padrão pra esse servidor.

O software do servidor da web está sendo executado, mas nenhum conteúdo foi adicionado ainda. em vez da página de boas-vindas do nginx, o apache2 está sendo executado na mesma porta,

  1. encontre o arquivo apache2 ports.conf

    sudo /etc/apache2/ports.conf
    
  2. mudar a porta de outra forma 80, eu faço isso como70

  3. Salve o arquivo

  4. reinicie seu sistema

funcionará para você também, se você digitar o host local no navegador, receberá a página de boas-vindas do nginx

SAURABH
fonte
1
Você pode simplesmente não querer executar o Apache2 e o nginx ao mesmo tempo. Eu descobri que a instalação do Apache inicia o serviço. Então, eu emiti "sudo /etc/init.d/apache2 stop" e pude iniciar o nginx normalmente. Isso também evita que você reinicie o sistema.
22713 Chris Westin
1
Você está certo que a exclusão do link sym / etc / nginx / sites-enabled / default impede que ele escute em duas portas. Acho realmente um pouco chato que todo tutorial sobre o nginx comece sugerindo que todos excluam o link "padrão", mas acho que esse é um tópico diferente.
eschipul
@IgorGanapolsky muda o Apache para uma porta diferente?
Menashe
10

tente fazer este comando

sudo fuser -k 443/tcp
service nginx restart
jack
fonte
8

Meu problema era que eu tinha diretrizes de escuta sobrepostas. Consegui descobrir diretivas sobrepostas executando

grep -r listen /etc/nginx/*

Dois arquivos estavam escutando na mesma porta:

/etc/nginx/conf.d/default.conf:           listen 80;  
/etc/nginx/sites-enabled/default.conf:    listen 80;
Preto
fonte
3
Essa é uma maneira muito elegante de verificar as coisas: grep -r listen /etc/nginx/*obrigado por compartilhar!
Newskooler
6

Eu tive o mesmo problema no letsencrypt (certbot) e nginx,

ref: https://github.com/certbot/certbot/issues/5486

este erro ainda não tem uma solução

então, um cron mudou para renovação (colocando uma recarga após renovação) (usando sugestão do certbot)

-- in /etc/cron.d/certbot
from
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew 
to
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook "service nginx stop" --post-hook "service nginx start"

logs (curtos):

-- in /var/log/syslog
Jun 10 00:14:25 localhost systemd[1]: Starting Certbot...
Jun 10 00:14:38 localhost certbot[22222]: nginx: [error] open() "/run/nginx.pid$
Jun 10 00:14:41 localhost certbot[22222]: Hook command "nginx" returned error c$
Jun 10 00:14:41 localhost certbot[22222]: Error output from nginx:
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] still could not bind()
Jun 10 00:14:41 localhost systemd[1]: Started Certbot.


-- in /var/log/nginx/error.log
2018/06/10 00:14:27 [notice] 22233#22233: signal process started
2018/06/10 00:14:31 [notice] 22237#22237: signal process started
2018/06/10 00:14:33 [notice] 22240#22240: signal process started
2018/06/10 00:14:34 [notice] 22245#22245: signal process started
2018/06/10 00:14:38 [notice] 22255#22255: signal process started
2018/06/10 00:14:38 [error] 22255#22255: open() "/run/nginx.pid" failed (2: No $
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: still could not bind()
Wagner Pereira
fonte
1
super aleatório, mas era nisso que eu acreditava. obrigado por postar isso. meu erro parecia se manifestar devido a uma entrada de domínio desatualizada que estava tentando renovar, mas não foi possível porque eu não controlava mais o domínio.
w--
Acho que esse provavelmente é o meu problema também. mas preciso esperar para dar uma olhada #
Oscar Zhou1989 #
2

Primeiro, mude a porta de escuta apache 80 para 8080 apache em /etc/apache2/ports.conf include

Listen 1.2.3.4:80 to 1.2.3.4:8080
sudo service apache2 restart 

ou

sudo service httpd restart    // in case of centos

adicione nginx como servidor proxy reverso que escutará a porta apache

server {
 listen   1.2.3.4:80;
 server_name  some.com;

 access_log  /var/log/nginx/something-access.log;

 location / {
  proxy_pass http://localhost:8080;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }


location ~* ^.+\.(jpg|js|jpeg|png)$ {
   root /usr/share/nginx/html/;
}

location /404.html {
  root /usr/share/nginx/html/40x.html;
}

error_page 404 /404.html;
    location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
}

# put code for static content like js/css/images/fonts
}

Após as alterações, reinicie o servidor nginx

sudo service nginx restart

Agora todo o tráfego será tratado pelo servidor nginx e enviará toda solicitação dinâmica ao apache, e o conteúdo estático será atendido pelo servidor nginx.

Para configuração avançada como cache:

https://www.linode.com/docs/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/#basic-nginx-caching

Kamal Kumar
fonte
1

Eu encontrei um problema semelhante. o log é como abaixo

2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: still could not bind()
2018/10/31 12:54:23 [alert] 127997#127997: unlink() "/run/nginx.pid" failed (2: No such file or directory)
2018/10/31 22:40:48 [info] 36948#36948: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68
2018/10/31 22:50:40 [emerg] 37638#37638: duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default:18
2018/10/31 22:51:33 [info] 37787#37787: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68

O último [emerg]mostra o duplicate listen options for [::]:80que significa que há mais de um arquivo de bloco nginx contendo [::]:80.

Minha solução é remover uma das [::]:80configurações

PS: você provavelmente tem um arquivo de bloqueio padrão. Meu conselho é manter esse arquivo como servidor padrão para a porta 80. e remover [::]:80de outros arquivos de bloco

Oscar Zhou1989
fonte
1

Uso o supervisor para executar o Nginx e o Gunicorn lado a lado em um contêiner do Docker.

Esta foi a configuração usada para o supervisor:

[supervisord]
nodaemon=true

[program:gunicorn]
command = /project/start.sh
user = www-data


[program:nginx]
command=/usr/sbin/nginx

O problema foi como lancei o Ngnix: por padrão, ele é executado em primeiro plano. Isso faz com que o supervisor tente novamente executar outra instância do Nginx.

Ao adicionar -g 'daemon off;'à linha de comando, o Nginx ficou em primeiro plano, o supervisor parou de tentar executar outra instância.

Sebastien DA ROCHA
fonte
1

No meu caso, um dos serviços Apache, Apache2 ou Nginx já estava em execução e, por isso, não consegui iniciar o outro serviço.

Rishikesh Chandra
fonte
0

Eu tinha vários arquivos * .save (despejos de emergência do nano) de diferentes arquivos de configuração do NGINX no meu diretório de sites disponíveis. Depois de excluir esses arquivos .save, o NGINX foi reiniciado corretamente. Presumi que eles eram inofensivos, pois não havia links simbólicos correspondentes, mas acho que estava errado.

Allen
fonte
0

Para seguir para as respostas @ lfender6445 e @SAURABH -

Meu problema também foi o fato de que, após a atualização para o Vagrant 2.2.2, o Apache2 estava sendo executado como servidor da web quando o convidado foi inicializado. No passado, eu só tinha o nginx como servidor da web.

vagrant ssh na caixa e execute o seguinte comando para desativar a inicialização do Apache2 sempre que a caixa de convidado for inicializada:

sudo update-rc.d -f apache2 remove

Sair ssh, parada vagrant, vagrant up. Problema resolvido.

Lance Cleveland
fonte
0

Se o problema persistir após tentar qualquer uma das soluções acima, reinicie o servidor uma vez. Funcionou para mim :)

DJ
fonte
Sim, seria. Mas matar o processo nginx e reiniciar apenas o nginx também funciona. Essa é a resposta de @datdinhquoc.
Khom Nazid 9/02/19
0

No meu caso, o culpado acabou sendo um bloco de servidor que continha:

        listen  127.0.0.1:80;
        listen  [::1]:80 ipv6only=on;
        server_name  localhost;

No Linux, um soquete que escuta um IP específico (por exemplo [::1]:80) entra em conflito com um soquete que escuta na mesma porta, mas qualquer IP (ou seja [::]:80). Normalmente, o nginx lida com esse problema de forma transparente, usando um único soquete nos bastidores. No entanto, a especificação explícita ipv6only(ou certas outras opções) da diretiva listen força o nginx a (tentar) criar um soquete separado para ela, resultando no Address already in useerro.

Como ipv6only=oné o padrão de qualquer maneira (desde a versão 1.3.4), a correção foi simplesmente remover essa opção desta diretiva e garantir que ipv6onlynão fosse usada em nenhum outro lugar da minha configuração.

Matthijs
fonte
0

Eu tenho o mesmo problema, mas vejo a porta 80 ouvida pelo Nginx:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      9730/nginx 

Mas quando tento reiniciá-lo, tenho o erro:

    service nginx restart
Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()

Meu problema estava no arquivo de configuração, estou definido como arquivo PID e parece que o sistema não pode capturá-lo corretamente:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

Quando o removi, funcionou.

zombi_man
fonte