3

问题在标题中。换句话说,如果 Nginx 和 node.js 一样是事件驱动的异步 IO 模型,那为什么不需要编写异步风格的代码呢?我知道,Nginx实际上并没有执行任何代码,而是将它们代理给可以执行的人。那么为什么节点不这样做呢?我们在当前的 Ngninx 方式中遗漏了什么吗?或者,从节点获得更多(除了编写异步代码的痛苦)?

附言。更具体地说,Nginx+php-fpm 或 Nginx+wsgi+python/ruby 与单独的节点在性能或利用节点声称的计算资源方面有何不同?节点不能只使用现有的 FastCGI 模型,成为一个同步风格的 JavaScript 解释器,让网络服务器完成它的异步工作吗?

4

2 回答 2

5

从 NodeJS 谷歌组交叉发布:

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

Nginx 是一个只代理请求的网络服务器。现在,如果您以 Nginx+php+fpm 或 Nginx+wsgi+ruby 为例,您将拥有一个异步的、有事件的 Web 服务器,它位于同步执行的 Web 服务器前面。因此 Nginx 将接受()尽可能多的连接,并且所有这些连接都将排队。从 Nginx 到您的后端同步服务器的请求将是异步的。但是你的后端同步服务器也接受()没有排队任何连接。它一次只能处理一个请求(考虑到您是单线程的),一次只能处理多个请求(prefork/fork(慢)/多线程 -> 有其自身的缺点,例如线程创建时间(可以通过线程池来避免,但是PITA 来实现)、上下文切换、线程死锁、

想象一下,您有 2 条通往 Nginx 正在访问的后端服务器的路由:

/404,/登录。

如果 /login 路由做了大量的 I/O 并且如果另一个请求是向 /404 发出的,那么 /404 页面的渲染将取决于 /login 的请求的完成(因为进程被阻塞了)。所以基本上对任何请求的响应将取决于执行 I/O 时间最长的请求。因此,即使 Nginx 是异步的,它对任何请求的响应时间也将完全取决于完成时间最长的请求(罪魁祸首:同步后端服务器)。

Now if you take the example of NodeJS, everything is asynchronous and evented. Be it File/Network I/O etc. So nothing blocks the process. So taking the previous example, even if /login route is doing a lot of I/O its all asynchronous and /404 page is rendered immediately.

My explanation is quite rudimentary. But I think it should give you more clarity.

于 2012-08-15T13:36:59.597 回答
3

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

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

编辑:

您的 PS 与此问题非常相似,并且特别关注使用 Node.JS 作为 HTTP 服务器。请记住,当该问题结束时,v0.4.12 刚刚发布 - v0.8.5 是目前最新的稳定版本。无论如何,关键在于这取决于您要实现的目标。

这篇博文描述了一个基于 Node.JS 的设置,在单个服务器上实现了 250k 个并发连接。一个快速的谷歌搜索显示人们尝试使用 nginx+php 进行类似的尝试,努力达到 100k,但可用的硬件资源要多得多。

于 2012-08-15T08:49:20.980 回答