<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache MPM 通用指令

可用语言:  de  |  en  |  fr  |  ja  |  tr 

描述多个多处理模块 (MPM) 实现的一组指令
状态MPM
Support Apache!

指令

错误修复清单

另请参阅

top

CoreDumpDirectory 指令

描述Apache HTTP 服务器在转储核心之前尝试切换到的目录
语法CoreDumpDirectory directory
默认值请参阅默认设置的用法
上下文服务器配置
状态MPM
模块event, worker, prefork

这控制 Apache httpd 在转储核心之前尝试切换到的目录。如果您的操作系统配置为在崩溃进程的工作目录中创建核心文件,则需要 CoreDumpDirectory 将工作目录从默认的 ServerRoot 目录更改,该目录不应由服务器运行的用户写入。

如果您想要进行调试的核心转储,可以使用此指令将其放置在不同的位置。如果您的操作系统未配置为将核心文件写入崩溃进程的工作目录,则此指令无效。

Linux 系统的安全注意事项

在 Linux 上使用此指令可能会允许系统上的其他进程(如果以类似的权限运行,例如 CGI 脚本)通过 ptrace 系统调用附加到 httpd 子进程。这可能会削弱对某些安全攻击的保护。不建议在生产系统上使用此指令。

Linux 上的核心转储

如果 Apache httpd 以 root 身份启动并切换到另一个用户,则 Linux 内核会禁用核心转储,即使该目录对进程可写。Apache httpd (2.0.46 及更高版本) 在 Linux 2.4 及更高版本上重新启用核心转储,但前提是您明确配置了 CoreDumpDirectory

BSD 上的核心转储

要在 BSD 系统(如 FreeBSD)上启用 suid 可执行文件的核心转储,请将 kern.sugid_coredump 设置为 1。

特定信号

CoreDumpDirectory 处理仅针对一组选定的致命信号发生:SIGFPE、SIGILL、SIGABORT、SIGSEGV 和 SIGBUS。

在某些操作系统上,SIGQUIT 也会导致核心转储,但不会经过 CoreDumpDirectoryEnableExceptionHook 处理,因此核心位置完全由操作系统决定。

top

EnableExceptionHook 指令

描述启用一个在崩溃后运行异常处理程序的钩子
语法EnableExceptionHook On|Off
默认值EnableExceptionHook Off
上下文服务器配置
状态MPM
模块event, worker, prefork

出于安全原因,此指令仅在服务器使用 --enable-exception-hook 选项配置时才可用。它启用一个钩子,允许外部模块插入并在子进程崩溃后执行某些操作。

已经有 mod_whatkilledusmod_backtrace 两个模块利用了这个钩子。请查看 Jeff Trawick 的 EnableExceptionHook 网站,以获取有关这些模块的更多信息。

top

GracefulShutdownTimeout 指令

描述指定优雅关闭的服务器在退出之前等待的超时时间。
语法GracefulShutdownTimeout seconds
默认值GracefulShutdownTimeout 0
上下文服务器配置
状态MPM
模块event, worker, prefork
兼容性在版本 2.2 及更高版本中可用

GracefulShutdownTimeout 指定在收到“优雅停止”信号后,服务器应继续运行以处理现有连接的秒数。

将此值设置为零意味着服务器将无限期地等待,直到所有剩余的请求都已完全处理。

top

Listen 指令

描述服务器监听的 IP 地址和端口
语法Listen [IP-address:]portnumber [protocol]
上下文服务器配置
状态MPM
模块event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
兼容性protocol 参数是在 2.1.5 中添加的

Listen 指令指示 Apache httpd 仅监听特定的 IP 地址或端口;默认情况下,它会响应所有 IP 接口上的请求。现在 Listen 是一个必需的指令。如果它不在配置文件中,服务器将无法启动。这与 Apache httpd 的先前版本不同。

Listen 指令告诉服务器在指定的端口或地址和端口组合上接受传入请求。如果只指定了端口号,则服务器将在所有接口上监听给定的端口。如果同时给出了 IP 地址和端口,则服务器将在给定的端口和接口上监听。

可以使用多个 Listen 指令来指定要监听的多个地址和端口。服务器将响应来自任何列出地址和端口的请求。

例如,要使服务器在端口 80 和端口 8000 上接受连接,请使用

Listen 80
Listen 8000

要使服务器在两个指定的接口和端口号上接受连接,请使用

