У меня есть установка HAProxy + NodeJS + Rails, я использую сервер NodeJS для загрузки файлов.
Проблема, с которой я столкнулся, заключается в том, что если я загружаю через haproxy на nodejs, и из-за потерянного пакета происходит «TCP (быстрая) повторная передача», скорость передачи на клиенте падает до нуля примерно на 5-10 секунд и затопляется. с повторной передачей TCP.
Этого не происходит, если я загружаю на NodeJS напрямую (повторная передача TCP тоже происходит, но не застревает в десятках попыток повторной передачи).
Моя тестовая установка - это простая ФОРМА HTML4 (метод POST) с одним полем ввода файла. Сервер NodeJS только читает входящие данные и больше ничего не делает.
Я тестировал это на нескольких машинах, сетях, браузерах, всегда с одной и той же проблемой.
Вот дамп TCP-трафика от клиента при загрузке файла:
.....
TCP 1506 [TCP segment of a reassembled PDU]
>> everything is uploading fine until:
TCP 1506 [TCP Fast Retransmission] [TCP segment of a reassembled PDU]
TCP 66 [TCP Dup ACK 7392#1] 63265 > http [ACK] Seq=4844161 Ack=1 Win=524280 Len=0 TSval=657047088 TSecr=79373730
TCP 1506 [TCP Retransmission] [TCP segment of a reassembled PDU]
>> the last message is repeated about 50 times for >>5-10 secs<< (TX drops to 0 on client, RX drops to 0 on server)
TCP 1506 [TCP segment of a reassembled PDU]
>> upload continues until the next TCP Fast Retransmission and the same thing happens again
Haproxy.conf (стабильная версия haproxy v1.4.18) выглядит следующим образом:
global
log 127.0.0.1 local1 debug
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 2
defaults
log global
mode http
option httplog
option tcplog
frontend http-in
bind *:80
timeout client 6000
acl is_websocket path_beg /node/
use_backend node_backend if is_websocket
default_backend app_backend
# Rails Server (via nginx+passenger)
backend app_backend
option httpclose
option forwardfor
timeout server 30000
timeout connect 4000
server app1 127.0.0.1:3000
# node.js
backend node_backend
reqrep ^([^\ ]*)\ /node/(.*) \1\ /\2
option httpclose
option forwardfor
timeout queue 5000
timeout server 6000
timeout connect 5000
server node1 127.0.0.1:3200 weight 1 maxconn 4096
Спасибо за прочтение! :)
Саймон