Bagaimana saya bisa menghentikan nginx dari mencoba ulang permintaan PUT atau POST pada batas waktu server upstream?

11

Kami menggunakan nginx untuk memuat permintaan keseimbangan ke aplikasi kami. Kami telah menemukan bahwa nginx beralih ke server hulu yang berbeda ketika meminta waktu habis (baik). Namun ia melakukan ini untuk permintaan PUT dan POST yang dapat menyebabkan hasil yang tidak diinginkan (data disimpan dua kali). Apakah mungkin untuk mengkonfigurasi nginx untuk hanya mencoba kembali permintaan GET pada batas waktu? Atau adakah cara lain untuk menyelesaikan masalah?

Konfigurasi kami adalah sebagai berikut:

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
sumber

Jawaban:

9

Ini menjadi perilaku default yang dimulai sejak versi 1.9.13

Untuk mengubahnya kembali secara manual, Anda dapat menggunakan:

proxy_next_upstream error timeout non_idempotent;
Pavel Evstigneev
sumber
6

Saya tahu saya agak terlambat ke permainan, tetapi bagi saya ini adalah hasil teratas ketika mencari masalah ini, jadi saya ingin berbagi solusi.

Ini menggunakan if ifive (dengan salah satu dari beberapa kasus penggunaan yang valid ) yang dikombinasikan dengan penangan kesalahan khusus :

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
sumber
4

Silakan lihat di sini untuk doc: proxy_next_upstream

Harap dicatat bahwa ini adalah intis yang belum diuji

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

WojonsTech
sumber
Sebenarnya itu tidak berhasil: Nginx mengatakan "proxy_next_upstream tidak diizinkan di sini". Saya mencoba memindahkan blok if ke lokasi dan mendapatkan kesalahan yang sama. Menggunakan "proxy_next_upstream error" di lokasi mana pun pada karya-karyanya sendiri.
David Tinker
itu sangat aneh karena dokumentasi di sana dengan jelas mengatakan itu berfungsi dalam konteks lokasi
WojonsTech
tampaknya menjadi if (...) {} di sekitar proxy_next_upstream yang tidak disukai nginx
David Tinker
Adakah yang menguji ini? 4 peningkatan tetapi tampaknya tidak mematuhi kasus penggunaan yang valid di sini: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM
0

gunakan proxy_methoddirektif

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

yuankui
sumber
2
Biasanya disarankan untuk memasukkan informasi yang berguna dari tautan dalam jawaban Anda sehingga tidak secara eksplisit mengandalkan tautan untuk berguna
BE77Y
1
Selamat Datang di Kesalahan Server! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Mark Henderson
-1

Saya memiliki masalah yang sama di server kucing jantan saya. proxy time out ketika permintaan panjang terjadi. saya memecahkan masalah saya dengan menggunakan proxy_read_timeout. saat menambah batas waktu maka permintaan saya tidak pernah habis & tidak terjadi masalah. waktu default habis 60-an. referensi

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
sumber
1
Ini sama sekali tidak menjawab pertanyaan. Masalahmu sama saja.
Sven