有人能确认 Apache 如何产生新的子代吗?
如果我连接到 Web 服务器(HTTP 1.0 / 无保持活动)并发出 HTTP /GET,我将生成一个新的 HTTPD 子进程。如果随后发出另一个 HTTP /GET,则将建立新的 TCP 连接。但是,我会使用相同的子进程还是会生成一个新的子进程?
另外,如果我使用 HTTP 1.1(具有 keep-alive 功能)并重用相同的 TCP 连接,那么 httpd 进程/生成与我没有使用 keepalive 时相比会有什么不同吗?
谢谢,
答案1
如果我连接到一个 Web 服务器(HTTP 1.0 / 无保持活动)并发出 HTTP /GET,我将生成一个新的 HTTPD 子进程
不,要完成 TCP 握手,您已经有一个进程来处理您的请求。由于您提到了“进程”,这意味着您正在谈论预分叉 MPM。在这种情况下,服务器应该已经有一个可用的子进程池 - 其中一个获取互斥锁来接收下一个传入连接。
基于线程的服务器以类似的方式工作。
基于事件的服务器是完全不同的概念,不会产生线程/进程。
如果随后发出另一个 HTTP /GET...我会使用相同的子进程吗
不。即使您知道您有一个保持活动连接,服务器也不会保留任何状态 - 因此您必须将其视为一个新进程。
答案2
没有通用的设置,因为这是 http 服务器性能的最关键方面。通常,Apache 会尽力避免分叉(或者如你所说,产生)。看看这个:
http://www.stepwise.hk/blog/check-if-apache-running-prefork-or-worker/
多处理模块 (MPM) 是管理网络连接和调度请求的 Apache 模块。Apache2 有两种常用 MPM,即 mpm_prefork_module 和 mpm_worker_module。mpm_prefork_module 使用每个请求一个进程的传统模型,而 mpm_worker_module 使用线程模型,该模型使用多个进程,每个进程有多个线程,以更低的开销获得更好的性能。
Apache 2.4 手册中写道:
构建 Apache 时,必须选择要使用的 MPM。某些平台有特定于平台的 MPM:mpm_netware、mpmt_os2 和 mpm_winnt[适用于任何 MS Windows 版本]。对于一般的 Unix 类型系统,有几种 MPM 可供选择。MPM 的选择会影响 httpd 的速度和可扩展性: