Tag: haproxy

HAProxy + Node.js&Express不转发IP地址

我试图让HAProxy通过使用用户的IP地址: option forwardfor 在我的haproxy.cnf 但由于某些原因,我的快递没有返回IP地址。 这是我在Node.js中使用的代码: var usrIP = "0"; if( req.connection.remoteAddress !== null || req.connection.remoteAddress !== "null" || req.connection.remoteAddress.length > 1 ) { usrIP = req.connection.remoteAddress; } 任何想法可能是错的?

OpenShift HAProxy缩放不起作用

我一直在尝试使用ny NodeJS Express 4应用程序(本质上是一个REST API)来获得OpenShift的HAProxy扩展,但是我没有太多的运气。 我正在使用loader.io的压力testing工具,每分钟只有100个用户(从0开始),因为我确信至lessNodeJS / Express应该能够处理这个问题。 现在被允许,这在60秒内确实产生了大约10-20k个请求,但是仍然如此。 在请求开始冲击服务器之后会发生什么呢?我可以看到CPU上升,内存保持稳定,HAProxy的日志文件让我知道它将要扩展。 它从来没有。 HAProxy在可扩展之前崩溃,然后丢失与OpenShift主机的SSH连接。 不过一段时间后会回来。 有一次,我确实看到它已经达到默认的128个连接限制,然后试图启动另一个设备,但是由于请求不断出现,我猜测它无法处理? 起初我以为是因为使用了一个小的齿轮,因为我正在运行'顶部',看到CPU负载穿过屋顶,最终我断开了连接。 我删除了应用程序,并切换到small.highcpu齿轮(每小时花费钱)。 当它应该扩大时,仍然崩溃(less于100个并发用户)。 small.highcpu设备做了一些不同的事情,因为它重新启动后,它增加了一个新的齿轮,但它不缩小(即使所有的stream量已经停止),所以我不得不手动缩小 如果我离开第二个齿轮,并在1分钟内尝试再次用100个用户进行压力testing,HAProxy仍然下降(内存使用情况和CPU似乎没问题),之后不久我就失去了SSH连接。 而且,这一次它不是自动出现的。 我也在我的NodeJS应用程序中收到以下错误: { [Error: socket hang up] code: 'ECONNRESET' } { [Error: socket hang up] code: 'ECONNRESET', sslError: undefined } 如果我之后手动重启HAProxy(因为还没有popup来,我不得不这样做),我可以看到本地设备已经closures了,而第二个设备启动了,这意味着我的NodeJS应用程序在第一档崩溃,在二线上线。 这真的是有意的行为吗? 在处理NodeJS和HAProxy时,我应该做些什么吗? 如果我不能处理100个用户/分钟,我确实无法certificate为这样的服务付费,因为我确信我最终将远远超过100个用户。 更新 :这是一个loader.iographics/报表,HAProxy放弃时显示: http : //ldr.io/1tV2iwj 更新2 :我试着使用Blitz而不是loader.io,只是为了确定HAProxy何时发疯。 闪电战结束了12K点击,26K错误和4K超时。 此外,HAProxy下降,似乎永远不会回来。 这一次,我决定等待,几分钟后,本地DID又回来了。 但是,它没有提出任何额外的齿轮。 这也是HAProxy在Blitztesting发生的时候告诉我的(在它崩溃之前,我断开了连接): […]

用HAProxy缩放socket.io

到目前为止,我有一个node.js应用程序。 运行socket.io。 随着用户数量的增长,一天的大部分时间都达到了100%的CPU,所以我决定把用户分成多个node.js进程。 我已经拆分了我的node.js应用程序逻辑,以允许不同子域上的用户分片。 我还将会话代码提取到通过URL传递的令牌中,所以Cookie不重要。 我想使用我的8核心机器的至less4个核心,所以我想要运行多个node.js进程,每个进程服务子域上的应用程序。 为了使所有的node.js能通过端口80访问,我决定使用HAProxy。 安装程序如下所示: domain.com -> haproxy -> node on 127.0.0.1:5000 sub1.domain.com -> haproxy -> node on 127.0.0.1:5001 sub2.domain.com -> haproxy -> node on 127.0.0.1:5002 sub3.domain.com -> haproxy -> node on 127.0.0.1:5003 现在一切正常,但应用程序的一部分(不使用socket.io)是非常缓慢的。 它使用Express.js编写,当我直接打开页面(即不通过HAProxy)时,它工作的很快。 此外,连接到socket.io与XHR运输快速工作,但对于WebSocket运输也需要很长时间来build立连接。 连接build立后,工作正常,快速。 我以前从来没有使用过HAProxy,所以我可能错误地configuration了一些东西。 这是我的HAProxyconfiguration: global maxconn 50000 daemon defaults mode http retries 1 contimeout 8000 clitimeout 120000 […]

Openshift Layer4连接,应用程序无法启动

