LINUX.ORG.RU
ФорумAdmin

nginx tcp timeout

 , ,


1

2

Nginx настроен как прокси для websocket сервера. Захожу на сайт, nginx устанавливает соединение

netstat -np | grep "1.2.3.4"
tcp        0      0 4.3.2.1:8002     1.2.3.4:47196     ESTABLISHED 4618/nginx: worker
tcp        0      0 4.3.2.1:8002     1.2.3.4:47195     ESTABLISHED 4618/nginx: worker


конфиг сервера

listen 8002;
server_name _;
ssl on;
ssl_certificate      cert.crt;
ssl_certificate_key  private.key;

location / {
    proxy_read_timeout 86400;
    proxy_pass http://127.0.0.1:9000;            
    
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

После отрубания сети на клиенте, nginx все равно показывает этот ИП в состоянии ESTABLISHED. Почему так, ведь клиент уже давно отключился? Может висеть так целый день, это не правильно

★★★★
Ответ на: комментарий от svr4

Я как понимаю это на уровне линукса нужно параметры задавать?

gobot ★★★★
() автор топика

Наткнулся на одно решение на гитхабе ратчета
You can resolve this in one of two ways: use a reverse proxy for your WebSocket server (nginx) and have a TCP timeout on it.
Но не знаю как его реализовать

gobot ★★★★
() автор топика

А какая тебе разница? Висит и висит. Устанавливать TCP-соединение, пусть и с локалхостом, это не бесплатная операция. Вот он лишний раз и не рвёт его.

Legioner ★★★★★
()

В чем проблема-то ? Ну повисит и по таймауту свалиться.
PS Не это интересует случайно net.netfilter.nf_conntrack_tcp_timeout_established ?

anc ★★★★★
()
Ответ на: комментарий от Legioner

Потому что это юзер и он считается онлайн, ну типа чата. Соединение есть, значит в сети, а фактически сеть отрублена

gobot ★★★★
() автор топика
Ответ на: комментарий от anc

Так может сутки провисеть...

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

7200 + (75*9) = около двух часов прежде чем твое соединение будет читаться мертвым, то есть отброшено.

хочешь чтоб сбрасывалось быстрее - регулируй значения по формуле выше.

nerve ★★
()
Последнее исправление: nerve (всего исправлений: 1)
Ответ на: комментарий от nerve

Так это глобально будет, а можно такое сделать только для определенных соединений на уровне nginx? И насколько сильно это может повлиять на нагрузку, если я поставлю это значение, например в 5 минут? Насколько я знаю keepalive используют поисковики и браузеры для загрузки картинок. Т.е. по идее в системе больше 5 минут никто не будет держать много соединений, кроме websocket?

gobot ★★★★
() автор топика
Ответ на: комментарий от anc

Не это интересует случайно net.netfilter.nf_conntrack_tcp_timeout_established ?

на это тоже было бы любопытно взглянуть:

sysctl -a | grep conntrack | grep timeout

nerve ★★
()
Ответ на: комментарий от gobot

насколько сильно это может повлиять на нагрузку

смотря что для вас важнее:

- переполнение таблицы соединений и как следствие недоступность сайта

или

- накладные расходы на открытие новых соединений

это глобально будет, а можно такое сделать только для определенных соединений на уровне nginx

боюсь что на уровне nginx у вас не получится этого сделать. но я не знаю наверняка. поэтому пусть специалисты ответят)

Насколько я знаю keepalive используют поисковики и браузеры для загрузки картинок. Т.е. по идее в системе больше 5 минут никто не будет держать много соединений, кроме websocket?

не уверен что понял вашу мысль про браузеры и тд, потрудитесь, как там говаривал профессор, излагать ваши мысли яснее))

nerve ★★
()
Ответ на: комментарий от nerve

переполнение таблицы соединений и как следствие недоступность сайта

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

накладные расходы на открытие новых соединений

Почему они будут открываться новые? Они ведь будут новые в том случае, если клиент недоступен и сам его не закрыл? А такое ведь редко бывает

Про keepalive: кто такие соединения держит? Насколько я знаю поисковики, когда открывают одно соединение и делают много get запросов и по такому же принципу браузеры, когда при одно открытом соединении запрашивают много картинок сразу. Вот нормально ли будет для них, если установить значение tcp_keepalive_time в 5 мин.?

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

tcp_keepalive_time это время бездействия (отсутствие трафика), после которого (если возможно) будет проверено живо соединение или нет.

anc ★★★★★
()
Ответ на: комментарий от anc

Уже сказали, буду пробовать, но вот думаю чем это может обернутся другим сетевым сервисам, если я уменьшу этот параметр, он ведь глобальный, а я хочу применить только к определенным соединениям

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Ладно, забили, возможно я не правильно понял ваш вопрос.
Предположил что он был о моем " после которого (если возможно) "

anc ★★★★★
()
Ответ на: комментарий от gobot

Это не проблема nginx. Вебсокеты сделаны чтобы висеть сколько угодно. Хочешь гарантий - шли пинги. Причем с сервера, чтобы не словить вагон лулзов когда у клиента вкладка в фон уходит.

Оптимальнее всего, если сможешь в приложении сконфигурировать пинги вебсокета, есть у них такая фича. Если не получится - тогда для всех протоколов (я имею в виду, что обычно используют не вебсокеты напрямую, а какой-нибудь message bus с фолбеками в разные транспорты).

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.