生成 HTTPD 进程

生成 HTTPD 进程

有人能确认 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 的速度和可扩展性:

  • 工人MPM 使用多个子进程,每个子进程都有许多线程。每个线程一次处理一个连接。Worker 通常是高流量服务器的不错选择,因为它比 prefork MPM 占用的内存更小。
  • 事件MPM 像 Worker MPM 一样具有线程,但其设计目的是通过将一些处理工作交给支持线程来允许同时处理更多请求,从而释放主线程来处理新请求。
  • 预分叉MPM 使用多个子进程,每个子进程都有一个线程。每个进程一次处理一个连接。

相关内容