作为两个事件驱动服务器,为什么node.js需要异步代码而Nginx不需要';T

作为两个事件驱动服务器,为什么node.js需要异步代码而Nginx不需要';T,node.js,asynchronous,nginx,Node.js,Asynchronous,Nginx,问题在标题中。换句话说,如果Nginx与node.js的事件驱动异步IO模型相同,为什么不需要编写异步风格的代码呢?我知道,Nginx并不是真正执行任何代码,而是将它们代理给能够执行的人。那为什么node不这么做呢?在目前的Ngninx方式中,我们遗漏了什么吗?或者,从node获得更多(除了编写异步代码的痛苦) 附言。 更具体地说,Nginx+php fpm或Nginx+wsgi+python/ruby在性能或利用node声称的计算资源方面与node本身有多大的不同?node不能仅仅使用现有的F

问题在标题中。换句话说,如果Nginx与node.js的事件驱动异步IO模型相同,为什么不需要编写异步风格的代码呢?我知道,Nginx并不是真正执行任何代码,而是将它们代理给能够执行的人。那为什么node不这么做呢?在目前的Ngninx方式中,我们遗漏了什么吗?或者,从node获得更多(除了编写异步代码的痛苦)

附言。
更具体地说,Nginx+php fpm或Nginx+wsgi+python/ruby在性能或利用node声称的计算资源方面与node本身有多大的不同?node不能仅仅使用现有的FastCGI模型,做一个同步样式的JavaScript解释器,让webserver做它的异步工作吗?

nginx是一个简单的静态HTTP和代理服务器。Node.js是一个功能齐全的应用程序平台

为什么您不希望更专业的应用程序抽象掉所有不需要直接控制的内部工作

编辑: 您的PS与非常类似,并且特别关注使用Node.JS作为HTTP服务器。请记住,问题解决时v0.4.12刚刚发布-v0.8.5是目前最新的稳定版本。关键的一点是,这取决于你想要达到的目标


描述一个基于Node.JS的设置,该设置在一台服务器上实现250k并发连接。快速的谷歌搜索显示,试图使用nginx+php进行类似操作的人,在拥有更多可用硬件资源的情况下,努力达到100k。

来自NodeJS谷歌集团的交叉发布:

好的,我会尽力回答你的问题:

Nginx是一个只代理请求的web服务器。现在,如果您以Nginx+php+fpm或Nginx+wsgi+ruby为例,您将看到一个异步的、有事件的web服务器位于同步执行的web服务器前面。因此Nginx将接受()尽可能多的连接,并且所有连接都将排队。从Nginx到后端同步服务器的请求是异步的。但是,您的后端同步服务器也接受()并没有对任何连接进行排队。它一次只能处理一个请求(考虑到您是单线程的),一次可以处理多个请求(prefork/fork(slow)/multi-threaded->有它自己的缺点,比如线程创建时间(可以通过线程池避免,但要实现PITA)、上下文切换、线程死锁、连接数accept()ed不能大于线程数等)

假设您有两条到Nginx正在访问的后端服务器的路由:

/404,/login

如果/login路由正在执行大量I/O操作,并且如果向/404发出了另一个请求,则/404页面的呈现将取决于/login请求的完成情况(因为进程被阻止)。因此,基本上,对任何请求的响应都将取决于执行I/O所需时间最长的请求。因此,即使Nginx是异步的,并且发生了事件,其对任何请求的响应时间也将完全取决于完成所需时间最长的一个请求(罪魁祸首:同步后端服务器)

现在,如果以NodeJS为例,一切都是异步和事件的。无论是文件/网络I/O等,都不会阻止该过程。因此,以上一个示例为例,即使/login路由正在执行大量I/O,它的所有异步和/404页面也会立即呈现


我的解释很简略。但我认为它应该让您更清楚。

我知道它们是什么(我写道,“Nginx实际上并没有执行任何代码,而是将它们代理给能够执行它们的人”)。但是这并不能回答问题。出于同样的原因,文本编辑器不会公开与C编译器相同的接口——它们是为(并且能够)不同的事情而设计的。谢谢!这正好解释了尽管Nginx是事件驱动的,但php-fpm或其他方面的瓶颈在哪里。