Я пытаюсь продемонстрировать возможности балансировки нагрузки nginx. Моя конфигурация nginx следующая
.
.
upstream myapp1 {
server 127.0.0.1:3001 max_fails=1 fail_timeout=60s;
server 127.0.0.1:3002 max_fails=1 fail_timeout=60s;
server 127.0.0.1:3003 max_fails=1 fail_timeout=60s;
}
А потом в разделе сервера
.
.
location /myapp1 {
proxy_pass http://myapp1;
proxy_connect_timeout 10s;
}
.
.
При такой конфигурации Nginx действительно передает данные со всех трех серверов в циклическом режиме. Но когда один из серверов отключен, например, слушая 3003, nginx все еще пытается подключиться к нему несколько раз даже после получения от него таймаута подключения. Самое удивительное, что это занимает 60 секунд, после чего данные поступают с одного из активных серверов.
Вот содержимое файла error.log (которое имеет смысл, но оно появляется только через 60 секунд после попытки подключения клиента)
2018/09/02 21:54:28 [error] 12704#6588: *865 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /myapp1 HTTP/1.1", upstream: "http://[::1]:3003/myapp1", host: "localhost"
Я пытался поместить разные значения для proxy_connect_timeout в разделах http, server и location, но это поведение не меняется.
Как заставить nginx вести себя следующим образом
- Когда сервер отключен, и nginx понимает это, встречая
тайм-аут от прокси, он должен пометить его как неактивный в течение 60 с
сконфигурировано.
- Proxy_connect_timeout должен вступить в силу и nginx
не должно ждать более 10 секунд для восходящего соединения.
nginx версия 1.15.3 для Windows 10.