LINUX.ORG.RU
ФорумAdmin

WebSocket валятся по тайм-аут

 , ,


0

1

Пытаюсь поднять микро сервис из связки nodejs socket.io приложения и nginx в качестве proxy_pass к этому сервису с 80 порта на локальный.
В nginx описан location с connection upgrade прям из мануала. В первом приближении все работает. Клиенты подключаются и обмениваются с сервисом пакетами.
Но наступает момент лавинообразного отказа. В какой то моменты клиенты начинают отваливаться по Timeout. Потом они уже все дружно ретреят конннкты и не могут подключится, а если и подключаются, снова сваливаются по тайм-аут.
При этом загрузки проца сервера нет, память заметно от среднего не меняется.
Логов ещё нет как таковых (учимся ещё) но видно, что nginx принимает входящие соединения и проксит их на нижестоящий сервис, и тут уже Timeout. Но со стороны сервиса нет попыток соединится от nginx. Как так то? В пределах 127.0.0.1 такое может быть?

Потом происходит НЕЧТО и все начинает работать. Не пойму что. И через какое то время накопится ситуация и повторится. Периодичность где то 6-7 часов.

Клиентов не так много - десяток, ну иногда до 20штук за раз. Они подключаются и отключаются, но в основном висят на соединении и обмениваются данными.

Куда рыть? :( Чё то прям растерянности.

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

[error] 31841#31841: *46772 upstream timed out (110: Connection timed out) while reading response header from upstream, upstream: "http://127.0.0.1:2022/?EIO=3&transport=websocket"
И только эта строка огромное кол-во раз.

При этом если переделать скрипт МИМО nginx, а сразу конектиться на ws://127.0.0.1:2022/ порт из скрипта, то вроде как всё работает...
Есть у nginx какой-то syn flood защита? Или балансировщик какой-нить прореживающий запросы? может отключить на время тестов...
С ходу ничего такого не нашёл.

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

Сейчас вот ещё раз всё просмотрел: index.html - внутри JS скрипт подключения к WS.

my.ip - - [08/Jan/2020:01:05:57 +0600] "GET /index.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
my.ip - - [08/Jan/2020:01:06:01 +0600] "GET /icons/favicon-32x32.png HTTP/1.1" 200 2109 "https://my.server.host/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"

на этом всё. в error.log ничего. Через какое-то время броузер ругнётся ВОРНИНГОМ

index.js:83 WebSocket connection to 'wss://my.server.host/socket.io/?EIO=3&transport=websocket' failed: WebSocket is closed before the connection is established.

а ещё через какое-то время в логе error.log появится строка:

2020/01/08 01:15:50 [error] 31844#31844: *159052 upstream timed out (110: Connection timed out) while reading response header from upstream, client: my.ip, server: my.server.host, request: "GET /socket.io/?EIO=3&transport=websocket HTTP/1.1", upstream: "http://127.0.0.1:2022/?EIO=3&transport=websocket", host: "my.server.host"

И всё. Броузер будет повторять попытки, будут ворнинги и ерроры одинаковые. ПОКА что-то не просрётся и оно не соеденится, но тоже коннект может быть, а может так же свалится по PING Timed-out и всё по новой.

при этом в tcpdump -i lo -n -s0 -A port 2022 видно, что коннекты то устанавливаются:

01:34:35.617260 IP 127.0.0.1.59238 > 127.0.0.1.2022: Flags [S], seq 3079806168, win 43690, options [mss 65495,sackOK,TS val 644347020 ecr 0,nop,wscale 7], length 0
01:34:35.617279 IP 127.0.0.1.2022 > 127.0.0.1.59238: Flags [S.], seq 680192635, ack 3079806169, win 43690, options [mss 65495,sackOK,TS val 644347020 ecr 644347020,nop,wscale 7], length 
01:34:35.617295 IP 127.0.0.1.59238 > 127.0.0.1.2022: Flags [.], ack 1, win 342, options [nop,nop,TS val 644347020 ecr 644347020], length 0
01:34:35.617329 IP 127.0.0.1.59238 > 127.0.0.1.2022: Flags [P.], seq 1:899, ack 1, win 342, options [nop,nop,TS val 644347020 ecr 644347020], length 898
GET /?EIO=3&transport=websocket HTTP/1.1
X-Real-IP: my-ip
X-Forwarded-For: my-ip
Host: my.server.host
X-NginX-Proxy: true
Upgrade: websocket
Connection: upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Origin: https://my.server.host
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
x-compress: null
Sec-WebSocket-Key: kZW7mDx9cmF62/wltKYlBg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

И на этом всё.....

server {
                server_name my.server.host;
                listen 0.0.0.0:443 ssl;
                listen [::]:443 ssl;

                root /var/www/my.server.host/data;

                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

                location = /favicon.ico { access_log off; log_not_found off; }
                location = /robots.txt  { access_log off; log_not_found off; }

                # Requests for socket.io are passed on to Node on port 3000
                location ~* /socket\.io/$ {
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-NginX-Proxy true;
                    proxy_set_header X-Forwarded-Proto $scheme;

                    proxy_pass http://127.0.0.1:2022;
                    proxy_redirect off;

                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";

#                    proxy_send_timeout 120s;
#                    proxy_read_timeout 120s;
                }
                error_log /var/www/my.server.host/logs/error.log;
                access_log /var/www/my.server.host/logs/access.log;

                ssl on;
                ssl_certificate /etc/letsencrypt/live/my.server.host/fullchain.pem;
                ssl_certificate_key /etc/letsencrypt/live/my.server.host/privkey.pem;
}
Spider55 ()
Ответ на: комментарий от Spider55

Сейчас методом перебора обнаружил любопытную ШТУКУ.

Выглядит так, буд-то у nodeJS скрипта переполнена входящяя очередь на WebSocket сокет. Из его подобия лога видно что идут входящие соединения из ВНЕ, хотя я уже отключил физически всех клиентов (локальная сеточка, это не сложно, пошёл и выключил компы).
Соединений не может быть ФИЗИЧЕСКИ, но по логу они как бы всё идут и идут. Сделал service nginx stop. Проверил что его реально нет по ps. А соединения идут.... ХМ!
Прибил Nodejs скрипт. Он достаточно ДОЛГО не хотел сдаваться, но потом покинул нас спустя секунд 10.
Запускаю снова - тишина.
Запускаю nginx - всё ещё тишина.
Открываю index.html - ВСЁ работает.

что это? Куда рыть?

Spider55 ()
Последнее исправление: Spider55 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.