通过FastCGI使用ExpressJS应用程序

时间:2014-05-21 08:30:55

标签: javascript php node.js nginx express

刚刚开始处理NodeJS网络应用程序并有一个基本问题。

由于我来自PHP领域,我知道PHP有built-in HTTP server但没有人实际使用它我们使用nginx并且在史前项目中Apache作为HTTP服务器,当我进入ExpressJS时我发现所有示例谈论收听ExpressJS打开的HTTP服务器(当然是通过http NodeJS模块),但没有人谈论通过FastCGI使用它(nginx - > FastCGI(例如node-fastcgi) - >我的ExpressJS应用程序)就像我以前用PHP做的那样(nginx - > PHP-fpm - >我的PHP env)我想知道为什么?

据我所知,NodeJS应用程序非常快,非阻塞I / O等等,但是每个人都有使用该应用程序的安全漏洞,因为运行的服务在JavaScript环境中具有相同的公共资源例如,一个用户可以错误地(或不错误地)与他人共享敏感信息。让我们假设开发人员犯了这样的错误:

router.post('/set-user-cc', function(res){
    global.user = new User({
        creditCard: req.param('cc')
    });
});

其他用户请求:

router.get('/get-user-cc', funciton(req, res){
    res.json(global.user);
});

此时,每个用户都将获得用户的CC信息。

通过FastCGI使用我的ExpressJS应用程序将为每个HTTP请求打开一个干净的JavaScript环境,用户不会互相伤害。

很高兴听到NodeJS(网络)应用程序经验丰富的开发人员为什么没有人建议使用FastCGI解决方案(在Google上搜索并几乎找不到任何内容),如果是这样,为什么它太糟糕了?

(p.s。这个例子只是为了证明这个问题并不是某人真正做过的事情,但是我们知道宇宙中存在许多愚蠢的人:)

谢谢!

1 个答案:

答案 0 :(得分:3)

如果you lint your coderun under strict mode并且不使用这样的全局变量,你不会犯这样的错误。

同样在nodejs Web应用程序中,您通常希望使服务器无状态并将所有数据保留在数据库中。这也将使其成为一个更具可扩展性的架构。

在安全性非常重要的应用程序中,您可以对其进行大量的模糊测试,以发现类似的问题。

如果你做了这一切,加上严格的代码审查流程,你根本不用担心它。

基本上使用fastCGI,即使它的名称中有fast,将它与使用节点的http服务器进行比较,它也会非常慢。

在fastCGI解决方案中,我们可以处理的并发连接数等于nodejs进程数。来自nodejs docs:

  

假设每个新节点至少启动30ms,内存为10mb。那   是的,你不能创造成千上万的。

因此,拥有1GB的RAM,您只能连接少于100个。

在节点通常的http服务器方式上,你不会遇到这个问题,每个连接都会占用不到1MB。

另外我会说node.js中异步编程的复杂性增加,每个进程只有一个连接可能不值得,因为

节点被整合并具有异步I / O的重点是在同一进程上处理多个连接以提高效率,但使用fastCGI只会丢掉大部分优点。

具有fastCGI的节点的唯一优势是它在javascript中。如果您只了解javascript或喜欢它并且必须将其与现有的fastCGI服务器集成,那么nodejs可能是一个可行的解决方案,否则我不建议这样做。

你错了:

  

通过FastCGI使用我的ExpressJS应用程序将为每个HTTP请求打开一个干净的JavaScript环境,用户不会互相伤害。

作为vkurchatkin stated,一旦流程完成了请求,它就会收到下一个要处理的请求。使用FastCGI方法可能会发生这种错误。我做了一些阅读,FastCGI的重点很快,就是它重用了进程,而不是为每个请求创建它们。