我最近将一组node.js更改推送到了Openshift上的应用程序。 该应用程序在我的本地机器上运行良好,非常接近Openshift部署的香草示例。 Openshift haproxy日志有这最后一行: [fbaradar-hydrasale.rhcloud.com日志]> [警告] 169/002631(93881):服务器快速/ local-gear是DOWN,原因:Layer4连接问题,信息:“连接被拒绝”,检查持续时间:0ms。 剩下0个活动和0个备份服务器。 0个会话处于活动状态,0个处于活动状态,0个在队列中。 nodejs.log具有最后一行,在此行之前没有错误消息: DEBUG: Program node server.js exited with code 8 我已经search了高和低,似乎无法find任何人有类似的问题或提示如何解决这个问题。 很显然,当试图通过networking访问应用程序时,上述结果导致503服务不可用。

我可以通过authentication与HAProxy和socket.io进行粘性会话吗?

我有几个socket.io实例与HAProxy下运行身份validation,我需要强制authentication请求和套接字连接去同一个实例。 我已经根据这个答案build立了HAProxy 到一个SO问题,并进行了一些修改,如下所示: global maxconn 4096 # Total Max Connections. This is dependent on ulimit nbproc 2 defaults mode http frontend all 0.0.0.0:80 timeout client 86400000 default_backend www_backend acl is_websocket hdr(Upgrade) -i WebSocket acl is_websocket hdr_beg(Host) -i ws use_backend socket_backend if is_websocket backend www_backend balance url_param sessionId option forwardfor # This sets X-Forwarded-For timeout server […]

HAproxy为redis奴隶

目前我们使用node_redis客户端来访问redis。 我需要在redis slave上使用HAProxy,在我的情况下是3个。 我安装了HAProxy,并将其configuration为负载均衡redis从服务器。 但是当我试图创build连接从node_redis客户端到HAProxy我无法创build连接,并得到一个错误 Error: Redis reply parser error: Error: Protocol error, got "H" as reply type byte at HiredisReplyParser.execute (/home/user1/doosra/node-exp/node_modules/redis/lib/parser/hiredis.js:32:31) at RedisClient.on_data (/home/user1/doosra/node-exp/node_modules/redis/index.js:440:27) at Socket.<anonymous> (/home/user1/doosra/node-exp/node_modules/redis/index.js:70:14) at Socket.emit (events.js:67:17) at TCP.onread (net.js:347:14)

与“快速”的Openshift haproxy错误没有可用的服务器

我从Openshift创build了一个基本的Nodejs应用程序,随机地,服务在几天内终止了几次。 从我的Nodejs模块没有错误消息,但只有在haproxy自动安装。 来自haproxy.log的消息是: [WARNING] 184/001333 (193501) : Server express/local-gear is DOWN for maintenance. [WARNING] 184/010106 (483047) : config : log format ignored for proxy 'stats' since it has no log address. [WARNING] 184/010106 (483047) : config : log format ignored for proxy 'express' since it has no log address. [WARNING] 184/010106 (483047) : Server express/local-gear […]

终止大量SSL连接的成本效益

我最近设置了一个基于Node.js的web套接字服务器,经过testing,它可以在一个小的EC2实例(m1.small)上每秒处理大约2000个新的连接请求。 考虑到m1.small实例的成本以及将多个实例放在支持WebSocket的代理服务器(如HAProxy)后面的能力,我们对结果非常满意。 但是,我们意识到我们还没有使用SSL进行任何testing,因此查看了许多SSL选项。 很明显,在代理服务器上终止SSL连接是理想的,因为代理服务器可以检查stream量并插入诸如X-Forward-For之类的头部,以便服务器知道请求来自哪个IP。 所以我研究了一些解决scheme,比如Pound,stunnel和stud,所有这些都允许443上的传入连接被终止,然后通过80端口上的HAProxy传递到Web服务器。 不幸的是,我发现在c1.medium(High CPU)实例上向SSL终止代理服务器发送stream量很快就消耗了所有的CPU资源,并且每秒钟只有50次左右的请求。 我尝试过使用上面列出的全部三种解决scheme,并且他们都执行了大致相同的操作,而我仍然使用OpenSSL。 我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性缩放。 所以基于EC2定价,我需要支付每秒200个SSL请求的大约600美元/米,而不是每秒2000个非SSL请求的60美元/米。 当我们开始计划每秒钟接受1,000或10,000次请求时,以前的价格变得经济上不可行。 我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势。 所以我希望有人可以帮忙的是build议我如何解决这个荒谬的代价,我们必须吸收以提供SSL连接。 我听说SSL硬件加速器提供了更好的性能,因为硬件devise用于SSLencryption和解密,但是由于我们目前在所有服务器上使用Amazon EC2,使用SSL硬件加速器不是一个select,除非我们有单独的数据以物理服务器为中心。 我只是努力想知道,如果亚马逊,Google,Facebook这样的成本如此之高,可以通过SSL提供所有stream量。 那里一定有更好的解决办法。 任何意见或想法将不胜感激。 谢谢Matt