刚刚开始处理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。这个例子只是为了证明这个问题并不是某人真正做过的事情,但是我们知道宇宙中存在许多愚蠢的人:)
谢谢!
答案 0 :(得分:3)
如果you lint your code,run 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的重点很快,就是它重用了进程,而不是为每个请求创建它们。