Listen 192.170.2.1:80
Listen 192.170.2.5:8000

IPv6 地址必须用方括号括起来,如下例所示

Listen [2001:db8::a00:20ff:fea7:ccea]:80

可选的 protocol 参数对于大多数配置不是必需的。如果未指定,则端口 443 的默认值为 https,所有其他端口的默认值为 http。该协议用于确定哪个模块应该处理请求,以及使用 AcceptFilter 指令应用特定于协议的优化。

您只需要在非标准端口上运行时设置协议。例如,在端口 8443 上运行 https 站点

Listen 192.170.2.1:8443 https

错误条件

对同一个 IP 地址和端口使用多个 Listen 指令会导致 Address already in use 错误消息。

另请参阅

top

ListenBackLog 指令

描述挂起连接队列的最大长度
语法ListenBackLog backlog
默认值ListenBackLog 511
上下文服务器配置
状态MPM
模块event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

挂起连接队列的最大长度。通常不需要或不需要进行调整;但是,在某些系统上,在遭受 TCP SYN 泛洪攻击时,增加此值是可取的。请参阅 listen(2) 系统调用的 backlog 参数。

这通常会受到操作系统的限制,使其小于该数字。这因操作系统而异。还要注意,许多操作系统不会完全使用指定的 backlog,而是使用基于(但通常大于)设置值的数字。

top

ListenCoresBucketsRatio 指令

描述CPU 核心数(在线)与监听器桶数之间的比率
语法ListenCoresBucketsRatio ratio
默认值ListenCoresBucketsRatio 0(禁用)
上下文服务器配置
状态MPM
模块event, worker, prefork
兼容性在 Apache HTTP 服务器 2.4.17 中可用,前提是内核支持套接字选项 SO_REUSEPORT 并且使用它将新连接均匀地分布到监听进程(或线程)的套接字上(例如 Linux 3.9 及更高版本,但不包括 *BSD 中 SO_REUSEPORT 的当前实现)。

可以使用 CPU 核心数(在线)与监听器桶数之间的 ratio 使 Apache HTTP 服务器创建 num_cpu_cores / ratio 个监听桶,每个桶在同一个端口上包含自己的 Listen 套接字,然后让每个子进程处理一个桶(在子进程创建时以循环方式分配桶)。

“在线”CPU 核心的含义

在 Linux(以及 BSD)上,如果配置了 热插拔,则可以打开/关闭 CPU 核心,因此 ListenCoresBucketsRatio 需要在计算要创建的桶数时考虑此参数。

ListenCoresBucketsRatio 可以提高可扩展性,当接受新连接成为瓶颈时,这一点尤其重要。在具有大量 CPU 核心的系统上,已测试表明启用此功能可以显着提高性能并缩短响应时间。

要使此功能生效,CPU 内核数量必须至少是配置的 ratio 的两倍。推荐的 ratio8,因此当使用此值时,运行时至少应有 16 个内核可用。为了获得最佳性能,需要针对每个目标系统计算正确的 ratio,测试多个值并观察关键性能指标的变化。

此指令影响 MinSpareThreadsMaxSpareThreads 下限值的计算。为了最佳地接受连接,子进程的数量需要是桶数量的倍数。

在同一 IP 地址和端口上使用多个 Listen 器或 Apache HTTP 服务器

在监听套接字上设置 SO_REUSEPORT 选项,因此允许多个进程(共享相同的 EUID,例如 root)绑定到同一个 IP 地址和端口,而不会出现系统在通常情况下引发的绑定错误。

这也意味着,在同一个 IP:port 上配置的多个 Apache httpd 实例,并且具有正的 ListenCoresBucketsRatio,也会在没有错误的情况下启动,然后运行时传入连接会均匀地分布在两个实例之间(无论如何,这都不是推荐的做法,也不是明智的做法,而只是一个通知,它将阻止此类潜在问题被检测到)。

在同一个实例中,Apache httpd 将检查并拒绝启动,如果在完全相同的 IP(或主机名)和端口上配置了多个 Listen 指令,从而避免创建一些无用的重复桶,这些桶会降低性能。但是,它不能(也不会尝试更努力地)捕获所有可能的重叠情况(例如,主机名解析为在其他地方使用的 IP)。

top

MaxConnectionsPerChild 指令

