우리는 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_method
지시어 사용
참조 : http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method
답변
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;
}