Я начал использовать 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
не «глобальное время ожидания», а между двумя операциями чтения.
proxy_read_timeout + proxy_connect_timeout
.