¿Cómo reinicio nginx solo después de que la prueba de configuración fue exitosa en Ubuntu?

111

Cuando reinicio el servicio nginx en una línea de comando en un servidor Ubuntu, el servicio falla cuando un archivo de configuración nginx tiene errores. En un servidor de varios sitios, esto elimina todos los sitios, incluso los que no tienen errores de configuración.

Para evitar esto, primero ejecuto la prueba de configuración de nginx:

nginx -t

Después de que la prueba se ejecutó correctamente, pude reiniciar el servicio:

/etc/init.d/nginx restart

O solo vuelva a cargar las configuraciones del sitio nignx sin reiniciar:

nginx -s reload

¿Hay alguna manera de combinar esos dos comandos donde el comando de reinicio está condicionado al resultado de la prueba de configuración?

No pude encontrar esto en línea y la documentación oficial sobre esto es bastante básica. No conozco bien Linux, así que no sé si lo que estoy buscando está justo frente a mí o no es posible en absoluto.

Estoy usando nginx v1.1.19.

ene
fuente
¿Qué pasa con un pequeño script de shell que verifica el estado de retorno de nginx -t (con $?) Y luego se reinicia según el estado de retorno?
TeTeT

Respuestas:

49

En realidad, hasta donde yo sé, nginx mostraría un mensaje vacío y en realidad no se reiniciaría si la configuración es mala.

La única forma de arruinarlo es haciendo una parada de nginx y luego comenzar de nuevo. Tendría éxito en detenerse, pero no comenzaría.

Mohammad AbuShady
fuente
1
¿De qué versión de nginx estás hablando? Estoy trabajando con v 1.1.19 e intentará reiniciarse independientemente de los errores en los archivos de configuración. Me notificará que hay un problema, pero para entonces ya es demasiado tarde
enero
5
Ok, acabo de probarlo, mi computadora portátil tiene nginx 1.2 y funcionó como lo describí, mi VPS tiene 1.1.19 como el suyo, e hizo lo mismo que describió en su pregunta. Así que supongo que esto se manejó en 1.2
Mohammad AbuShady
¡Excelente! Gracias por averiguarlo por mí. Mantendré la pregunta abierta un poco más para ver si nadie tiene una respuesta para nginx <v1.2
enero
1
Supongo que tendré que actualizar entonces :-) Necesitaba una excusa de todos modos
enero
1
service nginx reloadno muestra nada si la configuración se cargó correctamente o no, por lo que es inútil si sospecha que la configuración podría ser incorrecta. service nginx restartdetendrá el servidor si la configuración tiene un error!
Dan Dascalescu
80

A partir de nginx 1.8.0, la solución correcta es

sudo nginx -t && sudo service nginx reload

Tenga en cuenta que debido a un error, configtestsiempre devuelve un código de salida cero incluso si el archivo de configuración tiene un error.

Dan Dascalescu
fuente
3
nginx -t && sudo nginx -s reload
MechanisM
5
@MechanisM: nginx -tsin sudo es casi seguro que fallará debido a errores de permiso.
Dan Dascalescu
Quería mostrar principalmente la última parte para recargar. En mi caso, tengo nginx compilado personalizado y ni siquiera tengo scripts en /etc/init.d y así sucesivamente, así que en mi caso "service nginx reload" no hará nada
MechanisM
39

Utilizo el siguiente comando para recargar Nginx (versión 1.5.9) solo si una prueba de configuración fue exitosa:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Si necesita hacer esto con frecuencia, es posible que desee utilizar un alias. Yo uso lo siguiente:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

El truco aquí lo hace "&&", que solo ejecuta el segundo comando si el primero tuvo éxito. Puede ver aquí una explicación más detallada del uso del operador "&&".

Puede utilizar "reiniciar" en lugar de "recargar" si realmente desea reiniciar el servidor.

Mauricio Sánchez
fuente
Tenga cuidado con nginx 1.4.2 que encontré pkill -1 nginx(efectivamente, lo que hace mi recarga init.d / nginx) NO se recarga si la configuración falla y devuelve correctamente. Verifique sus propias versiones.
KCD
2
Esto no me funciona. Ambos comandos se ejecutan incluso si la prueba falla.
Mario Campa
2
configtest siempre devuelve un código de salida cero , al menos en nginx 1.8.0. Úselo en su nginx -tlugar.
Dan Dascalescu
8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

y luego use los comandos "nginx.reload", etc.

Mecanismo
fuente
6

Puedes recargar usando /etc/init.d/nginx reloadysudo service nginx reload

Si nginx -tarroja algún error, no se recargará

así que usa && para ejecutar ambos al mismo tiempo

me gusta

nginx -t && /etc/init.d/nginx reload

gokul kandasamy
fuente
Déjame enseñarte algo sobre bash. && no run both at a same timeEjecuta el comando de la derecha SI el comando de la izquierda devuelve un código de salida de 0. Si nginx -tarroja un error, el código de salida no será 0, por lo que el segundo comando no se ejecutará. De nginx -s reloadtodos modos
miknik
@miknik Creo que eso es lo que quiso decir, simplemente no salió bien. Dice If nginx -t throws some error then it won't reload. La declaración run both at a same timetambién podría interpretarse como un solo comando o una línea. No lo interpreto necesariamente diciendo en este caso in parallel.
Matt
2

Puede usar señales para controlar nginx.

De acuerdo con la documentación, debe enviar la señal HUP al proceso maestro de nginx.

HUP: cambiar la configuración, mantenerse al día con una zona horaria modificada (solo para FreeBSD y Linux), iniciar nuevos procesos de trabajo con una nueva configuración, cierre elegante de los procesos de trabajo antiguos

Consulte la documentación aquí: http://nginx.org/en/docs/control.html

Puede enviar la señal HUP al PID del proceso maestro nginx de esta manera:

kill -HUP $( cat /var/run/nginx.pid )

El comando anterior lee el PID nginx de /var/run/nginx.pid. Por defecto, se escribe el pid de nginx, /usr/local/nginx/logs/nginx.pidpero eso se puede anular en config. Verifique su nginx.configpara ver dónde guarda el PID.

hcristea
fuente
1

Al menos en Debian, el script de inicio de nginx tiene una función de recarga que:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Parece que todo lo que necesitas hacer es llamar en service nginx reloadlugar de restartdesde que llama test_nginx_config.

Daenney
fuente
service nginx reloadno dará ningún tipo de indicación sobre si la configuración se probó bien o no, o si se recargó o no.
Dan Dascalescu
¿Qué hace test_nginx_configentonces en ese caso?
Daenney
1
Creo que ambos tienen razón. service nginx reloades suficiente en la línea de comandos, sin embargo, a veces es posible que desee capturar la salida de stderr y devolverla a un script para solucionar problemas. nginx -tle diría qué archivo tenía el parámetro no válido y en qué línea.
anastymous