O Nginx falha ao parar e o nginx.pid está ausente

33

Eu quero parar o Nginx, mas ele falha assim.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

E nginx.confisso define o lugar de nginx.pid tem uma linha.

# /etc/nginx/nginx.conf
pid        /var/run/nginx.pid;

Mas não há nginx.pidno diretório /var/run/.

locate nginx.pid mostra esta saída.

/var/run/nginx.pid 
/var/run/nginx.pid.oldbin

Mas depois updatedbnão há correspondência para a pesquisa. Estou usando o nginx / 1.4.4 in CentOS release 6.5 (Final).

O que devo fazer para parar o daemon nginx?

Editar 07/01/2014

Isso é resultado ps -ef | grep nginx, parece que o daemon nginx ainda está em execução.

ironsand 17065 16933  0 15:55 pts/0    00:00:00 grep --color nginx
root     19506     1  0  2013 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
ironsand 19507 19506  0  2013 ?        00:00:25 nginx: worker process  

E sudo service nginx restartdá esse erro. Eu acho que nginxnão começa porque o antigo ainda está vivo. E /var/log/nginx/error.log-2014017contém também esse erro.

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:80 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:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
                                                           [FAILED]
ferros e areias
fonte
3
O sistema não pode parar o nginx se não estiver em execução e, como não há arquivo PID, suspeito que já esteja parado. Você pode verificar com ps -ef | grep nginxou sudo netstat -tlnp | grep nginx.
Ladadadada
1
Obrigado pelo teu conselho. Eu adicionei resultado do pscomando.
ironsand

Respostas:

37

Eu recomendarei parar o nginx matando o processo mestre primeiro. O nginx não está desligado corretamente pode ser por isso não pode ser parado usando o script init.

ps -ef | grep nginx

Isso mostrará o processo PID do nginx master. Como você mencionou acima:

raiz 19506 1 0 2013? 00:00:00 nginx: processo mestre / usr / sbin / nginx -c /etc/nginx/nginx.conf

Mate-o usando

kill -9 19506

Verifique mais uma vez se existe algum processo nginx em execução ou se a porta 80 está ocupada. Se você vir algum processo vinculado à porta 80, identifique o PID e verifique se ele pode ser eliminado.

ps -ef | grep nginx

netstat -tulpn | grep 80

verifique se o sistema de arquivos está correto e se você pode ler / gravar no sistema de arquivos / var. Então inicie o nginx

serviço nginx start

sandeep.s85
fonte
Obrigado! Depois de matar o processo mestre, tive que matar também o processo do trabalhador nginx. Então eu posso finalmente iniciar o daemon nginx.
ironsand
Você salvou uma alma agora mesmo Sandeep! Muito obrigado por documentar ..
Thale
Obrigado @ sandeep.s85. Útil para mim também. Fora de interesse, o que faria com que o arquivo nginx.pid estivesse ausente enquanto o nginx estivesse em execução?
Codemonkey 02/02
Isso acabou de acontecer novamente para mim, eu gostaria de saber o que causa isso.
Codemonkey 22/02
Meu processo mestre do nginx volta a funcionar depois que eu o mato.
WTIFS
11

Problema

Para mim, o nome do arquivo pid era diferente nesses dois arquivos:

  • /usr/lib/systemd/system/nginx.service
    • pid /var/run/nginx.pid;
  • /etc/nginx/nginx.conf
    • PIDFile=/run/nginx.pid

Esses dois precisam combinar.

Consertar:

Então, ajustei-o em /usr/lib/systemd/system/nginx.service e depois fiz:

systemctl daemon-reload
systemctl start nginx

Então surgiu corretamente.

Patrick Boos
fonte
3
Por quê? No Ubuntu /var/run/existe um link simbólico de/run/
Z. Zlatev 29/10
Sim, para que não seja uma solução. Mas no meu caso, tudo é /run/nginx.pid.
precisa saber é o seguinte
Meu nginx.conf tinha o pid logs / nginx.pid - alterado para /run/nginx.pid e foi corrigido, obrigado Patrick!
Phpuru
9

