http - Nodejs 反向代理性能

标签 http node.js lighttpd reverse-proxy

我正在研究使用 Node 作为反向代理的可能性。我的项目的主要目标之一是让它具有非常高的性能。所以我设置了一个 Node 服务器来代理对目标 Node 服务器的请求,无论请求如何,目标 Node 服务器都会响应“hello world”。

我使用 Apache Bench 对每秒处理的请求数进行了一些比较。代理、目标和调用方分别位于 AWS 中不同的 M1 大型实例上。我的结果令人沮丧和困惑。

直接从调用者到目标:

ab -c 100 -n 10000 http://target-instance/

= ~2600 个请求/秒

从调用者通过代理到目标

ab -c 100 -n 10000 http://proxy-instance/

= ~1100 个请求/秒

使用 lighttpd 我能够在代理和目标上获得约 3500 个请求/秒

我对代理服务器的性能不如目标服务器感到失望。在比较 lighttpd 等其他产品时,我看到代理实现了与目标相当的结果,所以我很困惑 Node(应该是快速闪电)何时没有达到相同的效果。

这是我在 Node v0.5.9 中的代理代码:我错过了什么吗?

var server =
http.createServer(function(req, res){
    var opts = { host: 'target-instance',
                 port: 80,
                 path: '/',
                 method: 'GET'};
    var proxyRequest = http.get(opts, function(response){
            response.on('data', function(chunk){
                    res.write(chunk);
            });
            response.on('end', function(){
                    res.end()
            });
    });
});
server.listen(80);

最佳答案

虽然 Node.js 非常高效,但它不是多线程的,因此代理 Node 将处理比目标更多的连接,但只有一个线程,因此成为瓶颈。有两种解决方法:

  1. 在 Node 代理的多个实例(例如 nginx)前使用多线程负载平衡器。
  2. 将您的 Node 代理更改为使用 multiple processes .有多个 Node 模块可以执行此操作,但 Node 现在包含“cluster”开箱即用,在我看来是最简单的方法。

关于http - Nodejs 反向代理性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971892/

相关文章:

node.js - 如何使用sequelize ORM(即多线程)实现集群

http - 用 lighttpd 重写 - 如何删除文件扩展名

web-services - 如何在 Lighttpd 中设置无 cookie 域?

python - 无法在 https 端口 (443) [Errno 10013] 上实例化 python BaseHTTPServer

php http header

javascript - 在 JSDom 中检测 301 重定向或 404

http - XMLHttpRequest 如何知道何时调用它的回调?

mysql - 如果另一个表中不存在则添加用户

node.js - 如何避免 jasmine 在不同环境下出现较长的相对路径(../../../)?

svn - 在没有 apache 的情况下通过 https 设置 svn