Làm cách nào tôi có thể ngăn nginx thử lại các yêu cầu PUT hoặc POST khi hết thời gian chờ máy chủ?


11

Chúng tôi đang sử dụng nginx để tải các yêu cầu cân bằng vào ứng dụng của chúng tôi. Chúng tôi đã thấy rằng nginx chuyển sang một máy chủ ngược dòng khác khi hết thời gian yêu cầu (tốt). Tuy nhiên, nó thực hiện điều này cho các yêu cầu PUT và POST có thể gây ra kết quả không mong muốn (dữ liệu được lưu trữ hai lần). Có thể định cấu hình nginx để chỉ thử lại các yêu cầu GET khi hết thời gian không? Hoặc có một cách khác để giải quyết vấn đề?

Cấu hình của chúng tôi như sau:

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

Câu trả lời:


9

Nó trở thành hành vi mặc định bắt đầu từ phiên bản 1.9.13

Để thay đổi lại bằng tay, bạn có thể sử dụng:

proxy_next_upstream error timeout non_idempotent;

6

Tôi biết tôi đến trò chơi khá muộn, nhưng đối với tôi đây là kết quả hàng đầu khi tìm kiếm vấn đề này, vì vậy tôi muốn chia sẻ giải pháp của mình.

Điều này sử dụng lệnh if (với một trong số ít trường hợp sử dụng hợp lệ ) kết hợp với trình xử lý lỗi tùy chỉnh :

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

Vui lòng xem tại đây cho doc: proxy_next_upstream

Xin lưu ý đây là một ý chính chưa được kiểm tra

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


Trên thực tế, nó không hoạt động: Nginx nói "proxy_next_upstream không được phép ở đây". Tôi đã thử di chuyển các khối if vào vị trí và gặp lỗi tương tự. Sử dụng "proxy_next_upstream error" ở một trong hai vị trí trên các tác phẩm của chính nó.
David Tinker

điều đó thật kỳ quặc vì có tài liệu nói rõ rằng nó hoạt động trong bối cảnh vị trí
WojonsTech

có vẻ như là nếu (...) {} xung quanh proxy_next_upstream mà nginx không thích
David Tinker

Có ai đã thử nghiệm điều này? 4 upvote nhưng dường như không tuân thủ các trường hợp sử dụng hợp lệ ở đây: nginx.com/resource/wiki/start/topics/depth/ifisevil
EoghanM 5/2/2016

0

sử dụng proxy_methodchỉ thị

tham khảo: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method


2
Nói chung, nên bao gồm thông tin hữu ích từ một liên kết trong câu trả lời của bạn để nó không hoàn toàn dựa vào liên kết đó là hữu ích
BE77Y

1
Chào mừng bạn đến với Lỗi Máy chủ! Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo.
Mark Henderson

-1

Tôi có vấn đề tương tự trong máy chủ tomcat của tôi. hết thời gian proxy khi yêu cầu dài xảy ra. tôi đã giải quyết vấn đề của mình bằng cách sử dụng proxy_read_timeout. khi hết thời gian chờ thì yêu cầu của tôi không bao giờ hết thời gian & không xảy ra bất kỳ vấn đề nào. thời gian mặc định hết 60s. tài liệu tham khảo

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
Điều này không trả lời câu hỏi nào cả. Vấn đề của bạn không có gì giống nhau.
Sven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.