描述单个子服务器在其生命周期内处理的连接数限制
语法MaxConnectionsPerChild number
默认值MaxConnectionsPerChild 0
上下文服务器配置
状态MPM
模块event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
兼容性适用于 Apache HTTP Server 2.3.9 及更高版本。旧名称 MaxRequestsPerChild 仍然受支持。

MaxConnectionsPerChild 指令设置单个子服务器进程处理的连接数限制。在 MaxConnectionsPerChild 个连接之后,子进程将终止。如果 MaxConnectionsPerChild0,则进程永远不会过期。

MaxConnectionsPerChild 设置为非零值限制了进程可以通过(意外)内存泄漏消耗的内存量。

top

MaxMemFree 指令

描述主分配器在调用 free() 之前允许持有的最大内存量
语法MaxMemFree KBytes
默认值MaxMemFree 2048
上下文服务器配置
状态MPM
模块eventworkerpreforkmpm_winntmpm_netware

MaxMemFree 指令设置每个分配器在调用 free() 之前允许持有的最大空闲 K 字节数。在多线程 MPM 中,每个线程都有自己的分配器。当设置为零时,阈值将设置为无限制。

top

MaxRequestWorkers 指令

描述将同时处理的连接数
语法MaxRequestWorkers number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块event, worker, prefork

MaxRequestWorkers 指令设置将服务的并发请求数限制。任何超过 MaxRequestWorkers 限制的连接尝试通常都会排队,最多基于 ListenBacklog 指令的数字。一旦子进程在另一个请求结束时释放,连接将被服务。

对于非多线程服务器(即 prefork),MaxRequestWorkers 转换为将启动以服务请求的子进程的最大数量。默认值为 256;要增加它,您还必须提高 ServerLimit

对于多线程和混合服务器(例如 eventworker),MaxRequestWorkers 限制了将用于服务客户端的线程总数。对于混合 MPM,默认值为 16 (ServerLimit) 乘以 25 (ThreadsPerChild) 的值。因此,要将 MaxRequestWorkers 增加到需要超过 16 个进程的值,您还必须提高 ServerLimit

MaxRequestWorkers 在 2.3.13 版本之前称为 MaxClients。旧名称仍然受支持。

top

MaxSpareThreads 指令

描述空闲线程的最大数量
语法MaxSpareThreads number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块eventworkermpm_netwarempmt_os2

空闲线程的最大数量。不同的 MPM 对此指令的处理方式不同。

对于 workerevent,默认值为 MaxSpareThreads 250。这些 MPM 在服务器范围内处理空闲线程。如果服务器中有太多空闲线程,则会杀死子进程,直到空闲线程的数量少于此数量。如果启用了 ListenCoresBucketsRatio,则可能会创建额外的进程/线程。

对于 mpm_netware,默认值为 MaxSpareThreads 100。由于此 MPM 运行单个进程,因此备用线程计数也是服务器范围内的。

mpmt_os2 的工作方式类似于 mpm_netware。对于 mpmt_os2,默认值为 10

限制

MaxSpareThreads 值的范围受到限制。Apache httpd 将根据以下规则自动更正给定的值

另请参阅

top

MinSpareThreads 指令

描述可用于处理请求峰值的空闲线程的最小数量
语法MinSpareThreads number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块eventworkermpm_netwarempmt_os2

用于处理请求峰值的空闲线程的最小数量。不同的 MPM 对此指令的处理方式不同。

workerevent 使用默认值 MinSpareThreads 75,并在服务器范围内处理空闲线程。如果服务器中没有足够的空闲线程,则会创建子进程,直到空闲线程的数量大于 number。如果启用了 ListenCoresBucketsRatio,则可能会创建额外的进程/线程。

mpm_netware 使用默认值 MinSpareThreads 10,并且由于它是一个单进程 MPM,因此在服务器范围内跟踪此值。

mpmt_os2 的工作方式类似于 mpm_netware。对于 mpmt_os2,默认值为 5

另请参阅

top

PidFile 指令

描述服务器记录守护进程进程 ID 的文件
语法PidFile filename
默认值PidFile logs/httpd.pid
上下文服务器配置
状态MPM
模块eventworkerpreforkmpm_winntmpmt_os2

PidFile 指令设置服务器记录守护进程进程 ID 的文件。如果文件名不是绝对路径,则假定它相对于 ServerRoot

示例

PidFile /var/run/apache.pid

