Como posso impedir que o nginx tente novamente as solicitações PUT ou POST no tempo limite do servidor upstream?

10

Estamos usando nginx para carregar solicitações de saldo para nosso aplicativo. Descobrimos que o nginx muda para um servidor upstream diferente quando as solicitações excedem o tempo (bom). No entanto, faz isso para solicitações PUT e POST que podem causar resultados indesejáveis (dados armazenados duas vezes). É possível configurar o nginx para tentar novamente as solicitações GET no tempo limite? Ou existe outra maneira de resolver o problema?

Nossa configuração é a seguinte:

upstream mash {
    ip_hash;
    server 127.0.0.1:8081;
    server 192.168.0.11:8081;
}

server {
    ...
    location / {
        proxy_pass http://mash/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        
    }
}
    
por David Tinker 05.08.2013 / 09:18

5 respostas

8

Tornou-se um comportamento padrão a partir da versão 1.9.13

Para alterá-lo manualmente, você pode usar:

proxy_next_upstream error timeout non_idempotent;
    
por 03.05.2016 / 08:46
6

Eu sei que estou atrasado para o jogo, mas para mim este é o melhor resultado na busca por esse problema, então eu queria compartilhar minha solução.

Isso usa a diretiva (com um dos poucos casos de uso válidos ) combinados com o personalizado manipulador de erros :

upstream backend {
    server backend1;
    server backend2;
}

server {
    server_name proxy;

    location / {
        error_page 598 = @retry;
        error_page 599 = @no_retry;
        if ($request_method = POST) {
            return 599;
        }
        return 598;
    }

    location @retry {
        proxy_pass http://backend;
    }

    location @no_retry {
        proxy_pass http://backend;
        proxy_next_upstream off;
    }
}
    
por 19.08.2015 / 13:34
4

Por favor, veja aqui o documento: proxy_next_upstream

Por favor, note que esta é uma essência não testada

link

    
por 05.08.2013 / 11:35
0

use proxy_method directive

consulte: link

    
por 17.06.2015 / 17:33
-1

Eu tenho o mesmo problema no meu servidor tomcat. Tempo limite do proxy quando ocorrer uma solicitação longa. Eu resolvi meu problema usando proxy_read_timeout. quando aumentar o tempo limite, então o meu pedido nunca expirará & não ocorreu nenhum problema. tempo limite padrão de 60s. referência

location / {
    proxy_pass  http://xxxxxxxxxx.com;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect off;
            proxy_connect_timeout      800;
            proxy_send_timeout         800;
            proxy_read_timeout         240;     
}
    
por 25.11.2014 / 10:27