Jak mogę powstrzymać nginx przed ponawianiem żądań PUT lub POST po przekroczeniu limitu czasu serwera?

11

Używamy nginx do ładowania żądań salda do naszej aplikacji. Odkryliśmy, że nginx przełącza się na inny serwer nadrzędny, gdy upłynie limit czasu żądań (dobrze). Jednak robi to w przypadku żądań PUT i POST, które mogą powodować niepożądane wyniki (dane przechowywane dwukrotnie). Czy można skonfigurować nginx, aby ponawiał żądania GET tylko po przekroczeniu limitu czasu? Czy istnieje inny sposób rozwiązania problemu?

Nasza konfiguracja jest następująca:

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
źródło

Odpowiedzi:

9

To stało się domyślnym zachowaniem od wersji 1.9.13

Aby ręcznie zmienić to z powrotem, możesz użyć:

proxy_next_upstream error timeout non_idempotent;
Pavel Evstigneev
źródło
6

Wiem, że spóźniłem się do gry, ale dla mnie jest to najlepszy wynik w poszukiwaniu tego problemu, więc chciałem podzielić się moim rozwiązaniem.

Wykorzystuje to dyrektywę if (z jednym z niewielu prawidłowych przypadków użycia ) w połączeniu z niestandardową obsługą błędów :

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
źródło
4

Zobacz tutaj dokument: proxy_next_upstream

Pamiętaj, że jest to niesprawdzona istota

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

WojonsTech
źródło
Właściwie to nie działało: Nginx mówi „proxy_next_upstream tutaj niedozwolone”. Próbowałem przenieść bloki if do lokalizacji i otrzymałem ten sam błąd. Używanie „błędu proxy_next_upstream” w obu lokalizacjach we własnych pracach.
David Tinker,
to bardzo dziwne, ponieważ dokumentacja wyraźnie mówi, że działa w kontekście lokalizacji
WojonsTech,
wydaje się, że jeśli (...) {} wokół proxy_next_upstream nie lubi nginx
David Tinker
Czy ktoś to przetestował? 4 głosy poparcia, ale wydaje się, że nie są one zgodne z prawidłowymi przypadkami użycia tutaj: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM
-1

Mam ten sam problem na moim serwerze tomcat. upłynął limit czasu serwera proxy, gdy wystąpi długie żądanie. Rozwiązałem problem, używając proxy_read_timeout. kiedy zwiększam limit czasu, moja prośba nigdy nie przekroczyła limitu czasu i nie wystąpił żaden problem. domyślny limit czasu 60s. odniesienie

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
źródło
1
To wcale nie odpowiada na pytanie. Twoje problemy nie są do siebie podobne.
Sven