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

11

Estamos usando o nginx para carregar solicitações de equilíbrio para nosso aplicativo. Descobrimos que o nginx alterna para um servidor upstream diferente quando as solicitações atingem o tempo limite (bom). No entanto, isso é feito para solicitações PUT e POST, que podem causar resultados indesejáveis ​​(dados armazenados duas vezes). É possível configurar o nginx para tentar novamente apenas solicitações GET com 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;        
    }
}
David Tinker
fonte

Respostas:

9

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

Para alterar manualmente novamente, você pode usar:

proxy_next_upstream error timeout non_idempotent;
Pavel Evstigneev
fonte
6

Sei que estou muito atrasado para o jogo, mas para mim este é o melhor resultado ao procurar esse problema, então eu queria compartilhar minha solução.

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

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;
    }
}
ddelbondio
fonte
4

Consulte aqui para doc: proxy_next_upstream

Observe que esta é uma essência não testada

https://gist.github.com/wojons/6154645

WojonsTech
fonte
Na verdade, não funcionou: o Nginx diz "proxy_next_upstream não permitido aqui". Tentei mover os blocos if para o local e obtive o mesmo erro. Usando "proxy_next_upstream error" em qualquer local por conta própria.
precisa
que é muito estranho, já que há documentação claramente diz ele funciona no contexto local
WojonsTech
parece ser o caso (...) {} torno proxy_next_upstream que nginx não gosta
David Tinker
Alguém já testou isso? 4 upvotes mas não parece aderir a casos de uso válidos aqui: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM
0

proxy_methoddiretiva de uso

consulte: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method

yuankui
fonte
2
Geralmente, é recomendável incluir as informações úteis de um link na sua resposta, de modo que elas não
confiem
1
Bem-vindo à falha do servidor! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Mark Henderson
-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, meu pedido nunca expirou e não ocorreu nenhum problema. tempo limite padrão 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;     
}
hmtmcse
fonte
1
Isso não responde à pergunta. Seus problemas não são iguais.
Sven