Como posso iniciar o nginx via upstart?

9

Antecedentes:

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

Eu criei o nginx e gostaria de usar o upstart para iniciá-lo:

script upstart nginx do site:

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

Eu recebo "job desconhecido" quando tento usar o initctl para executá-lo, o que eu acabei de descobrir aparentemente significa que há um erro, (o que há de errado com "Error" para descrever erros?)

Alguém pode me apontar na direção certa? Eu li a documentação, como está, e parece meio escasso para um substituto de init do SysV ... mas seja o que for, basta adicionar esse trabalho à lista, executá-lo e continuar com o que restou da minha vida. .. Alguma dica?

EDIT: versão initctl init (upstart 0.6.5)

    
por chiggsy 19.05.2010 / 18:56

7 respostas

3

Você não pode ter várias diretivas stop on em uma descrição de tarefa inicial para Upstart > = 0.5.

E console owner provavelmente não é o que você deseja (isso torna o nginx o proprietário do console do sistema).

Tente:

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
    
por 20.05.2010 / 08:56
16

Acabei aqui mais de uma vez, por isso pensei em fornecer uma resposta atualizada com base na minha própria experiência depois de usar as respostas aqui. Obrigado especialmente a @danorton e @orj por suas respostas.

Este script foi testado no Upstart 1.5 rodando no Ubuntu 12.04 com Nginx 1.0.11 e Passenger 3.0.11. Se você não estiver usando o Passenger, talvez seja necessário brincar com a linha post-stop . Consulte o livro de receitas do Upstart.

Em um /etc/init/nginx.conf vazio, adicione as seguintes linhas (você pode remover os comentários, se quiser):

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

Eu peguei o script Upstart do Nginx Wiki e ajustei-o como um número de linhas que não são necessárias, causam confusão ou não funcionam.

Você pode precisar alterar env DAEMON e env PID linhas dependendo de onde você instalou o nginx e está escrevendo o PID. O PID pode ser configurado em nginx.

Eu tentei todas as formas de expect . Apenas expect fork parece funcionar. Com o Passenger, o nginx cria 61 garfos. Upstart requer 0, 1 ou 2. Como os outros sugeriram, o Upstart estará rastreando o PID errado. Eu também removi respawn , pois não faz nada provavelmente pelo mesmo motivo. Algum script adicional de pré / pós-inicialização pode consertar isso pegando o PID real. Eu, no entanto, uso o monit para manipular reinicializações, então não é necessário.

Não use daemon off . Isto é apenas para desenvolvimento. Veja link

Referências:

por 23.05.2012 / 14:28
3

Você não pode. Pelo menos não corretamente, de qualquer maneira.

O Nginx não gera seu daemon em uma das duas maneiras que o upstart requer, seja por meio do “fork expect” ou do “expect daemon”, então o upstart é incapaz de rastrear o processo nginx master. Existem alguns hacks, mas eles têm seus próprios problemas.

Se você está bem com o fato de que o upstart não pode acompanhar o processo mestre e matá-lo no desligamento, isso 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
    
por 06.06.2011 / 02:14
2

Existe um Exemplo de arquivo de configuração do Upstart no Wiki NGINX .

Você pode precisar ajustar o caminho para o binário nginx no arquivo de configuração.

Este arquivo de configuração está funcionando bem para mim com o Ubuntu 10.04 e o nginx 1.0.5.

Eu também instalei um symlink nginx em /etc/init.d apontando para /lib/init/upstart-job , então eu poderia usar o comando padrão service para iniciar e parar nginx .

Observação: Se você instalar o Phusion Passenger com o NGINX, talvez seja necessário adicionar a seguinte sub-rotina ao script de configuração do 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

Eu achei isso necessário na minha configuração do Ubuntu. Caso contrário, quando eu emiti initctl stop nginx ou service nginx stop nginx na verdade não parou. Também notei que o Upstart achava que o processo nginx tinha um PID que era na verdade o PID de um dos processos do Passenger. Então, claramente, o NGINX / Passenger está confundindo o Upstart um pouco.

    
por 27.08.2011 / 15:56
0

Eu uso:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

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

A parada em runlevel [!...] parece ser mais padrão. É o que fazem os scripts ssh / samba. Você também deve adicionar o respawn bit para que ele seja reiniciado se ele morrer. Eu também não tenho certeza porque você quer console output que simplesmente envia saída do console para stdout. O comportamento padrão é simplesmente enviar a saída do console para o logger.

Você pode ver todas as sub-escritas no wiki do Upstart

    
por 25.09.2010 / 00:41
0
description "nginx"

start on (net-device-up and local-filesystems)
stop on runlevel [016]

expect fork
respawn
exec /usr/sbin/nginx

Veja link para mais.

    
por 28.09.2010 / 04:35
0

Por estranho que pareça, nenhuma das respostas aqui funciona na medida em que deixam o upstart em um estado de parada / morte que impede que outro comece a trabalhar. Isso significa que restart nginx falha.

O bug com o upstart está bem documentado no link e fico surpreso que o autor do upstart não parece se importar o suficiente para consertar isso. A única solução que vi que funciona é a seguinte (roubada do mesmo relatório de bug):

# 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

A vantagem de escrever assim é que até o respawn funciona. A desvantagem é que é feio e um ataque desagradável.

    
por 08.06.2013 / 13:23