Apache MPM 通用指令

Description:由多个 multiprocessing 模块(MPM)实施的指令的集合
Status:MPM

CoreDumpDirectory Directive

Description:转储核心之前 Apache HTTP Server 尝试切换到的目录
Syntax:CoreDumpDirectory directory
Default:See usage for the default setting
Context:server config
Status:MPM
Module:event, worker, prefork

这将控制 Apache httpd 在转储核心之前尝试切换到的目录。如果您的 os 配置为在崩溃过程的工作目录中创建核心文件,则必须使用CoreDumpDirectory才能从默认的ServerRoot目录更改工作目录,服务器运行时所用的用户不能写入该默认目录。

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

Security note for Linux systems

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

Core Dumps on Linux

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

Core Dumps on BSD

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

Specific signals

CoreDumpDirectory处理仅对以下一组致命 signal 进行:SIGFPE,SIGILL,SIGABORT,SIGSEGV 和 SIGBUS。

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

EnableExceptionHook Directive

Description:启用在崩溃后运行异常处理程序的钩子
Syntax:EnableExceptionHook On|Off
Default:EnableExceptionHook Off
Context:server config
Status:MPM
Module:event, worker, prefork

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

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

GracefulShutdownTimeout Directive

Description:指定一个超时,在此超时后,正常关闭的服务器将退出。
Syntax:GracefulShutdownTimeout seconds
Default:GracefulShutdownTimeout 0
Context:server config
Status:MPM
Module:event, worker, prefork
Compatibility:在 2.2 版和更高版本中可用

GracefulShutdownTimeout指定在收到“正常停止”signal 后多少秒,服务器应 continue 运行,以处理现有连接。

将此值设置为零意味着服务器将无限期 await,直到所有剩余的请求都已完全满足为止。

Listen Directive

Description:服务器监听的 IP 地址和端口
Syntax:Listen [IP-address:]portnumber [protocol]
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
Compatibility:协议参数已在 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

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

仅在非标准端口上运行时,才需要设置协议。例如,在端口 8443 上运行一个https网站:

Listen 192.170.2.1:8443 https

Error condition

同一 IP 地址和端口的多个Listen伪指令将导致Address already in use错误消息。

See also

ListenBackLog Directive

Description:挂起连接队列的最大长度
Syntax:ListenBackLog backlog
Default:ListenBackLog 511
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

挂起的连接队列的最大长度。通常不需要调整。但是,在某些系统上,当受到 TCP SYN 泛洪攻击时,希望增加此数量。请参阅listen(2)系统调用的 backlog 参数。

os 通常会将其限制为较小的数量。随 os 的不同而不同。另请注意,许多 os 并未完全使用指定为待办事项的列表,而是使用基于(但通常大于)设置值的数字。

ListenCoresBucketsRatio Directive

Description:CPU 内核数量(在线)与侦听器存储桶数量之间的比率
Syntax:ListenCoresBucketsRatio ratio
Default:ListenCoresBucketsRatio 0 (disabled)
Context:server config
Status:MPM
Module:event, worker, prefork
Compatibility:在 Apache HTTP Server 2.4.17 中可用,其内核支持套接字选项SO_REUSEPORT,并使用该选项(例如 Linux 3.9 和更高版本,但不支持SO_REUSEPORT in 的当前实现)在侦听进程(或线程)套接字之间平均分配新连接。 * BSD。

(在线)CPU 内核数与侦听器存储桶数量之间的比率可用于使 Apache HTTP Server 创建num_cpu_cores / ratio个侦听存储桶,每个存储桶在同一端口上包含自己的Listening 套接字,然后让每个孩子处理一个单独的存储桶(在创建孩子的时候对存储桶进行循环分配)。

Meaning of "online" CPU core

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

当接受新连接成为瓶颈时,ListenCoresBucketsRatio可以提高可伸缩性。在具有大量 CPU 核心的系统上,启用此功能已经过测试,显示出显着的性能改进和更短的响应时间。

要使之处于活动状态,CPU 核的数量必须至少比配置的比率多两倍。推荐的比率为8,因此,使用此值时,运行时至少应有16个内核可用。需要为每个目标系统计算正确的比率以获得最大性能,测试多个值并观察关键性能 Metrics 的变化。

该指令影响MinSpareThreadsMaxSpareThreads下限值的计算。子进程的数量必须是存储桶数量的倍数,才能最佳地接受连接。

Multiple Listeners or Apache HTTP servers on the same IP address and port

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

