Come posso impedire a nginx di ritentare le richieste PUT o POST sul timeout del server upstream?


11

Stiamo utilizzando nginx per caricare le richieste di bilanciamento nella nostra applicazione. Abbiamo scoperto che nginx passa a un altro server upstream quando si richiede il timeout (buono). Tuttavia lo fa per le richieste PUT e POST che possono causare risultati indesiderati (dati memorizzati due volte). È possibile configurare nginx per riprovare le richieste GET solo in timeout? O c'è un altro modo per risolvere il problema?

La nostra configurazione è la seguente:

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;        
    }
}

Risposte:


9

È diventato un comportamento predefinito a partire dalla versione 1.9.13

Per cambiarlo manualmente puoi usare:

proxy_next_upstream error timeout non_idempotent;

6

So che sono in ritardo al gioco, ma per me questo è il miglior risultato quando cerco questo problema, quindi volevo condividere la mia soluzione.

Questo utilizza la direttiva if (con uno dei pochi casi d'uso validi ) combinata con il gestore errori personalizzato :

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;
    }
}

4

Si prega di consultare qui per doc: proxy_next_upstream

Si prega di notare che si tratta di una sintesi non testata

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


In realtà non ha funzionato: Nginx dice "proxy_next_upstream non consentito qui". Ho provato a spostare i blocchi if in posizione e ho riscontrato lo stesso errore. Utilizzo di "errore proxy_next_upstream" in entrambe le posizioni sulle sue opere.
David Tinker,

è molto strano dal momento che la documentazione dice chiaramente che funziona nel contesto della posizione
WojonsTech,

sembra essere il if (...) {} intorno a proxy_next_upstream che nginx non piace
David Tinker

Qualcuno l'ha provato? 4 voti positivi, ma non sembra aderire a casi d'uso validi qui: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM


-1

Ho lo stesso problema nel mio server Tomcat. timeout del proxy quando si verifica una richiesta lunga. ho risolto il mio problema usando proxy_read_timeout. quando aumenta il timeout la mia richiesta non è mai scaduta e non si è verificato alcun problema. timeout predefinito anni '60. riferimento

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;     
}

1
Questo non risponde affatto alla domanda. I tuoi problemi non sono uguali.
Sven
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.