能够向服务器发送信号通常很有用,以便它关闭然后重新打开其 ErrorLogTransferLog,并重新读取其配置文件。这是通过向 PidFile 中列出的进程 ID 发送 SIGHUP (kill -1) 信号来完成的。

PidFile 受到有关日志文件放置和 安全性 的相同警告。

注意

从 Apache HTTP Server 2 开始,我们建议您只使用 apachectl 脚本,或您的操作系统提供的 init 脚本,用于(重新)启动或停止服务器。

top

ReceiveBufferSize 指令

描述TCP 接收缓冲区大小
语法ReceiveBufferSize bytes
默认值ReceiveBufferSize 0
上下文服务器配置
状态MPM
模块event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

服务器将 TCP 接收缓冲区大小设置为指定的字节数。

如果设置为 0,服务器将使用操作系统默认值。

top

ScoreBoardFile 指令

描述用于存储子进程协调数据的文件的路径
语法ScoreBoardFile file-path
默认值ScoreBoardFile logs/apache_runtime_status
上下文服务器配置
状态MPM
模块eventworkerpreforkmpm_winnt

Apache HTTP Server 使用记分板在父进程和子进程之间进行通信。某些架构需要一个文件来促进这种通信。如果文件未指定,Apache httpd 首先尝试完全在内存中创建记分板(使用匿名共享内存),如果失败,将尝试在磁盘上创建文件(使用基于文件的共享内存)。指定此指令会导致 Apache httpd 始终在磁盘上创建文件。

示例

ScoreBoardFile /var/run/apache_runtime_status

基于文件的共享内存对于需要直接访问记分板的第三方应用程序很有用。

如果您使用 ScoreBoardFile,则可以通过将其放在 RAM 磁盘上来提高速度。但请注意,您必须注意有关日志文件放置和 安全性 的相同警告。

另请参阅

top

SendBufferSize 指令

描述TCP 缓冲区大小
语法SendBufferSize bytes
默认值SendBufferSize 0
上下文服务器配置
状态MPM
模块event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

将服务器的 TCP 发送缓冲区大小设置为指定的字节数。在高速、高延迟连接(即 100 毫秒左右,例如跨大陆快速管道)上,将此值设置为超过操作系统标准默认值通常很有用。

如果设置为 0,服务器将使用操作系统提供的默认值。

可能需要进一步配置您的操作系统才能在高速、高延迟连接上获得更好的性能。

在某些操作系统上,除非将 EnableSendfile 设置为 OFF,否则可能无法看到由于较大的 SendBufferSize 导致的 TCP 行为变化。这种交互只适用于静态文件。

top

ServerLimit 指令

描述可配置进程数量的上限
语法ServerLimit number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块event, worker, prefork

对于 prefork MPM,此指令设置 Apache httpd 进程生命周期内 MaxRequestWorkers 的最大配置值。对于 workerevent MPM,此指令与 ThreadLimit 结合使用,设置 Apache httpd 进程生命周期内 MaxRequestWorkers 的最大配置值。对于 event MPM,此指令还定义了多少个旧服务器进程可以继续运行并完成处理打开的连接。在重启期间尝试更改此指令将被忽略,但可以在重启期间修改 MaxRequestWorkers

使用此指令时必须格外小心。如果将 ServerLimit 设置为远高于必要的数值,则会分配额外的未使用共享内存。如果将 ServerLimitMaxRequestWorkers 都设置为系统无法处理的数值,Apache httpd 可能无法启动,或者系统可能变得不稳定。

对于 prefork MPM,仅当您需要将 MaxRequestWorkers 设置为高于 256(默认值)时才使用此指令。不要将此指令的值设置为高于您可能想要设置的 MaxRequestWorkers 的值。

对于 worker,仅当您的 MaxRequestWorkers ThreadsPerChild 设置需要超过 16 个服务器进程(默认值)时才使用此指令。不要将此指令的值设置为高于您可能想要设置的 MaxRequestWorkers ThreadsPerChild 所需的服务器进程数量。

对于 event,如果由您的 MaxRequestWorkersThreadsPerChild 设置定义的进程数量加上正在优雅关闭的进程数量超过 16 个服务器进程(默认值),则增加此指令。

注意

服务器中编译了一个硬性限制 ServerLimit 20000(对于 prefork MPM 为 200000)。这样做是为了避免因拼写错误而导致的负面影响。要进一步增加此限制,您需要修改 mpm 源文件中的 MAX_SERVER_LIMIT 值,然后重新构建服务器。

