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)


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

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:


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

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.


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.