Я почав використовувати 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
.