Nginx를 일종의 서비스를 제공하는 서버 세트의 리버스 프록시로 사용하기 시작했습니다.
서비스는 때때로 느려질 수 있습니다 (Java에서 실행되고 JVM은 때때로 "전체 가비지 수집"에 몇 초가 걸릴 수 있음). 따라서 proxy_connect_timeout
2 초로 설정하면 Nginx가 알아낼 시간이 충분합니다. 서비스가 GC에 멈춰 있고 시간 내에 응답하지 않으며 요청을 다른 서버로 전달해야합니다.
또한 proxy_read_timeout
서비스 자체가 응답을 계산하는 데 너무 많은 시간이 걸리면 리버스 프록시가 멈추지 않도록 설정 했습니다. 다시 요청을 적시에 응답을 반환 할 수있는 다른 서버로 이동해야합니다.
일부 벤치 마크를 실행 proxy_connect_timeout
했으며 서비스가 멈추고 들어오는 연결을 수락하지 않기 때문에 일부 요청이 연결 시간 초과에 지정된 시간에 정확하게 반환되므로 제대로 작동 한다는 것을 분명히 알 수 있습니다 (서비스는 Jetty를 내장 된 것으로 사용합니다) 서블릿 컨테이너). 는 proxy_read_timeout
내가 타임 아웃 후 반환이를 지정한 요청을 볼 수도 작동합니다.
문제는 proxy_read_timeout + proxy_connect_timeout
서비스가 멈추고 Nginx가 액세스하려고 시도 할 때 연결을 수락하지 않으면 Nginx가 시간 초과하기 전에 요청이 시간 초과 또는 거의 그 시간이 걸리는 것으로 예상 한다는 것입니다. 처리를 시작하지만 너무 느리고 읽기 시간 초과로 인해 Nginx가 중단됩니다. 서비스에 그러한 사례가 있다고 생각하지만 몇 가지 벤치 마크를 실행하여 총 수백만 건의 요청을 처리 한 결과 위의 항목 proxy_read_timeout
(더 큰 시간 초과)으로 반환되는 단일 요청을 보지 못했습니다 .
이 문제에 대한 의견을 보내 주시면 Nginx의 버그 때문일 수 있습니다 (아직 코드를 보지 않았으므로 가정 사항입니다). 연결 후 시간 초과 카운터가 재설정되지 않습니다. Nginx가 업스트림 서버에서 아무것도 읽지 않으면 성공합니다.
proxy_read_timeout
가 "글로벌 타임 아웃"이 아니라 2 번의 읽기 작업 사이 라고 말합니다 .
proxy_read_timeout + proxy_connect_timeout
. 그래서 총 시간 초과가 예상 됩니다.