Como recarregar o nginx config apenas em parte dos trabalhadores?

1

Existe alguma maneira de impedir que o nginx recarregue a configuração em todos os trabalhadores ao mesmo tempo? Eu configurei alguns timeouts realmente curtos, então dobrar o número de processos de trabalho quando a carga é alta causa o aumento de 504 erros. Eu quero evitar isso trocando trabalhadores um por um (ou talvez três por três), mas não consigo encontrar uma maneira de conseguir isso.

Editar:

Durante a atualização da configuração, o nginx dobra o número de processos de trabalho:

O CDN que eu estava desenvolvendo estava fazendo solicitações durante o cálculo de chaves de cache. Estes pedidos tiveram tempos de espera muito curtos (50ms se bem me lembro), então eles foram muito sensíveis para mudanças de cargas de servidores. Quando as recargas de configuração eram freqüentes, essas solicitações estavam expirando. Eu supus que isso foi causado por processos de trabalho adicionais, por isso fiquei me perguntando se é possível recarregar a configuração apenas em alguns funcionários ao mesmo tempo. Poderia funcionar assim:

  • crie trabalhadores n com nova configuração
  • pare de atribuir novas conexões a trabalhadores n com configuração antiga
  • aguarde até que esses n trabalhadores antigos saiam com elegância
  • repita este processo até que não haja mais trabalhadores com configuração antiga

Não encontrei nenhuma opção que permita esse tipo de comportamento, portanto, presumo que não seja possível. Mas eu quero ter certeza.

    
por qzb 27.10.2015 / 09:23

1 resposta

1

Eu acho que você não entende o design do nginx.

Este servidor Web não está seguindo o esquema clássico de um processo por conexão como o Apache, por exemplo.

Assim, há pouco ou nenhum uso na adição de mais trabalhadores do que o número de núcleos de CPU, sendo que um número de processos de trabalho é igual a essa propriedade de máquina, sendo a configuração mais eficiente.

De outra forma: nos horários do Apache, você tinha para adicionar mais trabalhadores para lidar com mais tráfego desde 1 processo < = > 1 conexão.

Agora, esse nginx, somente a relação 1 conexão = > 1 processo permanece, mas 1 process = > 1 conexão não é mais verdade. O projeto orientado a eventos do nginx permite que cada trabalhador aceite muitas conexões em vez de esperar (permanecendo ocioso) até que esteja totalmente ocupado (100% da CPU no core-s- sendo usado).

A linha de base é: você não precisa alterar o número de trabalhadores de sua instância nginx se ela estiver configurada corretamente (cf. worker_processes , auto sendo geralmente suficiente). Se os trabalhadores estiverem saturados, você terá uma propriedade de máquina como o gargalo (CPU, E / S), portanto, adicionar novos trabalhadores não fará muito, mas aumentará o problema.

Agora, para a parte em que você deseja 'trocar os funcionários um a um', o nginx 'master aloca soquetes para os trabalhadores, para que você não saiba quais solicitações / clientes estão afetando.

Pense em se em um grupo que desova (e morre) juntos. Você pode ter várias versões binárias e / ou diversas configurações carregadas em vários mestres ao mesmo tempo, usando o on-the- fly upgrade capacidade do nginx. Você pode então alternar entre diferentes configurações sem problemas e quase instantaneamente, comunicando-se com os mestres através de sinais.

Eu strongmente sugiro que você leia em nginx 'design para ter uma idéia clara do que você está lidando e por que o que você pergunta cai de cara.

Você não especificou qual é a sua verdadeira intenção, então eu estava preso a fornecer-lhe as perguntas exatas que você fez. Provavelmente, há um conjunto mais simples de perguntas / respostas se você dissesse à comunidade o que queria alcançar.

    
por 14.08.2016 / 15:49

Tags