Eu tinha esse problema e a execução ps -ef | grep nginxme mostraria trabalhadores que continuariam girando, apesar de matar o processo principal, conforme sugerido pela resposta aceita:

[~]# ps -ef | grep nginx
nginx    10730     1  0 Sep14 ?        00:00:16 nginx: cache manager process            
nginx    18469     1  0 Oct09 ?        00:11:02 nginx: worker process                   
nginx    25779     1  0 Oct13 ?        00:01:31 nginx: worker process                   
nginx    26458     1  0 15:45 ?        00:00:00 nginx: worker process    

Então, minha solução para corrigi-lo foi simplesmente esta:pkill nginx && service nginx restart

amurrell
fonte
1

Meu problema era que eu havia pidespecificado em dois arquivos conf diferentes. Depois que removi uma referência, excluí o .pidarquivo e iniciei o nginx novamente, que começou a se comportar normalmente.

matthewdaniel
fonte
Yep este, o PID é definido em /usr/lib/systemd/system/nginx-debug.service e /etc/nginx/nginx.conf
edmondscommerce
0

Isso parece indicar que o nginx está travando imediatamente, se tivesse sido iniciado anteriormente. Você verificou o conteúdo /var/log/nginx*para ver o que o processo está fazendo?

EDIT: Além disso, se você nos informar seu sistema operacional e versão do nginx, podemos fornecer respostas mais detalhadas.

zymhan
fonte
0

Eu precisaria de mais informações para ter certeza, mas acho que você já tem outro servidor Web em execução, em vez da instância do ngnix que deseja, portanto, é necessário encontrá-lo - o erro diz que a porta 80 está em uso, mas não por o que

Tente netstat -tulpn- Você está procurando uma entrada no endereço local que termine com: 80 - isso também fornecerá o nome do programa e o PID para que você possa identificá-lo. Aqui está o meu - eu estou executando o lighttpd e é mostrado na terceira linha.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      923/php-fpm.conf)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      972/lighttpd
tcp        0      0 0.0.0.0:6901            0.0.0.0:*               LISTEN      4684/rtorrent
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      720/sshd
udp        0      0 0.0.0.0:6881            0.0.0.0:*                           4684/rtorrent

Encerre o outro servidor da Web corretamente (já que, se for iniciado, um 'kill' normal pode não funcionar) e tente iniciar o ngnix. Se for esse o caso, você pode / deve editar seus scripts init para interromper a inicialização do outro servidor da Web ou ajustar sua configuração em outro poder.

Journeyman Geek
fonte
Obrigado pela ajuda. netstat -tulpnmostra tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Então, de alguma forma, o nginx ocupou essa porta. Mas como o sandeep disse, eu matei o processo nginx e ele funciona. Eu aprecio sua ajuda!
ironsand
0

Eu tive um problema semelhante com o Ubuntu 10.10 e uma versão compilada do nginx em execução em / opt / nginx / sbin.

verifique os arquivos /opt/nginx/conf/nginx.conf e /etc/nginx/nginx.conf e verifique se eles correspondem.

Ajuste o arquivo de inicialização /etc/init.d/nginx para corresponder ao teste de localização nginx.pid usando:

sudo /etc/init.d/nginx configtest # should show no failures
sudo /etc/init.d/nginx start      # should show starting
sudo /etc/init.d/nginx status     # should show running
sudo /etc/init.d/nginx stop       # should show stopping -- (wait for a few)
sudo /etc/init.d/nginx status     # should show can not access PID file for nginx
sudo netstat -tap  # should not show nginx program running with open local address
Pete Williams
fonte
0

Para parar o nginx, verifique o manual de como fazê-lo man nginx.

A maneira padrão deve ser usar o sinal de parada com nginx -s stop.

Na verdade, deveria ser tão simples assim. Suas opções são:

stop, quit, reopen, reload.
prosti
fonte