我有一个HAProxy + NodeJS + Rails设置,我使用NodeJS Server进行文件上传。
我面临的问题是,如果我通过haproxy上传到nodejs并且由于数据包丢失而发生“TCP(快速)重传”,则客户端上的TX速率将降至零,持续约5-10秒然后被TCP重传充斥。
如果我直接上传到NodeJS,则不会发生这种情况(TCP重传也会发生,但不会因为数十次重传而陷入困境)。
我的测试设置是一个简单的HTML4 FORM(方法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 stable)如下:
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
感谢阅读! :)
西蒙
答案 0 :(得分:0)
尝试全局将“超时http请求”设置为6秒。它通常可能太低而无法拾取重新传输,但它无法解释原因可能会解决您的问题。
答案 1 :(得分:0)
尝试使用https://github.com/nodejitsu/node-http-proxy。我不确定它是否符合您的整体架构要求,但值得一试。