¿Cómo puedo iniciar nginx a través del sistema de arranque?

9

Antecedentes:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

He creado nginx, y me gustaría utilizar el sistema de arranque para iniciarlo:

nginx script de inicio desde el sitio:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

Recibo un "trabajo desconocido" cuando intento usar initctl para ejecutarlo, lo que acabo de enterar aparentemente significa que hay un error (¿qué hay de malo en "Error" para describir los errores?)

Alguien me puede apuntar en la dirección correcta ? He leído la documentación, tal como está, y parece un poco escasa para un reemplazo de inicio de SysV ... pero lo que sea que necesite agregar este trabajo a la lista, ejecutarlo y continuar con lo que queda de mi vida. .. ¿Algun consejo?

EDITAR: initctl version init (upstart 0.6.5)

chiggsy
fuente
1
Un comentario sobre 'trabajo desconocido' vs 'Error'. Solo estás buscando en el lugar equivocado. Initctl no lee el archivo de configuración, solo le pide a Upstart que cargue un trabajo conocido, y upstart no conoce este trabajo cuando emite el comando initctl. El error ocurrió antes cuando Upstart intentó leer el archivo de trabajo. Debería haber un mensaje de error en el registro del sistema (/ var / log / syslog, / var / log / messages o donde el sistema almacene estos registros)
Jacek Konieczny
Por cierto, resulta que en / sbin hay comandos de inicio y detención para trabajos de arranque. Trabajaron para mi. Ahora, se vinculan a initctl, así que no estoy seguro de por qué funcionan, pero lo hacen.
chiggsy

Respuestas:

3

No puede tener varias stop ondirectivas en una descripción de trabajo de inicio para Upstart> = 0.5.

Y console ownerprobablemente no sea lo que desea (esto hace que nginx sea el propietario de la consola del sistema).

Tratar:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn
Jacek Konieczny
fuente
Trabajo aún desconocido, por desgracia. ¿De dónde sacas esta información? ¿Hombre? Información? ¿en línea? ¿Dónde se documenta 0.6.5?
chiggsy
un poco trabajado .. thnx
chiggsy
Sí, es difícil encontrar la documentación actual de Upstart, al menos en la web. Pero la página del manual es bastante buena. Prueba: man 5 init
Jacek Konieczny
1
Esta no es la forma correcta de ejecutar nginx en servidores de producción. La daemon offopción es solo para desarrollo.
PhilT
16

Terminé aquí más de una vez, así que pensé en proporcionar una respuesta actualizada basada en mi propia experiencia después de usar las respuestas aquí. Gracias especialmente a @danorton y @orj por sus respuestas.

Este script ha sido probado en Upstart 1.5 que se ejecuta en Ubuntu 12.04 con Nginx 1.0.11 y Passenger 3.0.11. Si no está utilizando Passenger, es posible que deba jugar con la post-stoplínea. Consulte el libro de cocina Upstart.

En un espacio vacío, /etc/init/nginx.confagregue las siguientes líneas (puede eliminar los comentarios si lo desea):

description "nginx http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid

# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork

# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t

# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT

# Start Nginx
exec $DAEMON

Tomé el script Upstart del Nginx Wiki y lo ajusté porque no se necesitan varias líneas, causan confusión o no funcionan.

Es posible que deba modificar las líneas env DAEMONy env PIDdependiendo de dónde haya instalado nginx y esté escribiendo el PID. El PID se puede configurar en nginx.

Intenté todas las formas de expect. Solo expect forkparece funcionar. Con Passenger nginx crea 61 tenedores. Upstart requiere 0, 1 o 2. Como otros han insinuado, Upstart rastreará el PID incorrecto. También he eliminado respawnya que probablemente no hace nada por la misma razón. Algunos scripts adicionales previos / posteriores al inicio pueden solucionarlo agarrando el PID real. Sin embargo, yo uso monit para manejar reinicios, así que no lo necesito.

No utilice daemon off. Esto es solo para desarrollo. Ver http://wiki.nginx.org/CoreModule#daemon

Referencias

