Nginx'in akış yukarı sunucu zaman aşımı sırasında PUT veya POST isteklerini yeniden denemesini nasıl durdurabilirim?


11

Uygulamalarımıza bakiye talepleri yüklemek için nginx kullanıyoruz. İstekler zaman aşımına uğradığında (iyi) nginx'in farklı bir yukarı akış sunucusuna geçtiğini tespit ettik. Ancak bunu istenmeyen sonuçlara neden olabilecek PUT ve POST istekleri için yapar (veriler iki kez saklanır). Nginx'i yalnızca zaman aşımı sırasında GET isteklerini yeniden deneyecek şekilde yapılandırmak mümkün müdür? Yoksa sorunu çözmenin başka bir yolu var mı?

Konfigürasyonumuz aşağıdaki gibidir:

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

Yanıtlar:


9

1.9.13 sürümünden bu yana varsayılan davranış haline geldi

Manuel olarak değiştirmek için şunları kullanabilirsiniz:

proxy_next_upstream error timeout non_idempotent;

6

Oyuna oldukça geç kaldığımı biliyorum, ama benim için bu sorunu ararken en iyi sonuç, bu yüzden çözümümü paylaşmak istedim.

Bu , özel hata işleyici ile birleştirilmiş if yönergesini (birkaç geçerli kullanım durumundan biriyle ) kullanır :

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

Doküman için lütfen buraya bakın: proxy_next_upstream

Lütfen bunun test edilmemiş bir öz olduğunu unutmayın

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


Aslında işe yaramadı: Nginx "proxy_next_upstream burada izin verilmiyor" diyor. If bloklarını yerine taşımaya çalıştım ve aynı hatayı aldım. Her iki konumda da kendi çalışmalarında "proxy_next_upstream hatası" kullanmak.
David Tinker

Belgeler konum bağlamında çalıştığını açıkça belirttiğinden bu çok garip
WojonsTech

nginx'in sevmediği if__xt_upstream etrafında if (...) {} gibi görünüyor
David Tinker

Bunu test eden var mı? 4 upvotes, ancak geçerli kullanım örneklerine uymuyor gibi görünüyor: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM


-1

Tomcat sunucumda da aynı sorun var. uzun istek olduğunda proxy zaman aşımı. proxy_read_timeout kullanarak sorunumu çözdü. zaman aşımı artırmak zaman benim istek asla zaman aşımı ve herhangi bir sorun oluşmadı. varsayılan zaman aşımı 60s. referans

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
Bu soruya hiç cevap vermiyor. Sorunlarınız benzer değil.
Sven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.