Nginx 如何处理 HTTP 请求?

Posted

技术标签:

【中文标题】Nginx 如何处理 HTTP 请求?【英文标题】:How does Nginx handle HTTP requests? 【发布时间】:2011-03-27 02:15:29 【问题描述】:

我理解 Apache 使用的线程驱动:每个连接都会打开一个线程,当发送响应时,该线程会关闭,从而为其他线程释放资源。

但我不明白 nginx 使用的事件驱动设计。我已经阅读了一些有关事件驱动设计的基础知识.. 但我不明白 nginx 如何使用它来处理 Web 请求。

我在哪里可以阅读和理解 Nginx 如何以事件驱动的方式处理连接,所以我知道为什么它更好,而不是仅仅接受基于事件的设计比线程驱动的设计更好。

【问题讨论】:

【参考方案1】:

Nginx 使用Reactor 模式。基本上,它是单线程的(但可以分叉多个进程以利用多个内核)。主事件循环等待操作系统发出就绪事件信号 - 例如该数据可用于从套接字读取,此时将其读入缓冲区并进行处理。单个线程可以非常高效地同时服务数万个连接(每个连接线程模型会失败,因为巨大的上下文切换开销以及大量内存消耗,因为每个线程都需要自己的堆栈) .

【讨论】:

但是如果一个线程可以服务数万用户,为什么不使用多个线程来服务更多呢?还是我弄错了。 因为反应器必须执行非线程安全操作,例如从套接字读取。 Proactor 模式可以实现多线程(一个固定的工作线程池,例如每个 CPU 一个),它的工作方式略有不同 - 例如,操作系统将读取的数据放入缓冲区中(您在异步开始时指定缓冲区手术)。但是前摄器也有自己的缺点——它必须为缓冲区保留更多的内存;仅使用单个 CPU 时,它在 Linux 上的速度也较慢。 “如果一个线程可以为数万用户提供服务,为什么不使用多个线程”——线程曾经是为了减少昂贵的流程而发明的一种组合,其代价是增加了复杂性。进行异步 I/O 的全部意义在于,您可以在单个进程中处理多个客户端,并让线程脱离窗口。我敢肯定,在异步 I/O 领域,您不会看到任何值得线程价格的性能提升。 如果 nginx 站在 python 服务器之前会怎样。而且 python 脚本需要大量时间来处理。 site.com/long-duration-request 因为它是一个线程所有其他线程都必须等待导致巨大的交通堵塞对吗?那么,如果您的应用程序本身是考虑到线程编写的,那么您真的可以从 nginx 中受益吗?那你应该使用nodejs之类的东西吗? @TjerkW:Nodejs 会遇到类似的“问题”,因为它使用少量线程。但这都不是问题,因为它使用的是异步模型,它不会坐下来等待响应,而是出去服务其他请求,然后在慢速操作准备好后立即返回并完成响应.

以上是关于Nginx 如何处理 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 如何处理 HTTP 请求?

跟我学Nginx,nginx 如何处理请求?

nginx理解--如何处理一个请求

问题:nginx 如何处理301 ?

如何处理高并发量的HTTP请求

服务器如何处理http请求