这也意味着在相同的IP:port上配置了正号ListenCoresBucketsRatio的 Apache httpd 的多个实例也将启动,而不会出现错误,然后在两个实例之间均匀分布的传入连接上运行(无论如何,这都不是建议或明智的用法) ,但请注意,这将防止发现此类可能的问题)。

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

MaxConnectionsPerChild Directive

Description:限制单个子级服务器在其生存期内要处理的连接数
Syntax:MaxConnectionsPerChild number
Default:MaxConnectionsPerChild 0
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2
Compatibility:可用的 Apache HTTP Server 2.3.9 和更高版本。仍支持旧名称MaxRequestsPerChild

MaxConnectionsPerChild伪指令设置单个子服务器进程将处理的连接数限制。连接MaxConnectionsPerChild后,子进程将死亡。如果MaxConnectionsPerChild0,则该过程将永不过期。

MaxConnectionsPerChild设置为非零值将限制进程因(偶然)内存泄漏而消耗的内存量。

MaxMemFree Directive

Description:在不调用free()的情况下允许主分配器保留的最大内存量
Syntax:MaxMemFree KBytes
Default:MaxMemFree 2048
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware

MaxMemFree伪指令设置允许每个分配器在不调用free()的情况下保留的最大可用 KB 数。在线程 MPM 中,每个线程都有自己的分配器。设置为零时,阈值将设置为无限制。

MaxRequestWorkers Directive

Description:同时处理的最大连接数
Syntax:MaxRequestWorkers number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, prefork

MaxRequestWorkers指令设置了将同时服务的请求数的限制。通常,超过MaxRequestWorkers限制的任何连接尝试都将排队,最多可排队基于ListenBacklog指令的数目。一旦在另一个请求结束时释放了子进程,则将为连接提供服务。

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

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

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

MaxSpareThreads Directive

Description:最大空闲线程数
Syntax:MaxSpareThreads number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, mpm_netware, mpmt_os2

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

对于workerevent,默认值为MaxSpareThreads 250。这些 MPM 在服务器范围内处理空闲线程。如果服务器中的空闲线程过多,则子进程将被杀死,直到空闲线程的数量小于该数量为止。如果启用ListenCoresBucketsRatio,则可能会创建其他进程/线程。

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

mpmt_os2mpm_netware类似。对于mpmt_os2,默认值为10

Restrictions

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

See also

MinSpareThreads Directive

Description:可用于处理请求峰值的最小空闲线程数
Syntax:MinSpareThreads number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, mpm_netware, mpmt_os2

处理请求峰值的最小空闲线程数。不同的 MPM 处理此指令的方式有所不同。

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

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

mpmt_os2mpm_netware类似。对于mpmt_os2,默认值为5

See also

PidFile Directive

Description:服务器记录守护程序的进程 ID 的文件
Syntax:PidFile filename
Default:PidFile logs/httpd.pid
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpmt_os2

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

Example

PidFile /var/run/apache.pid

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

PidFile受到与日志文件放置和security相同的警告。

Note

从 Apache HTTP Server 2 开始,我们建议您仅使用apachectl脚本或 os 提供的 init 脚本来(重新)启动或停止服务器。

ReceiveBufferSize Directive

Description:TCP 接收缓冲区大小
Syntax:ReceiveBufferSize bytes
Default:ReceiveBufferSize 0
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

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

如果设置为0,则服务器将使用 os 默认值。

ScoreBoardFile Directive

Description:用于存储子流程的协调数据的文件的位置
Syntax:ScoreBoardFile file-path
Default:ScoreBoardFile logs/apache_runtime_status
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt

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

Example

ScoreBoardFile /var/run/apache_runtime_status

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

如果使用ScoreBoardFile,则将其放在 RAM 磁盘上可能会提高速度。但是请注意,您要注意有关日志文件放置和security的相同警告。

See also

SendBufferSize Directive

Description:TCP 缓冲区大小
Syntax:SendBufferSize bytes
Default:SendBufferSize 0
Context:server config
Status:MPM
Module:event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

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

如果设置为0,则服务器将使用 os 提供的默认值。

可能需要对 os 进行进一步的配置,以在高速,高延迟的连接上获得更好的性能。

Note

在某些 os 上,除非将EnableSendfile设置为 OFF,否则可能看不到由较大的SendBufferSize引起的 TCP 行为更改。此交互仅适用于静态文件。

ServerLimit Directive

Description:可配置进程数的上限
Syntax:ServerLimit number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, prefork

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

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

对于prefork MPM,仅当您需要将MaxRequestWorkers设置为大于 256(默认值)时,才使用此伪指令。请勿将此指令的值设置得比您要设置MaxRequestWorkers的值高。

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