另请参阅

top

StartServers 指令

描述启动时创建的子服务器进程数量
语法StartServers number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块eventworkerpreforkmpmt_os2

StartServers 指令设置启动时创建的子服务器进程数量。由于进程数量会根据负载动态控制(参见 MinSpareThreadsMaxSpareThreadsMinSpareServersMaxSpareServers),因此通常没有理由调整此参数。

默认值因 MPM 而异。 workerevent 的默认值为 StartServers 3 prefork 的默认值为 5mpmt_os2 的默认值为 2

top

StartThreads 指令

描述启动时创建的线程数量
语法StartThreads number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块mpm_netware

启动时创建的线程数量。由于线程数量会根据负载动态控制(参见 MinSpareThreadsMaxSpareThreadsMinSpareServersMaxSpareServers),因此通常没有理由调整此参数。

对于 mpm_netware,默认值为 StartThreads 50,并且由于只有一个进程,因此这是启动时创建的用于处理请求的总线程数。

top

ThreadLimit 指令

描述设置每个子进程可配置线程数量的上限
语法ThreadLimit number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块eventworkermpm_winnt

此指令设置 Apache httpd 进程生命周期内 ThreadsPerChild 的最大配置值。在重启期间尝试更改此指令将被忽略,但可以在重启期间将 ThreadsPerChild 修改为不超过此指令的值。

使用此指令时必须格外小心。如果将 ThreadLimit 设置为远高于 ThreadsPerChild 的数值,则会分配额外的未使用共享内存。如果将 ThreadLimitThreadsPerChild 都设置为系统无法处理的数值,Apache httpd 可能无法启动,或者系统可能变得不稳定。不要将此指令的值设置为高于当前运行的 Apache httpd 中预测的 ThreadsPerChild 的最大设置。

当与 mpm_winnt 一起使用时,ThreadLimit 的默认值为 1920,当与其他 MPM 一起使用时,默认值为 64

注意

服务器中编译了一个硬性限制 ThreadLimit 20000(或使用 event 时为 ThreadLimit 100000,使用 mpm_winnt 时为 ThreadLimit 15000)。这样做是为了避免因拼写错误而导致的负面影响。要进一步增加此限制,您需要修改 mpm 源文件中的 MAX_THREAD_LIMIT 值,然后重新构建服务器。

top

ThreadsPerChild 指令

描述每个子进程创建的线程数量
语法ThreadsPerChild number
默认值有关详细信息,请参阅用法
上下文服务器配置
状态MPM
模块eventworkermpm_winnt

此指令设置每个子进程创建的线程数量。子进程在启动时创建这些线程,并且永远不会创建更多线程。如果使用像 mpm_winnt 这样的 MPM,其中只有一个子进程,则此数量应该足够高以处理服务器的整个负载。如果使用像 worker 这样的 MPM,其中有多个子进程,则线程数量应该足够高以处理服务器上的常见负载。

当与 mpm_winnt 一起使用时,ThreadsPerChild 的默认值为 64,当与其他 MPM 一起使用时,默认值为 25

ThreadsPerChild 的值不能超过 ThreadLimit 的值。如果配置了更高的值,它将在启动时自动降低,并记录警告。这两个指令之间的关系在 ThreadLimit 中解释。

top

ThreadStackSize 指令

描述用于处理客户端连接的线程使用的堆栈大小(以字节为单位)
语法ThreadStackSize size
默认值NetWare 上为 65536;在其他操作系统上有所不同
上下文服务器配置
状态MPM
模块eventworkermpm_winntmpm_netwarempmt_os2
兼容性在 Apache HTTP Server 2.1 及更高版本中可用

ThreadStackSize 指令设置处理客户端连接并调用模块以帮助处理这些连接的线程的堆栈(用于自动数据)的大小。在大多数情况下,操作系统的堆栈大小默认值是合理的,但有些情况下可能需要调整它。

除非需要每个子进程运行大量线程,否则不建议减少 ThreadStackSize。在某些平台(包括 Linux)上,128000 的设置已经过低,会导致某些常用模块崩溃。

可用语言:  de  |  en  |  fr  |  ja  |  tr 

top

评论

注意
这不是问答区。此处放置的评论应针对改进文档或服务器的建议,如果这些建议已被实施或被认为无效/偏离主题,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题,请咨询我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表