从 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.