Como posso iniciar o nginx via upstart?

9

Fundo:

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

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

script inicial do nginx no 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

Recebo "trabalho desconhecido" quando tento usar o initctl para executá-lo, o que acabei de aprender aparentemente significa que há um erro (o que há de errado com "Erro" para descrever erros?)

Alguém pode me apontar na direção certa? Eu li a documentação, como ela é, e parece meio escassa para uma substituição de init do SysV ... mas o que for necessário para adicionar esse trabalho à lista, executá-lo e continuar com o que resta da minha vida. .. Alguma dica?

EDIT: initctl versão init (inicial 0.6.5)

chiggsy
fonte
1
Um comentário sobre 'trabalho desconhecido' vs 'Erro'. Você está apenas olhando no lugar errado. Initctl não lê o arquivo de configuração, apenas pede ao Upstart para carregar um trabalho conhecido - e o upstart não conhece esse trabalho quando você emite o comando initctl. Ocorreu um erro anteriormente quando o Upstart tentou ler o arquivo do trabalho. Deve haver uma mensagem de erro no log do sistema (/ var / log / syslog, / var / log / messages ou onde quer que seu sistema armazena esses logs)
Jacek Konieczny
A propósito, verifica-se que em / sbin existem comandos de início e parada para trabalhos iniciados. Eles trabalharam para mim. Agora, eles vinculam de volta ao initctl, por isso não sei por que eles funcionam, mas o fazem.
chiggsy

Respostas:

3

Você não pode ter várias stop ondiretivas em uma descrição do trabalho inicial para Iniciante> = 0,5.

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

Tentar:

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
fonte
Trabalho ainda desconhecido, infelizmente. De onde você está obtendo essas informações? Cara? Info? conectados? Onde está documentado o 0.6.5?
chiggsy
meio que funcionou .. thnx
chiggsy
Sim, é difícil encontrar a documentação atual do Upstart, pelo menos na web. Mas a página do manual é muito boa. Tente: man 5 init
Jacek Konieczny
1
Esta não é a maneira correta de executar o nginx nos servidores de produção. A daemon offopção é apenas para desenvolvimento.
PhilT
16

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

Este script foi testado no Upstart 1.5 em execução 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 post-stoplinha. Consulte o livro de receitas Upstart.

Em um vazio, /etc/init/nginx.confadicione 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

Peguei o script Upstart do Nginx Wiki e o aprimorei, pois várias linhas não são necessárias, causam confusão ou não funcionam.

Você pode precisar alterar env DAEMONe env PIDlinhas, 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 forkparece funcionar. Com o Passageiro, o nginx cria 61 garfos. O Upstart requer 0, 1 ou 2. Como outros sugeriram, o Upstart rastreará o PID errado. Também removi, respawnpois não faz nada provavelmente por causa do mesmo motivo. Algum script adicional pré / pós-inicialização pode consertar isso pegando o PID real. No entanto, eu uso o monit para manipular as reinicializações, para que não seja necessário.

Não use daemon off. Isso é apenas para desenvolvimento. Consulte http://wiki.nginx.org/CoreModule#daemon

Referências:

PhilT
fonte
1
Eu pensaria que você desejaria executar usando daemon off;para que o iniciante assista o processo / PID correto sem a necessidade das diretivas expect forkou post-stop. A seção wiki que descreve a opção daemon também declara "Você pode usar o daemon off com segurança no modo de produção com runit / daemontools, no entanto, não é possível fazer uma atualização normal.", Que eu assumo que esteja se referindo à atualização para um novo binário no diretório recurso de voar .
8283 Gary
3

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

O Nginx não gera seu daemon de uma das duas maneiras que o iniciante exige, seja por meio de "expect fork" ou "expect daemon", portanto, o iniciante não pode acompanhar o processo principal do nginx. Existem alguns hacks, mas eles têm seus próprios problemas.

Se você concorda com o fato de que o iniciante não pode acompanhar o processo principal e eliminá-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
danorton
fonte
expect daemonfaz com que o inicio seja travado para mim (Ubuntu 12.04, Upstart 1.5, Nginx). expect forkfuncionou, embora, como sugere @danorton, o Upstart esteja rastreando o PID errado. Também não consegui reaparecer para o trabalho (veja minha resposta completa).
PhilT
2

Há um exemplo de arquivo de configuração inicial no Wiki do NGINX .

Pode ser necessário 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.

Também instalei um nginxlink simbólico para /etc/init.dapontar para /lib/init/upstart-jobque eu pudesse usar o servicecomando padrão para iniciar e parar nginx.

Nota: Se você instalar o Phusion Passenger com NGINX, poderá precisar adicionar a seguinte estrofe 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

Achei isso necessário na minha configuração do Ubuntu. Caso contrário, quando eu emiti initctl stop nginxou o service nginx stopnginx não parou. Notei também que a Upstart achava que o processo nginx tinha um PID que na verdade era o PID de um dos processos do Passenger. Tão claramente que o NGINX / Passenger está confundindo um pouco o Upstart.

orj
fonte
Obrigado por esse script para o passageiro. Isso pareceu interromper os processos, mas consegui stop: Job failed while stoppingfazê-lo. Você viu isso?
PhilT
Tenho o mesmo problema que o @PhilT, alguma palavra sobre isso?
Claudio Poli
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 runlevel [!...]parece ser mais padrão. É o que os scripts ssh / samba padrão fazem. Você também deve adicionar o respawnbit para que ele reinicie se morrer. Também não sei por que você deseja console outputque simplesmente envie a saída do console para o stdout. O comportamento padrão é simplesmente enviar a saída do console para o criador de logs.

Você pode ver todos os documentos de estrofe no wiki do Upstart

Jim Mitchener
fonte
Infelizmente, esse wiki parece sugerir que é apenas a versão 0.5. É muito estranho para mim que uma mudança tão importante seja documentada dessa maneira.
chiggsy
O que é apenas a versão 0.5?
Jim Mitchener
O wiki em geral. As páginas de manual estão ok, mas com certeza não são páginas de 'informações', que geralmente são muito mais detalhadas.
chiggsy
0

Estranhamente, nenhuma das respostas aqui realmente funciona totalmente quando elas deixam o inicio em um estado de parada / interrupção, o que impede outro começo de funcionamento. Isso significa que restart nginxfalha.

O bug do upstart está bem documentado em https://bugs.launchpad.net/upstart/+bug/406397 e estou surpreso que o autor do upstart não pareça se importar o suficiente para corrigi-lo. 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 escrevê-lo assim é que até o respawn funciona. A desvantagem é que é feio e um truque desagradável.

Cliff Stanford
fonte
O iniciante é praticamente um produto morto; O Ubuntu é quase a última distribuição a usá-lo. Todos os outros estão se afastando ou já mudaram.
Michael Hampton
Até o próprio Ubuntu mudou para o systemd em versões mais recentes. Mas alguns de nós, administradores de sistema, ainda estão presos no 14.04 porque o LTS.
Ivan Anishchuk