Nginx no se detiene y falta nginx.pid

33

Quiero detener Nginx pero falla así.

$ sudo service nginx stop
Stopping nginx:                                            [FAILED]

Y nginx.confeso define el lugar de nginx.pid tiene una línea.

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

Pero no hay nginx.piden el directorio /var/run/.

locate nginx.pid muestra esta salida

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

Pero después updatedbno hay coincidencia para la búsqueda. Estoy usando nginx / 1.4.4 in CentOS release 6.5 (Final).

¿Qué debo hacer para detener el demonio nginx?

Editar 2014/01/07

Esta es la salida de ps -ef | grep nginx, parece que nginx daemon todavía se está ejecutando.

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  

Y sudo service nginx restartda este error. Creo que nginxno puede comenzar porque el viejo todavía está vivo. Y /var/log/nginx/error.log-2014017contiene también este error.

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]
hierro y
fuente
3
El sistema no puede detener nginx si no se está ejecutando y, dado que no hay un archivo PID, sospecho que ya está detenido. Puedes consultar con ps -ef | grep nginxo sudo netstat -tlnp | grep nginx.
Ladadadada
1
Gracias por su consejo. Agregué el resultado del pscomando.
ironsand

Respuestas:

37

Recomendaré detener nginx matando primero su proceso maestro. El nginx no se apaga correctamente puede deberse a que no se puede detener con el script de inicio.

ps -ef | grep nginx

Esto le mostrará el PID del proceso maestro nginx. Como mencionaste anteriormente:

raíz 19506 1 0 2013? 00:00:00 nginx: proceso maestro / usr / sbin / nginx -c /etc/nginx/nginx.conf

Mátalo usando

matar -9 19506

Verifique una vez más si hay algún proceso nginx ejecutándose o si el puerto 80 está ocupado. Si ve que algún proceso está vinculado al puerto 80, identifique el PID y verifique si se puede eliminar.

ps -ef | grep nginx

netstat -tulpn | grep 80

asegúrese de que el sistema de archivos esté bien y que pueda leer / escribir en el sistema de archivos / var. Entonces comience nginx

servicio nginx start

sandeep.s85
fuente
¡Gracias! Después de matar el proceso maestro, tuve que matar también el proceso de trabajo nginx. Entonces finalmente puedo comenzar nginx daemon.
ironsand
¡Salvaste un alma ahora mismo Sandeep! Muchas gracias por documentar ..
Thale
Gracias @ sandeep.s85. Útil para mí también. Por interés, ¿qué causaría que faltara el archivo nginx.pid mientras se ejecuta nginx?
Codemonkey
Esto acaba de suceder nuevamente para mí, desearía saber qué lo causa.
Codemonkey
Mi proceso maestro nginx vuelve a la vida después de que lo mato.
WTIFS
11

Problema

Para mí, el nombre del archivo pid era diferente en esos dos archivos:

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

Esos dos necesitan coincidir.

Fijar:

Así que lo ajusté en /usr/lib/systemd/system/nginx.service y luego lo hice:

systemctl daemon-reload
systemctl start nginx

Entonces surgió correctamente.

Patrick Boos
fuente
3
¿Cómo? En Ubuntu /var/run/hay un enlace simbólico de/run/
Z. Zlatev
Sí, eso no es una solución en absoluto. Pero en mi caso todo es /run/nginx.pid.
danger89
Mi nginx.conf tenía registros pid / nginx.pid, cambió a /run/nginx.pid y se solucionó, ¡gracias Patrick!
phpguru
9

Tuve este problema, y ​​correr ps -ef | grep nginxme mostraría trabajadores que seguirían girando, a pesar de matar el proceso maestro como lo sugiere la respuesta aceptada:

[~]# 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    

Entonces, mi solución para solucionarlo fue simplemente esto:pkill nginx && service nginx restart

amurrell
fuente
1

Mi problema era que había pidespecificado en dos archivos conf diferentes. Después de eliminar una referencia, luego eliminé el .pidarchivo y comencé a nginx nuevamente, comenzó a comportarse normalmente.

matthewdaniel
fuente
Sí, el PID se define en /usr/lib/systemd/system/nginx-debug.service y /etc/nginx/nginx.conf
edmondscommerce
0

Esto parece indicar que nginx se bloquea de inmediato, si se había iniciado antes. ¿Ha verificado el contenido de /var/log/nginx*para ver qué está haciendo el proceso?

EDITAR: Además, si nos dice su sistema operativo y la versión de nginx, podemos darle respuestas más detalladas.

zymhan
fuente
0

Necesitaría más información para estar seguro, pero supongo que ya tiene otro servidor web ejecutándose en lugar de la instancia de ngnix que desea, por lo que debe encontrarla: el error dice que el puerto 80 está en uso, pero no qué

Intente netstat -tulpn: está buscando una entrada en la dirección local que termine con: 80: esto también le dará el nombre del programa y el PID para que pueda identificarlo. Aquí está el mío: estoy ejecutando lighttpd y se muestra en la tercera línea.

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

Apague el otro servidor web correctamente (ya que si se está originando en el arranque, una 'muerte' normal puede no funcionar) e intente iniciar ngnix. Si ese es el caso, puede / debe editar sus scripts de inicio para detener el inicio del otro servidor web, o ajustar su configuración en otra potencia.

Journeyman Geek
fuente
Gracias por tu ayuda. netstat -tulpnmuestra tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19507/nginx. Entonces de alguna manera nginx ocupó ese puerto. Pero como dijo sandeep, maté el proceso nginx y luego funciona. ¡Aprecio tu ayuda!
ironsand
0

Tuve un problema similar con Ubuntu 10.10 y una versión compilada de nginx que se ejecuta en / opt / nginx / sbin.

compruebe los archivos /opt/nginx/conf/nginx.conf y /etc/nginx/nginx.conf y verifique que coincidan.

Ajuste el archivo de inicio /etc/init.d/nginx para que coincida con la prueba de ubicación 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
fuente
0

Para detener nginx, consulte el manual de cómo hacerlo man nginx.

La forma predeterminada debería ser utilizar la señal de parada con nginx -s stop.

Debería ser así de simple realmente. Sus opciones son:

stop, quit, reopen, reload.
prosti
fuente