使用event时,如果您的MaxRequestWorkersThreadsPerChild设置定义的进程号加上正常关闭的进程数超过 16 个服务器进程(默认),请增加此指令。

Note

ServerLimit 20000硬限制编译到服务器中(对于prefork MPM 200000)。这样做是为了避免错别字造成的令人讨厌的影响。要使其进一步超过此限制,您将需要修改 mpm 源文件中的 MAX_SERVER_LIMIT 值并重建服务器。

See also

StartServers Directive

Description:启动时创建的子服务器进程数
Syntax:StartServers number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, prefork, mpmt_os2

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

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

StartThreads Directive

Description:启动时创建的线程数
Syntax:StartThreads number
Default:See usage for details
Context:server config
Status:MPM
Module:mpm_netware

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

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

ThreadLimit Directive

Description:设置每个子进程的可配置线程数上限
Syntax:ThreadLimit number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, mpm_winnt

此伪指令在 Apache httpd 进程的生存期内设置ThreadsPerChild的最大配置值。重新启动期间更改此指令的任何尝试都将被忽略,但是可以在重新启动期间修改ThreadsPerChild,直到该指令的值。

使用此指令时必须特别注意。如果ThreadLimit的值比ThreadsPerChild大得多,则会分配额外的未使用共享内存。如果ThreadLimitThreadsPerChild都被设置为高于系统可以处理的值,则 Apache httpd 可能无法启动,或者系统可能变得不稳定。对于当前运行的 Apache httpd,请勿将此指令的值设置为高于最大预测设置ThreadsPerChild

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

Note

编译到服务器中的硬限制为ThreadLimit 20000(对于_则为ThreadLimit 100000,对于mpm_winnt则为ThreadLimit 15000)。这样做是为了避免错别字造成的令人讨厌的影响。要使其进一步超过此限制,您将需要修改 mpm 源文件中的 MAX_THREAD_LIMIT 值并重建服务器。

ThreadsPerChild Directive

Description:每个子进程创建的线程数
Syntax:ThreadsPerChild number
Default:See usage for details
Context:server config
Status:MPM
Module:event, worker, mpm_winnt

该指令设置每个子进程创建的线程数。子级在启动时创建这些线程,而从不创建更多线程。如果使用的是mpm_winnt之类的 MPM,其中只有一个子进程,则此数字应足够大以处理服务器的整个负载。如果使用worker之类的 MPM,其中有多个子进程,则* total *线程数应足够高以处理服务器上的常见负载。

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

ThreadsPerChild的值不能超过ThreadLimit的值。如果配置了更高的值,它将在启动时自动减小并记录警告。这两个伪指令之间的关系在ThreadLimit中进行了说明。

ThreadStackSize Directive

Description:处理 Client 端连接的线程使用的堆栈大小(以字节为单位)
Syntax:ThreadStackSize size
Default:65536 on NetWare; varies on other operating systems
Context:server config
Status:MPM
Module:event, worker, mpm_winnt, mpm_netware, mpmt_os2
Compatibility:在 Apache HTTP Server 2.1 和更高版本中可用

ThreadStackSize指令设置用于处理 Client 端连接并调用模块以帮助处理这些连接的线程堆栈(用于自动数据)的大小。在大多数情况下,os 的堆栈大小默认值是合理的,但是在某些情况下可能需要对其进行调整:

  • 在具有相对较小的默认线程堆栈大小的平台(例如,HP-UX)上,当使用某些第三方模块使用大量自动数据存储时,Apache httpd 可能会崩溃。这些相同的模块在默认线程堆栈较大的其他平台上可能运行良好。通过将ThreadStackSize设置为高于 os 默认值的值,可以解决此类崩溃问题。仅当第三方模块的提供者指定需要进行调整,或者诊断为 Apache httpd 崩溃表明线程堆栈大小过小时,才需要进行这种调整。

  • 在默认线程堆栈大小明显大于 Web 服务器配置所需的平台上,如果将ThreadStackSize设置为小于 os 默认值的值,则每个子进程可以实现更多数量的线程。此类调整仅应在允许执行完整的 Web 服务器处理的测试环境中进行,因为不经常出现的请求可能需要更多的堆栈来处理。所需的最小堆栈大小在很大程度上取决于所使用的模块,但是 Web 服务器配置中的任何更改都可能使当前的ThreadStackSize设置无效。

  • 在 Linux 上,此指令只能用于增加默认堆栈大小,因为基础系统调用使用该值作为最小堆栈大小。 ulimit -s的(通常很大)软限制(如果没有限制,则为 8MB)用作默认堆栈大小。

Note

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