Apache HTTP 服务器版本 2.4
描述 | Apache HTTP 服务器在转储核心之前尝试切换到的目录 |
---|---|
语法 | CoreDumpDirectory directory |
默认值 | 请参阅默认设置的用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork |
这控制 Apache httpd 在转储核心之前尝试切换到的目录。如果您的操作系统配置为在崩溃进程的工作目录中创建核心文件,则需要 CoreDumpDirectory
将工作目录从默认的 ServerRoot
目录更改,该目录不应由服务器运行的用户写入。
如果您想要进行调试的核心转储,可以使用此指令将其放置在不同的位置。如果您的操作系统未配置为将核心文件写入崩溃进程的工作目录,则此指令无效。
在 Linux 上使用此指令可能会允许系统上的其他进程(如果以类似的权限运行,例如 CGI 脚本)通过 ptrace
系统调用附加到 httpd 子进程。这可能会削弱对某些安全攻击的保护。不建议在生产系统上使用此指令。
如果 Apache httpd 以 root 身份启动并切换到另一个用户,则 Linux 内核会禁用核心转储,即使该目录对进程可写。Apache httpd (2.0.46 及更高版本) 在 Linux 2.4 及更高版本上重新启用核心转储,但前提是您明确配置了 CoreDumpDirectory
。
要在 BSD 系统(如 FreeBSD)上启用 suid 可执行文件的核心转储,请将 kern.sugid_coredump
设置为 1。
CoreDumpDirectory
处理仅针对一组选定的致命信号发生:SIGFPE、SIGILL、SIGABORT、SIGSEGV 和 SIGBUS。
在某些操作系统上,SIGQUIT 也会导致核心转储,但不会经过 CoreDumpDirectory
或 EnableExceptionHook
处理,因此核心位置完全由操作系统决定。
描述 | 启用一个在崩溃后运行异常处理程序的钩子 |
---|---|
语法 | EnableExceptionHook On|Off |
默认值 | EnableExceptionHook Off |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork |
出于安全原因,此指令仅在服务器使用 --enable-exception-hook
选项配置时才可用。它启用一个钩子,允许外部模块插入并在子进程崩溃后执行某些操作。
已经有 mod_whatkilledus
和 mod_backtrace
两个模块利用了这个钩子。请查看 Jeff Trawick 的 EnableExceptionHook 网站,以获取有关这些模块的更多信息。
描述 | 指定优雅关闭的服务器在退出之前等待的超时时间。 |
---|---|
语法 | GracefulShutdownTimeout seconds |
默认值 | GracefulShutdownTimeout 0 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork |
兼容性 | 在版本 2.2 及更高版本中可用 |
GracefulShutdownTimeout
指定在收到“优雅停止”信号后,服务器应继续运行以处理现有连接的秒数。
将此值设置为零意味着服务器将无限期地等待,直到所有剩余的请求都已完全处理。
描述 | 服务器监听的 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
Listen
指令会导致 Address already in use
错误消息。描述 | 挂起连接队列的最大长度 |
---|---|
语法 | ListenBackLog backlog |
默认值 | ListenBackLog 511 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork , mpm_winnt , mpm_netware , mpmt_os2 |
挂起连接队列的最大长度。通常不需要或不需要进行调整;但是,在某些系统上,在遭受 TCP SYN 泛洪攻击时,增加此值是可取的。请参阅 listen(2)
系统调用的 backlog 参数。
这通常会受到操作系统的限制,使其小于该数字。这因操作系统而异。还要注意,许多操作系统不会完全使用指定的 backlog,而是使用基于(但通常大于)设置值的数字。
描述 | 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
套接字,然后让每个子进程处理一个桶(在子进程创建时以循环方式分配桶)。
在 Linux(以及 BSD)上,如果配置了 热插拔,则可以打开/关闭 CPU 核心,因此 ListenCoresBucketsRatio
需要在计算要创建的桶数时考虑此参数。
ListenCoresBucketsRatio
可以提高可扩展性,当接受新连接成为瓶颈时,这一点尤其重要。在具有大量 CPU 核心的系统上,已测试表明启用此功能可以显着提高性能并缩短响应时间。
要使此功能生效,CPU 内核数量必须至少是配置的 ratio 的两倍。推荐的 ratio 是 8
,因此当使用此值时,运行时至少应有 16
个内核可用。为了获得最佳性能,需要针对每个目标系统计算正确的 ratio,测试多个值并观察关键性能指标的变化。
此指令影响 MinSpareThreads
和 MaxSpareThreads
下限值的计算。为了最佳地接受连接,子进程的数量需要是桶数量的倍数。
Listen
器或 Apache HTTP 服务器在监听套接字上设置 SO_REUSEPORT
选项,因此允许多个进程(共享相同的 EUID
,例如 root
)绑定到同一个 IP 地址和端口,而不会出现系统在通常情况下引发的绑定错误。
这也意味着,在同一个 IP:port
上配置的多个 Apache httpd 实例,并且具有正的 ListenCoresBucketsRatio
,也会在没有错误的情况下启动,然后运行时传入连接会均匀地分布在两个实例之间(无论如何,这都不是推荐的做法,也不是明智的做法,而只是一个通知,它将阻止此类潜在问题被检测到)。
在同一个实例中,Apache httpd 将检查并拒绝启动,如果在完全相同的 IP(或主机名)和端口上配置了多个 Listen
指令,从而避免创建一些无用的重复桶,这些桶会降低性能。但是,它不能(也不会尝试更努力地)捕获所有可能的重叠情况(例如,主机名解析为在其他地方使用的 IP)。
描述 | 单个子服务器在其生命周期内处理的连接数限制 |
---|---|
语法 | MaxConnectionsPerChild number |
默认值 | MaxConnectionsPerChild 0 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork , mpm_winnt , mpm_netware , mpmt_os2 |
兼容性 | 适用于 Apache HTTP Server 2.3.9 及更高版本。旧名称 MaxRequestsPerChild 仍然受支持。 |
MaxConnectionsPerChild
指令设置单个子服务器进程处理的连接数限制。在 MaxConnectionsPerChild
个连接之后,子进程将终止。如果 MaxConnectionsPerChild
为 0
,则进程永远不会过期。
将 MaxConnectionsPerChild
设置为非零值限制了进程可以通过(意外)内存泄漏消耗的内存量。
描述 | 主分配器在调用 free() 之前允许持有的最大内存量 |
---|---|
语法 | MaxMemFree KBytes |
默认值 | MaxMemFree 2048 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、prefork 、mpm_winnt 、mpm_netware |
MaxMemFree
指令设置每个分配器在调用 free()
之前允许持有的最大空闲 K 字节数。在多线程 MPM 中,每个线程都有自己的分配器。当设置为零时,阈值将设置为无限制。
描述 | 将同时处理的连接数 |
---|---|
语法 | MaxRequestWorkers number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork |
MaxRequestWorkers
指令设置将服务的并发请求数限制。任何超过 MaxRequestWorkers
限制的连接尝试通常都会排队,最多基于 ListenBacklog
指令的数字。一旦子进程在另一个请求结束时释放,连接将被服务。
对于非多线程服务器(即 prefork
),MaxRequestWorkers
转换为将启动以服务请求的子进程的最大数量。默认值为 256
;要增加它,您还必须提高 ServerLimit
。
对于多线程和混合服务器(例如 event
或 worker
),MaxRequestWorkers
限制了将用于服务客户端的线程总数。对于混合 MPM,默认值为 16
(ServerLimit
) 乘以 25
(ThreadsPerChild
) 的值。因此,要将 MaxRequestWorkers
增加到需要超过 16 个进程的值,您还必须提高 ServerLimit
。
MaxRequestWorkers
在 2.3.13 版本之前称为 MaxClients
。旧名称仍然受支持。
描述 | 空闲线程的最大数量 |
---|---|
语法 | MaxSpareThreads number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、mpm_netware 、mpmt_os2 |
空闲线程的最大数量。不同的 MPM 对此指令的处理方式不同。
对于 worker
和 event
,默认值为 MaxSpareThreads 250
。这些 MPM 在服务器范围内处理空闲线程。如果服务器中有太多空闲线程,则会杀死子进程,直到空闲线程的数量少于此数量。如果启用了 ListenCoresBucketsRatio
,则可能会创建额外的进程/线程。
对于 mpm_netware
,默认值为 MaxSpareThreads 100
。由于此 MPM 运行单个进程,因此备用线程计数也是服务器范围内的。
mpmt_os2
的工作方式类似于 mpm_netware
。对于 mpmt_os2
,默认值为 10
。
MaxSpareThreads
值的范围受到限制。Apache httpd 将根据以下规则自动更正给定的值
mpm_netware
希望该值大于 MinSpareThreads
。worker
和 event
,该值必须大于或等于 MinSpareThreads
和 ThreadsPerChild
的总和。描述 | 可用于处理请求峰值的空闲线程的最小数量 |
---|---|
语法 | MinSpareThreads number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、mpm_netware 、mpmt_os2 |
用于处理请求峰值的空闲线程的最小数量。不同的 MPM 对此指令的处理方式不同。
worker
和 event
使用默认值 MinSpareThreads 75
,并在服务器范围内处理空闲线程。如果服务器中没有足够的空闲线程,则会创建子进程,直到空闲线程的数量大于 number。如果启用了 ListenCoresBucketsRatio
,则可能会创建额外的进程/线程。
mpm_netware
使用默认值 MinSpareThreads 10
,并且由于它是一个单进程 MPM,因此在服务器范围内跟踪此值。
mpmt_os2
的工作方式类似于 mpm_netware
。对于 mpmt_os2
,默认值为 5
。
描述 | 服务器记录守护进程进程 ID 的文件 |
---|---|
语法 | PidFile filename |
默认值 | PidFile logs/httpd.pid |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、prefork 、mpm_winnt 、mpmt_os2 |
PidFile
指令设置服务器记录守护进程进程 ID 的文件。如果文件名不是绝对路径,则假定它相对于 ServerRoot
。
PidFile /var/run/apache.pid
能够向服务器发送信号通常很有用,以便它关闭然后重新打开其 ErrorLog
和 TransferLog
,并重新读取其配置文件。这是通过向 PidFile
中列出的进程 ID 发送 SIGHUP (kill -1) 信号来完成的。
PidFile
受到有关日志文件放置和 安全性 的相同警告。
从 Apache HTTP Server 2 开始,我们建议您只使用 apachectl
脚本,或您的操作系统提供的 init 脚本,用于(重新)启动或停止服务器。
描述 | TCP 接收缓冲区大小 |
---|---|
语法 | ReceiveBufferSize bytes |
默认值 | ReceiveBufferSize 0 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork , mpm_winnt , mpm_netware , mpmt_os2 |
服务器将 TCP 接收缓冲区大小设置为指定的字节数。
如果设置为 0
,服务器将使用操作系统默认值。
描述 | 用于存储子进程协调数据的文件的路径 |
---|---|
语法 | ScoreBoardFile file-path |
默认值 | ScoreBoardFile logs/apache_runtime_status |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、prefork 、mpm_winnt |
Apache HTTP Server 使用记分板在父进程和子进程之间进行通信。某些架构需要一个文件来促进这种通信。如果文件未指定,Apache httpd 首先尝试完全在内存中创建记分板(使用匿名共享内存),如果失败,将尝试在磁盘上创建文件(使用基于文件的共享内存)。指定此指令会导致 Apache httpd 始终在磁盘上创建文件。
ScoreBoardFile /var/run/apache_runtime_status
基于文件的共享内存对于需要直接访问记分板的第三方应用程序很有用。
如果您使用 ScoreBoardFile
,则可以通过将其放在 RAM 磁盘上来提高速度。但请注意,您必须注意有关日志文件放置和 安全性 的相同警告。
描述 | TCP 缓冲区大小 |
---|---|
语法 | SendBufferSize bytes |
默认值 | SendBufferSize 0 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork , mpm_winnt , mpm_netware , mpmt_os2 |
将服务器的 TCP 发送缓冲区大小设置为指定的字节数。在高速、高延迟连接(即 100 毫秒左右,例如跨大陆快速管道)上,将此值设置为超过操作系统标准默认值通常很有用。
如果设置为 0
,服务器将使用操作系统提供的默认值。
可能需要进一步配置您的操作系统才能在高速、高延迟连接上获得更好的性能。
在某些操作系统上,除非将 EnableSendfile
设置为 OFF,否则可能无法看到由于较大的 SendBufferSize
导致的 TCP 行为变化。这种交互只适用于静态文件。
描述 | 可配置进程数量的上限 |
---|---|
语法 | ServerLimit number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event , worker , prefork |
对于 prefork
MPM,此指令设置 Apache httpd 进程生命周期内 MaxRequestWorkers
的最大配置值。对于 worker
和 event
MPM,此指令与 ThreadLimit
结合使用,设置 Apache httpd 进程生命周期内 MaxRequestWorkers
的最大配置值。对于 event
MPM,此指令还定义了多少个旧服务器进程可以继续运行并完成处理打开的连接。在重启期间尝试更改此指令将被忽略,但可以在重启期间修改 MaxRequestWorkers
。
使用此指令时必须格外小心。如果将 ServerLimit
设置为远高于必要的数值,则会分配额外的未使用共享内存。如果将 ServerLimit
和 MaxRequestWorkers
都设置为系统无法处理的数值,Apache httpd 可能无法启动,或者系统可能变得不稳定。
对于 prefork
MPM,仅当您需要将 MaxRequestWorkers
设置为高于 256(默认值)时才使用此指令。不要将此指令的值设置为高于您可能想要设置的 MaxRequestWorkers
的值。
对于 worker
,仅当您的 MaxRequestWorkers
和 ThreadsPerChild
设置需要超过 16 个服务器进程(默认值)时才使用此指令。不要将此指令的值设置为高于您可能想要设置的 MaxRequestWorkers
和 ThreadsPerChild
所需的服务器进程数量。
对于 event
,如果由您的 MaxRequestWorkers
和 ThreadsPerChild
设置定义的进程数量加上正在优雅关闭的进程数量超过 16 个服务器进程(默认值),则增加此指令。
服务器中编译了一个硬性限制 ServerLimit 20000
(对于 prefork
MPM 为 200000)。这样做是为了避免因拼写错误而导致的负面影响。要进一步增加此限制,您需要修改 mpm 源文件中的 MAX_SERVER_LIMIT 值,然后重新构建服务器。
描述 | 启动时创建的子服务器进程数量 |
---|---|
语法 | StartServers number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、prefork 、mpmt_os2 |
StartServers
指令设置启动时创建的子服务器进程数量。由于进程数量会根据负载动态控制(参见 MinSpareThreads
、MaxSpareThreads
、MinSpareServers
、MaxSpareServers
),因此通常没有理由调整此参数。
默认值因 MPM 而异。 worker
和 event
的默认值为 StartServers 3
; prefork
的默认值为 5
;mpmt_os2
的默认值为 2
。
描述 | 启动时创建的线程数量 |
---|---|
语法 | StartThreads number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | mpm_netware |
启动时创建的线程数量。由于线程数量会根据负载动态控制(参见 MinSpareThreads
、MaxSpareThreads
、MinSpareServers
、MaxSpareServers
),因此通常没有理由调整此参数。
对于 mpm_netware
,默认值为 StartThreads 50
,并且由于只有一个进程,因此这是启动时创建的用于处理请求的总线程数。
描述 | 设置每个子进程可配置线程数量的上限 |
---|---|
语法 | ThreadLimit number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、mpm_winnt |
此指令设置 Apache httpd 进程生命周期内 ThreadsPerChild
的最大配置值。在重启期间尝试更改此指令将被忽略,但可以在重启期间将 ThreadsPerChild
修改为不超过此指令的值。
使用此指令时必须格外小心。如果将 ThreadLimit
设置为远高于 ThreadsPerChild
的数值,则会分配额外的未使用共享内存。如果将 ThreadLimit
和 ThreadsPerChild
都设置为系统无法处理的数值,Apache httpd 可能无法启动,或者系统可能变得不稳定。不要将此指令的值设置为高于当前运行的 Apache httpd 中预测的 ThreadsPerChild
的最大设置。
当与 mpm_winnt
一起使用时,ThreadLimit
的默认值为 1920
,当与其他 MPM 一起使用时,默认值为 64
。
描述 | 每个子进程创建的线程数量 |
---|---|
语法 | ThreadsPerChild number |
默认值 | 有关详细信息,请参阅用法 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、mpm_winnt |
此指令设置每个子进程创建的线程数量。子进程在启动时创建这些线程,并且永远不会创建更多线程。如果使用像 mpm_winnt
这样的 MPM,其中只有一个子进程,则此数量应该足够高以处理服务器的整个负载。如果使用像 worker
这样的 MPM,其中有多个子进程,则总线程数量应该足够高以处理服务器上的常见负载。
当与 mpm_winnt
一起使用时,ThreadsPerChild
的默认值为 64
,当与其他 MPM 一起使用时,默认值为 25
。
ThreadsPerChild
的值不能超过 ThreadLimit
的值。如果配置了更高的值,它将在启动时自动降低,并记录警告。这两个指令之间的关系在 ThreadLimit
中解释。
描述 | 用于处理客户端连接的线程使用的堆栈大小(以字节为单位) |
---|---|
语法 | ThreadStackSize size |
默认值 | NetWare 上为 65536;在其他操作系统上有所不同 |
上下文 | 服务器配置 |
状态 | MPM |
模块 | event 、worker 、mpm_winnt 、mpm_netware 、mpmt_os2 |
兼容性 | 在 Apache HTTP Server 2.1 及更高版本中可用 |
ThreadStackSize
指令设置处理客户端连接并调用模块以帮助处理这些连接的线程的堆栈(用于自动数据)的大小。在大多数情况下,操作系统的堆栈大小默认值是合理的,但有些情况下可能需要调整它。
ThreadStackSize
设置为高于操作系统默认值的值来解决此类崩溃。仅当第三方模块的提供者指定需要这种调整,或者 Apache httpd 崩溃的诊断表明线程堆栈大小太小时,才需要进行这种调整。ThreadStackSize
设置为低于操作系统默认值的值,则可以实现更高的每个子进程的线程数量。这种调整应该只在允许执行完整 Web 服务器处理的测试环境中进行,因为可能存在需要更多堆栈来处理的罕见请求。所需的最小堆栈大小很大程度上取决于使用的模块,但 Web 服务器配置中的任何更改都可能使当前的 ThreadStackSize
设置失效。ulimit -s
的(通常很大)软限制(如果无限制,则为 8MB)用作默认堆栈大小。ThreadStackSize
。在某些平台(包括 Linux)上,128000 的设置已经过低,会导致某些常用模块崩溃。