nginx proxy_cache: limite pedidos paralelos a um backend

5

Estou usando o nginx como um proxy reverso para meu (s) backend (s). A configuração é bem básica, por exemplo o núcleo é apenas:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

location / {
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

Agora, meu serviço é computacionalmente muito pesado e eu gostaria que o nginx limitasse o número de solicitações paralelas (simultâneas) ativas em um único back-end upstream para, por exemplo. 10.

Eu olhei para o módulo limit_req , no entanto, este módulo só parece se concentrar nos pedidos recebidos por minuto. Eu gostaria especificamente de limitar o número de conexões de backend active ; ou seja, leve em consideração se os pedidos já retornaram ou não. Isso é possível?

No verniz, isso pode ser feito usando, por exemplo,

backend cpu1 {
  .host = "127.0.0.1";
  .port = "80";
  .max_connections = 20;
}

No entanto, preciso usar o nginx para isso.

    
por Jeroen 25.04.2012 / 23:30

2 respostas

7

Dê uma olhada no módulo limit_conn . Embora todos os exemplos que encontrei tenham sido limitados por IP remoto, se você passar uma constante para limit_conn_zone em vez do IP remoto, você estará limitando o total de conexões ao servidor.

Algo parecido com isto:

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

set $const 1;
limit_conn_zone $const zone=one:1m;

location / {
    limit_conn one 10;
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

Editar: Parece que este módulo só está disponível em versões mais recentes do nginx (possivelmente > = v1.1.8). Talvez seja necessário compilar a partir da fonte, se você quiser usar essa opção e tiver uma versão mais antiga do nginx.

Editar 2: Se o seu nginx estiver apenas fazendo tarefas de proxy, dê uma olhada em worker_connections

    
por 26.04.2012 / 00:39
2

Acho que as opções de configuração de que você precisa são:

proxy_cache_use_stale updating;
proxy_cache_lock on;

Isso serve elementos de data do cache e a emissão de atualizações do back-end. Então, quando o seu servidor backend uma página após 2 segundos, o cliente já tem o recurso antigo do cache.

O segundo bloqueia um elemento do cache, enquanto já está em execução uma solicitação de cache de atualização para o backend, portanto, não há solicitações paralelas para um item de cache.

Isso deve ser muito melhor que os limites rígidos de proxy.

Se você ainda quiser limites rígidos de proxy para conexões, poderá executar um nginx em conexões de backend e de limite de taxa ou solicitações lá. Senão você pode querer tentar um limite de conexão com o iptables, que deve ter um desempenho muito melhor que no nginx.

    
por 26.05.2015 / 11:21