nginx обнаруживает мертвых клиентов

Обычно, когда вы вытаскиваете сетевой кабель из сетевого устройства (что имитирует некоторое падение в сети, поэтому неясное отключение), нижележащие сокеты не обнаруживают отключения (по крайней мере наши устройства этого не делают), поэтому мы используем keep alive для разрыва соединения и повторного подключения.

Все устройства используют ежечасный опрос сервера nginx. Итак, мой вопрос:

Если устройство не обнаруживает отключение кабеля (и, вероятно, 100 других ситуаций в сети), тогда также nginx не отключает сокет, и этот сокет остается открытым?

Как долго оставаться открытым?

Следует ли нам использовать на стороне nginx также tcp keep alive для клиента? Как?

1
задан 23 December 2020 в 20:37
1 ответ

Для обнаружения таких сбоев требуется TCP Keepalive. Сокет — это всего лишь абстракция, и сокет закрывается только в случае сбоя передачи пакета в соединении.

В ситуации длительного опроса пакетная передача не осуществляется, поэтому конечный автомат TCP не может реагировать на событие потери пакета.

Поэтому вам необходимо включить поддержку активности TCP в сетевом стеке:

sysctl -w net.ipv4.tcp_keepalive_time = 600
sysctl -w net.ipv4.tcp_keepalive_intvl = 60
sysctl -w net.ipv4.tcp_keepalive_probes = 5

Первое значение указывает, как долго соединение должно бездействовать, прежде чем будет отправлен тест проверки активности.

Второе значение указывает, как часто должна отправляться проверка активности после запуска отправки.

Последнее значение означает, сколько тестовых пакетов должно пройти неудачно, прежде чем соединение будет считаться разорванным.

sysctl изменяет только текущую конфигурацию. Вам нужно обратиться к документации вашего дистрибутива, чтобы узнать, как сделать его постоянным.

1
ответ дан 23 December 2020 в 09:23

Теги

Похожие вопросы