Executando o nginx 1.0.15 no CentOS 6.5 . Eu tenho três servidores upstream e tudo funciona bem, no entanto, quando eu simular uma interrupção e levar um dos servidores upstream para baixo, percebo um atraso considerável nos tempos de resposta (5-7 segundos adicionais). No segundo que eu trago o servidor downed de volta online, o lag desaparece. Além disso, outra coisa estranha que eu notei, se eu simplesmente parar o serviço httpd no servidor de interrupção simulado, os tempos de resposta são normais, o atraso só ocorre se o servidor estiver completamente inativo.
Aqui está o meu conf:
upstream prod_example_com {
server app-a-1:51000;
server app-a-2:51000;
server app-a-3:51000;
}
server {
# link: http://wiki.nginx.org/MailCoreModule#server_name
server_name example.com www.example.com *.example.com;
#-----
# Upstream logic
#-----
set $upstream_type prod_example_com;
#-----
include include.d/common.conf;
# Configure logging
access_log /var/log/nginx/example/access/access.log access;
error_log /var/log/nginx/example/error.log error;
location / {
# link: http://wiki.nginx.org/HttpProxyModule#proxy_pass
proxy_pass http://$upstream_type$request_uri;
# link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
# link: http://wiki.nginx.org/HttpProxyModule#proxy_pass
proxy_pass http://$upstream_type$request_uri;
# link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header expires;
proxy_hide_header Cache-Control
# Even tho this reads like the older syntax, it is handled internally by nginx to set max age to now + 1 year
expires max;
# Allow intermediary caches the ability to cache the asset
add_header Cache-Control "public";
}
}
Eu tentei as sugestões em postagens semelhantes como esta . E, aparentemente, minha versão do nginx é muito antiga para suportar health_checks, conforme descrito nos docs do nginx. Eu também tentei definir explicitamente a max_fails=2
e fail_timeout=120
na definição% upstream doapp-a-3
, mas nenhuma delas parece evitar o atraso adicional de 5 a 7 segundos para cada solicitação se app-a-3
estiver offline.
- Atualização -
Por solicitação, aqui está a saída para uma única solicitação quando app-a-3
está totalmente inativo. A única coisa que eu podia ver fora do normal é o atraso de 3 segundos entre o evento inicial e o evento subsequente.
- Atualização # 2 -
Parece que há alguns anos o Nginx decidiu criar o Nginx Plus, que adiciona verificações de integridade ativas, mas para um contrato de suporte anual. Com base em alguns artigos que li, a Nginx se cansou de fazer milhões às empresas e não recebeu nada em troca.
Como mencionado nos comentários, estamos começando e não temos o $ $ $ para arrendar um contrato de $ 1.350. Eu encontrei este repo que fornece a funcionalidade. Imaginando se alguém tem alguma experiência com isso? Estável? Desempenho?
No pior caso, vou ter que morder a bala e pagar o extra de $ 20 / mês por um Linode "Node Balancer", que tenho certeza que é baseado no Nginx Plus. O único problema é que não há controle sobre a configuração além de algumas opções genéricas, portanto, não há como suportar vários arquivos vhost através de um balanceador, e todos os nós precisam estar no mesmo datacenter.
- Atualização # 3 -
Aqui estão alguns resultados de cerco . Parece que o segundo nó está mal configurado, já que é capaz de lidar com apenas cerca de 75% dos pedidos que o primeiro e o terceiro nós estão manipulando. Também achei estranho, que quando eu coloquei o segundo nó offline, o desempenho foi tão ruim quanto se eu tivesse o terceiro (melhor desempenho) nó offline. A lógica ditaria que, se eu removesse o elo fraco (segundo nó), obteria melhor desempenho, porque os dois nós restantes têm um desempenho melhor do que o elo fraco, individualmente.
Resumindo:
node 1, 2, 3 + my nginx = 2037 requests
node 1, 2 + my nginx = 733 requests
node 1, 3 + my nginx = 639 requests (huh? these two perform better individually so together should be somewhere around ~1500 requests, based on 2000 requests when all nodes are up)
node 1, 3 + Linode Load Balancer = 790 requests
node 1, 2, 3 + Linode Load Balancer = 1,988 requests