revs PhilT
fuente
1
Creo que desearía ejecutarlo de daemon off;manera que la nueva versión admita el proceso / PID correcto sin la necesidad de las directivas expect forko post-stop. La sección wiki que describe la opción daemon también dice "Puede usar el demonio de forma segura en modo de producción con runit / daemontools, sin embargo, no puede hacer una actualización elegante", lo que supongo se refiere a la actualización a un nuevo binario en el característica de vuelo .
Gary
3

No puedes Al menos no correctamente, de todos modos.

Nginx no genera su demonio en una de las dos formas que requiere el arranque, ya sea a través de "esperar tenedor" o "esperar demonio", por lo que el arranque no puede rastrear el proceso maestro nginx. Hay algunos hacks, pero tienen sus propios problemas.

Si está de acuerdo con el hecho de que el advenedizo no puede realizar un seguimiento del proceso maestro y matarlo en el apagado, esto funcionará:

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON
Danorton
fuente
expect daemonhace que el arranque se bloquee para mí (Ubuntu 12.04, Upstart 1.5, Nginx) expect forkfuncionó aunque, como sugiere @danorton, Upstart rastreará el PID incorrecto. Tampoco pude volver a aparecer al trabajo (ver mi respuesta completa).
PhilT
2

Hay un ejemplo de archivo de configuración Upstart en el Wiki de NGINX .

Es posible que deba ajustar la ruta al binario nginx en el archivo de configuración.

Este archivo de configuración funciona bien para mí con Ubuntu 10.04 y nginx 1.0.5.

También instalé un nginxenlace simbólico /etc/init.dapuntando /lib/init/upstart-jobpara poder usar el servicecomando estándar para iniciar y detener nginx.

Nota: Si instala Phusion Passenger con NGINX, es posible que deba agregar la siguiente estrofa al script de configuración de Upstart:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

Encontré esto necesario en mi configuración de Ubuntu. De lo contrario, cuando emití initctl stop nginxo service nginx stopnginx en realidad no se detuvo. También noté que Upstart pensó que el proceso nginx tenía un PID que en realidad era el PID de uno de los procesos de Passenger. Claramente, NGINX / Passenger confunde un poco a Upstart.

orj
fuente
Gracias por ese guión para pasajero. Esto pareció detener los procesos, pero lo hice stop: Job failed while stoppingmientras lo hacía. ¿Viste esto?
PhilT
Tengo el mismo problema que @PhilT, ¿alguna palabra sobre esto?
Claudio Poli
0

Yo suelo:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

La parada en runlevel [!...]parece ser más estándar. Es lo que hacen los scripts de stock ssh / samba. También debe agregar el respawnbit para que se reinicie si muere. Tampoco estoy seguro de por qué quiere console outputque simplemente envíe la salida de la consola a stdout. El comportamiento predeterminado es simplemente enviar la salida de la consola al registrador.

Puedes ver todos los documentos de estrofa en el wiki de Upstart

Jim Mitchener
fuente
Desafortunadamente, esa wiki parece implicar que solo es la versión 0.5. Es muy extraño para mí que un cambio tan importante esté documentado de esa manera.
chiggsy
¿Qué es solo la versión 0.5?
Jim Mitchener el
El wiki en general. Las páginas de manual están bien, pero seguro que no son páginas de 'información', que generalmente son mucho más detalladas.
chiggsy
0

Curiosamente, ninguna de las respuestas aquí en realidad funciona completamente, ya que dejan el arranque en un estado de parada / muerte que impide que otro comience a funcionar. Esto significa que restart nginxfalla.

El error con upstart está bien documentado en https://bugs.launchpad.net/upstart/+bug/406397 y me sorprende que el autor de upstart no parezca preocuparse lo suficiente como para solucionarlo. La única solución que he visto que funciona es la siguiente (robada del mismo informe de error):

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

La ventaja de escribirlo así es que incluso la reaparición funciona. La desventaja es que es un truco feo y desagradable.

Un acantilado
fuente
Upstart es casi un producto muerto; Ubuntu es casi la última distribución que lo usó. Todos los demás están cambiando o ya han cambiado.
Michael Hampton
Incluso Ubuntu mismo ha cambiado a systemd en versiones más nuevas. Pero algunos de nosotros, los administradores de sistemas, todavía estamos atrapados con 14.04 porque LTS.
Ivan Anishchuk