업스트림 서버 시간 초과에서 nginx가 PUT 또는 POST 요청을 다시 시도하지 못하게하려면 어떻게해야합니까?


11

우리는 nginx를 사용하여 요청을 응용 프로그램에로드 밸런싱합니다. 요청 시간이 초과되면 nginx가 다른 업스트림 서버로 전환되는 것으로 나타났습니다 (양호). 그러나 이는 PUT 및 POST 요청에 대해 바람직하지 않은 결과 (데이터가 두 번 저장 됨)를 유발할 수 있습니다. 시간 초과시 GET 요청 만 다시 시도하도록 nginx를 구성 할 수 있습니까? 아니면 문제를 해결할 다른 방법이 있습니까?

우리의 구성은 다음과 같습니다.

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

답변:



6

나는 게임에 늦었다는 것을 알고 있지만,이 문제를 검색 할 때 이것이 최고의 결과이므로 내 솔루션을 공유하고 싶었습니다.

이것은 if 지시문 ( 유효한 몇 가지 유스 케이스 중 하나 와 함께)을 사용자 정의 오류 처리기 와 함께 사용 합니다 .

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

다음 문서를 참조하십시오 : proxy_next_upstream

이것은 테스트되지 않은 요점입니다.

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


실제로 작동하지 않습니다 : Nginx는 "proxy_next_upstream이 허용되지 않습니다"라고 말합니다. if 블록을 위치로 옮기려고했는데 같은 오류가 발생했습니다. 자체 작업의 어느 위치에서 "proxy_next_upstream 오류"를 사용합니다.
David Tinker

이 문서는 명확하게 위치 맥락에서 작동 말한다 때문에 그것은 매우 이상하다
WojonsTech

(...) {} 주변이의 nginx를 proxy_next_upstream 경우 그렇지처럼 않는 것 같다
데이비드 팅커

누구든지 이것을 테스트 했습니까? 4 upvotes 그러나 유효한 유스 케이스를 준수하지 않는 것 같습니다 : nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM

0

2
유용한 링크에 명시 적으로 의존하지 않도록 링크에 유용한 정보를 링크에 포함하는 것이 좋습니다.
BE77Y

1
서버 결함에 오신 것을 환영합니다! 이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
Mark Henderson

-1

Tomcat 서버에 동일한 문제가 있습니다. 긴 요청이 발생하면 프록시 시간이 초과됩니다. proxy_read_timeout을 사용하여 문제를 해결했습니다. 시간 초과를 늘리면 요청이 시간 초과되지 않고 문제가 발생하지 않습니다. 기본 시간 초과 60 초 참고

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
이것은 전혀 질문에 대답하지 않습니다. 당신의 문제는 비슷하지 않습니다.
Sven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.