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

우리는 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;
    }
}


답변

버전 1.9.13 부터 기본 동작이되었습니다.

수동으로 다시 변경하려면 다음을 사용할 수 있습니다.

proxy_next_upstream error timeout non_idempotent;

답변

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

이것은 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;
    }
}

답변

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

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

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


답변


답변

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