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

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


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


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

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.


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


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

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;

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()

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


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


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.


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.


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.


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.


0

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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.