단일 업스트림 서버를 재 시도하도록 nginx 구성


14

nginx를 리버스 프록시로 사용하고 있으며 업스트림 서버가 응답하지 않으면 몇 초 동안 기다렸다가 요청을 다시 시도하고 싶습니다. 이 방법으로 업스트림 서버를 다시 시작할 수 있으며 사용자에게 502 잘못된 게이트웨이가 표시되는 대신 브라우저가 몇 초 동안 정지됩니다 (다시 시작 프로세스에는 3 또는 4 초 소요). 몇 가지를 시도했지만 서버 블록에 넣었습니다.

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

그러나 아무것도하지 않는 것 같습니다. 나는 또한 이것을 업스트림 블록에 추가하려고 시도했다.

server 127.0.0.1:3001 fail_timeout=10s;

다시, 내가 원하는 것이 아닙니다.

이것이 가능한가? 내가 무엇을 놓치고 있습니까?

답변:


1

시도한 지시문은 원하는 것과 다른 것을 의미합니다. 그들의 문서를 읽으십시오.

upstream업스트림 블록이 어떻게 작동하는지 지침 문서는 철저하게 설명합니다 :

서버와 통신하는 동안 오류가 발생하면 모든 기능 서버가 시도 될 때까지 다음 서버로 요청이 전달됩니다. 서버에서 응답을 얻을 수 없으면 클라이언트는 마지막 서버와의 통신 결과를받습니다.

모든 것이 거기에 말했다.

그러나 리턴 된 오류 코드를 백엔드에서 가로 채서 처리 한 다음 원래 클라이언트 대신이를 처리하는 특수 스크립트 proxy_intercept_errors로 보낼 수 $request_uri있습니다.

기준은 다음과 같습니다. 클라이언트 측 (또는 프론트 엔드 측)을 재 시도하려면 코드 / 애플리케이션 로직이 필요합니다.


0

다른 답변에서 언급했듯이 nginx 가이 작업을 수행 할 수있는 기본 제공 방법은 없습니다. 가능한 해결책은 현재 서버와 모든 요청에 ​​대해 다음을 수행하는 백업 서버로 구성된로드 균형 조정 설정을 사용하는 것입니다.

  • 다시 온라인 상태가 될 때까지 현재 서버를 폴링
  • 그런 다음 302 또는 다른 리디렉션으로 응답하여 브라우저가 다시 시도하십시오.

이 서버는 'backup'플래그로 표시되어 다른 모든 서버가 오프라인 일 때만 시도됩니다 ( HTTP로드 밸런싱> 서버 가중치 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.