mpm_common
CoreDumpDirectory 指令
描述: | Apache HTTP Server 在转储核心之前尝试切换的目录 |
句法: | CoreDumpDirectory directory |
默认: | See usage for the default setting |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
它控制 Apache httpd 在转储核心之前尝试切换的目录。如果您的操作系统配置为在崩溃 process 的工作目录中创建核心 files,则需要CoreDumpDirectory
来更改默认ServerRoot目录中的工作目录,该目录不应由服务器运行的用户写入。
如果需要核心转储以进行调试,可以使用此指令将其放在不同的位置。如果未将操作系统配置为将核心 files 写入崩溃进程的工作目录,则此指令无效。
Linux 系统的安全说明
在 Linux 上使用此指令可能允许系统上的其他进程(如果 running 具有类似的特权,例如 CGI 脚本)通过ptrace
系统调用附加到 httpd 子进程。这可能会削弱对某些安全攻击的保护。不建议在 production 系统上使用此指令。
Linux 上的核心转储
如果 Apache httpd 以 root 身份启动并切换到另一个用户,则 Linux 内核会禁用核心转储,即使该目录对于 process 是可写的。 Apache httpd(2.0.46 和更高版本)在 Linux 2.4 及更高版本上重新启用核心转储,但前提是您明确配置CoreDumpDirectory
。
BSD 上的核心转储
要在 BSD-systems 上启用 core-dumping suid-executables(例如 FreeBSD),请将kern.sugid_coredump
设置为 1。
具体信号
CoreDumpDirectory
处理仅针对 select 致命信号集发生:SIGFPE,SIGILL,SIGABORT,SIGSEGV 和 SIGBUS。
在某些操作系统上,SIGQUIT 也会导致核心转储,但不会经过CoreDumpDirectory
或EnableExceptionHook
处理,因此核心位置完全由操作系统决定。
EnableExceptionHook 指令
描述: | 在崩溃后启用运行 exception 处理程序的 hook |
句法: | EnableExceptionHook On\|Off |
默认: | EnableExceptionHook Off |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
出于安全原因,仅当服务器配置了--enable-exception-hook
选项时,此指令才可用。它启用了一个 hook,允许外部模块插入并在子程序崩溃后执行某些操作。
已经有两个模块mod_whatkilledus
和mod_backtrace
使用了这个 hook。有关这些内容的更多信息,请查看 Jeff Trawick 的EnableExceptionHook 站点。
GracefulShutdownTimeout 指令
描述: | 指定超时,然后正常关闭服务器将退出。 |
句法: | GracefulShutdownTimeout seconds |
默认: | GracefulShutdownTimeout 0 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
兼容性: | 可在 version 2.2 及更高版本中使用 |
GracefulShutdownTimeout
指定在收到“graceful-stop”信号后多少秒,服务器应_继续 run,处理现有连接。
将此 value 设置为零意味着服务器将无限期地等待,直到所有剩余请求都已完全提供。
听指令
描述: | 服务器侦听的 IP 地址和端口 |
句法: | Listen[IP-address:]portnumber[protocol] |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware, mpmtos2 |
兼容性: | 协议参数在 2.1.5 中添加 |
Listen
指令指示 Apache httpd 仅侦听特定的 IP 地址或端口;默认情况下,它响应所有 IP 接口上的请求。Listen
现在是必需的指令。如果它不在配置文件中,则服务器将无法启动。这是对以前版本的 Apache httpd 的更改。
Listen
指令告诉服务器接受指定 port 或 address-and-port 组合的传入请求。如果仅指定了 port 编号,则服务器将侦听所有接口上的给定 port。如果给出 IP 地址和 port,服务器将侦听给定的 port 和接口。
多个Listen
指令可用于指定要侦听的多个地址和端口。服务器将响应来自任何列出的地址和端口的请求。
例如,要使服务器接受 port 80 和 port 8000 上的连接,请使用:
Listen 80 Listen 8000
要使服务器接受两个指定接口和 port numbers 上的连接,请使用
Listen 192.170.2.1:80 Listen 192.170.2.5:8000
IPv6 地址必须用方括号括起来,如下例所示:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
大多数配置不需要可选的协议参数。如果未指定,https
是 port 443 的默认值,http
是所有其他端口的默认值。该协议用于确定哪个模块应处理请求,以及使用AcceptFilter指令应用协议特定的优化。
如果要在 non-standard 端口上运行,则只需设置协议。例如,在 port 8443 上运行https
站点:
Listen 192.170.2.1:8443 https
错误情况
对于相同的 ip 地址和 port,多个Listen
指令将导致Address already in use
错误消息。
参见
- DNS 问题
- 设置 Apache HTTP Server 使用的地址和端口
- 进一步讨论地址已在使用中的错误消息,包括其他原因。
ListenBackLog 指令
描述: | 挂起连接队列的最大长度 |
句法: | ListenBackLog backlog |
默认: | ListenBackLog 511 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware, mpmtos2 |
挂起连接队列的最大长度。通常不需要或不需要调整,但是在某些系统上,希望在 TCP SYN 泛洪攻击下增加此调整。请参阅listen(2)
系统调用的 backlog 参数。
这通常被操作系统限制为较小的数量。这从 OS 到 OS 不等。另请注意,许多操作系统并未完全使用指定为积压的操作系统,而是使用基于(但通常大于)设置的数字。
ListenCoresBucketsRatio 指令
描述: | CPU 核心数(在线)与 listeners 桶数之间的比率 |
句法: | ListenCoresBucketsRatio ratio |
默认: | ListenCoresBucketsRatio 0(disabled) |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
兼容性: | 在 Apache HTTP Server 2.4.17 中可用,内核支持 socket 选项SO_REUSEPORT 并在使用它的侦听进程(或线程)套接字之间均匀分配新连接(例如 Linux 3.9 及更高版本,但不包括* BSD 中SO_REUSEPORT 的当前 implementations)。 |
(在线)CPU 核心数和 listeners 桶数之间的比率可用于使 Apache HTTP Server 创建num_cpu_cores / ratio
监听桶,每个桶包含自己的听-ing socket(s),然后让每个子进程处理单个存储桶(在子节点创建 time 时使用 round-robin 分配存储桶)。
“在线”CPU 核心的含义
在 Linux(以及 BSD)上,如果配置了热插拔,则可以将 CPU 内核设置为 on/off,因此在计算要创建的桶数时,ListenCoresBucketsRatio
需要考虑此参数。
ListenCoresBucketsRatio
可以在接受新连接时提高可扩展性 is/becomes 瓶颈。在具有大量 CPU 内核的系统上,启用此 feature 已经过测试,可显示出显着的性能提升和更短的响应时间。
必须至少有两倍于 CPU 内核的 CPU 内核数量才能活动。建议的比率为8
,因此在使用此 value 时,运行时至少应有16
个核心。需要为每个目标系统计算获得最大 performance 的正确比率,测试多个值并观察 key performance metrics 中的变化。
该指令影响MinSpareThreads和MaxSpareThreads下限值的计算。子进程的数量需要是最佳接受连接的桶数的倍数。
同一 IP 地址和 port 上的多个 Listeners 或 Apache HTTP 服务器
因此,在监听 socket(s 上设置SO_REUSEPORT
选项允许多个进程(共享相同的EUID
,e.g.root
)绑定到相同的 IP 地址和 port,而不会在通常情况下由系统引发 binding 错误。
这也意味着 Apache httpd 的多个实例配置在同一个IP:port
上并且带有正ListenCoresBucketsRatio
也会在没有错误的情况下启动,然后 run 与传入连接在两个实例中均匀分布(这不是建议或任何情况下的明智用法),但只是注意到它会阻止检测到这些可能的问题)。
在同一实例中,如果在完全相同的 IP(或主机名)和 port 上配置了多个Listen
指令,Apache httpd 将检查并且无法启动,从而避免创建一些无用的并且杀死性能的重复存储桶。但是它不能(并且不会更加努力)捕获所有可能的重叠情况(例如解析为其他地方使用的 IP 的主机名)。
MaxConnectionsPerChild 指令
描述: | 限制单个子服务器在其生命周期中将处理的连接数 |
句法: | MaxConnectionsPerChild number |
默认: | MaxConnectionsPerChild 0 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware, mpmtos2 |
兼容性: | 可用 Apache HTTP Server 2.3.9 及更高版本。旧的 name MaxRequestsPerChild 仍然受支持。 |
MaxConnectionsPerChild
指令设置了对单个子服务器 process 将处理的连接数的限制。在MaxConnectionsPerChild
连接之后,子 process 将会死亡。如果MaxConnectionsPerChild
是0
,则 process 将永不过期。
将MaxConnectionsPerChild
设置为 non-zero value 会限制 process 可以消耗的 memory(意外)memory 泄漏量。
MaxMemFree 指令
描述: | 在不调用free() 的情况下允许主分配器保留的最大 memory 数量 |
句法: | MaxMemFree KBytes |
默认: | MaxMemFree 2048 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware |
MaxMemFree
指令设置允许每个分配器保持的最大空闲 Kbytes 数,而不调用free()
。在线程 MPM 中,每个线程都有自己的分配器。设置为零时,阈值将设置为无限制。
MaxRequestWorkers 指令
描述: | 将同时处理的最大连接数 |
句法: | MaxRequestWorkers number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
MaxRequestWorkers
指令设置了将要提供的同时请求数量的限制。任何超过MaxRequestWorkers
限制的连接尝试通常都会排队,最多为基于将 ListenBackLog指令的数字。一旦在另一个请求结束时释放子 process,则将为该连接提供服务。
对于 non-threaded 服务器(i.e.,预派生),MaxRequestWorkers
转换为将为服务请求启动的最大子进程数。默认的 value 是256
;为了增加它,你还必须提高将 ServerLimit。
对于线程和混合服务器(e.g.事件或工人),MaxRequestWorkers
限制可用于为客户端提供服务的线程总数。对于混合 MPM,默认 value 是16
(将 ServerLimit)乘以25
(ThreadsPerChild)的 value。因此,要将MaxRequestWorkers
增加到需要超过 16 个进程的 value,还必须引发将 ServerLimit。
在 version 2.3.13 之前MaxRequestWorkers
被称为MaxClients
。旧的 name 仍然受支持。
MaxSpareThreads 指令
描述: | 最大 idle 线程数 |
句法: | MaxSpareThreads number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker, mpm_netware, mpmtos2 |
最大 idle 线程数。不同的 MPM 以不同的方式处理该指令。
对于工人和事件,默认值为MaxSpareThreads 250
。这些 MPM 以 server-wide 为基础处理 idle 线程。如果服务器中有太多的 idle 线程,则子进程将被终止,直到 idle 线程的数量小于此数量。如果启用了ListenCoresBucketsRatio,则可能会创建其他 processes/threads。
对于mpm_netware,默认值为MaxSpareThreads 100
。由于此 MPM 运行 single-process,备用线程计数也是 server-wide。
mpmtos2的作用类似于mpm_netware。对于mpmtos2,默认 value 是10
。
限制
MaxSpareThreads
value 的范围受到限制。 Apache httpd 将根据以下规则自动更正给定的 value:
- mpm_netware希望 value 大于MinSpareThreads。
- 对于工人和事件,value 必须大于或等于MinSpareThreads和ThreadsPerChild的总和。
参见
- MinSpareThreads
- StartServers
- MaxSpareServers
MinSpareThreads 指令
描述: | 可用于处理请求峰值的最小 idle 线程数 |
句法: | MinSpareThreads number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker, mpm_netware, mpmtos2 |
处理请求峰值的最小 idle 线程数。不同的 MPM 以不同的方式处理该指令。
工人和事件使用MinSpareThreads 75
的默认值并在 server-wide 基础上处理 idle 线程。如果服务器中没有足够的 idle 线程,则会创建子进程,直到 idle 线程的数量大于 number。如果启用了ListenCoresBucketsRatio,则可能会创建其他 processes/threads。
mpm_netware使用默认值MinSpareThreads 10
,因为它是一个 single-process MPM,所以在 server-wide 基础上跟踪它。
mpmtos2的作用类似于mpm_netware。对于mpmtos2,默认 value 是5
。
参见
- MaxSpareThreads
- StartServers
- 比 MinSpareServers
PidFile 指令
描述: | 服务器记录守护程序的 process ID 的文件 |
句法: | PidFile filename |
默认: | PidFile logs/httpd.pid |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpmtos2 |
PidFile
指令设置服务器记录守护程序的 process id 的文件。如果文件名不是绝对的,则假定它相对于ServerRoot。
例
PidFile /var/run/apache.pid
能够向服务器发送信号通常很有用,这样它就会关闭,然后 re-opens 和TransferLog,这是通过向PidFile
中列出的 process id 发送 SIGHUP(kill -1)信号来完成的。
PidFile
受_log 文件放置和安全的相同警告。
注意
从 Apache HTTP Server 2 开始,我们建议您仅使用脚本或 OS 提供的 init 脚本(re-)starting 或停止服务器)。
ReceiveBufferSize 指令
描述: | TCP 接收缓冲区大小 |
句法: | ReceiveBufferSize bytes |
默认: | ReceiveBufferSize 0 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware, mpmtos2 |
服务器将 TCP 接收缓冲区大小设置为指定的字节数。
如果设置为0
的 value,则服务器将使用 OS 默认值。
ScoreBoardFile 指令
描述: | 用于存储子进程的协调数据的文件的位置 |
句法: | ScoreBoardFile file-path |
默认: | ScoreBoardFile logs/apache_runtime_status |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt |
Apache HTTP Server 使用记分板在其 parent 和子进程之间进行通信。某些体系结构需要一个文件来促进此通信。如果未指定文件,Apache httpd 首先尝试完全在 memory 中创建记分板(使用匿名共享 memory),如果失败,将尝试在磁盘上创建文件(使用 file-based shared memory)。指定此指令会导致 Apache httpd 始终在磁盘上创建该文件。
例
ScoreBoardFile /var/run/apache_runtime_status
File-based shared memory 对需要直接访问记分板的 third-party applications 非常有用。
如果使用ScoreBoardFile
,则可以通过将其放在 RAM 磁盘上来提高速度。但请注意,您应注意有关 log 文件放置和安全的相同警告。
参见
- 停止并重新启动 Apache HTTP Server
SendBufferSize 指令
描述: | TCP 缓冲区大小 |
句法: | SendBufferSize bytes |
默认: | SendBufferSize 0 |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpm_winnt, mpm_netware, mpmtos2 |
将服务器的 TCP 发送缓冲区大小设置为指定的字节数。在高速,高延迟连接(i.e.,100ms 左右,例如横贯大陆的快速管道)上将其设置为超过 OS 的标准默认值值通常很有用。
如果设置为0
的 value,则服务器将使用 OS 提供的默认 value。
可能需要进一步配置操作系统,以便在高速,高延迟连接上获得更好的性能。
在某些操作系统上,除非将EnableSendfile设置为 OFF,否则可能无法看到由较大的SendBufferSize
导致的 TCP 行为的更改。此交互仅适用于静态 files。
ServerLimit 指令
描述: | 可配置进程数的上限 |
句法: | ServerLimit number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork |
对于预派生 MPM,此指令为 Apache httpd process 的生命周期设置MaxRequestWorkers的最大配置 value。对于工人和事件 MPM,此指令与将 ThreadLimit _set 一起为 Apache httpd process 的生存期设置了MaxRequestWorkers的最大配置 value。对于事件 MPM,此指令还定义了多少旧服务器进程可以保持 running 并完成处理打开的连接。任何在重新启动期间更改此指令的尝试都将被忽略,但在重新启动期间可以修改MaxRequestWorkers。
使用此指令时必须特别小心。如果将ServerLimit
设置为远高于所需的 value,则将分配额外的未使用的共享 memory。如果ServerLimit
和MaxRequestWorkers都设置为高于系统可以处理的值,Apache httpd 可能无法启动或系统可能变得不稳定。
使用预派生 MPM 时,仅当需要将MaxRequestWorkers设置为高于 256(默认值)时才使用此指令。不要将此指令的 value 设置为高于您可能想要设置MaxRequestWorkers的值。
使用工人时,仅当MaxRequestWorkers和ThreadsPerChild设置需要 16 个以上的服务器进程(默认)时才使用此指令。不要将此指令的 value 设置为高于MaxRequestWorkers和ThreadsPerChild所需的服务器进程数。
如果MaxRequestWorkers和ThreadsPerChild设置定义的 process 数加上正常关闭进程的数量超过 16 个服务器进程(默认值),则使用事件增加此指令。
注意
编译到服务器的ServerLimit 20000
硬限制(对于预派生 MPM 200000)。这是为了避免由错别字引起的恶劣影响。要进一步增加它超过此限制,您需要修改 mpm 源文件中 MAX_SERVER_LIMIT 的 value 并重建服务器。
参见
- 停止并重新启动 Apache HTTP Server
StartServers 指令
描述: | 启动时创建的子服务器进程数 |
句法: | StartServers number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker,prefork, mpmtos2 |
StartServers
指令设置启动时创建的子服务器进程数。由于根据负载动态控制进程数,(参见MinSpareThreads,MaxSpareThreads,比 MinSpareServers,MaxSpareServers)通常没有理由调整此参数。
默认 value 不同于 MPM 到 MPM。工人和事件默认为StartServers 3
;预派生默认为5
; mpmtos2默认为2
。
StartThreads 指令
描述: | 启动时创建的线程数 |
句法: | StartThreads number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | mpm_netware |
启动时创建的线程数。由于线程数是根据负载动态控制的(参见MinSpareThreads,MaxSpareThreads,比 MinSpareServers,MaxSpareServers),因此通常没有理由调整此参数。
对于mpm_netware,默认值为StartThreads 50
,并且由于只有一个 process,因此这是在启动时为请求提供服务时创建的线程总数。
ThreadLimit 指令
描述: | 设置每个子 process 的可配置线程数的上限 |
句法: | ThreadLimit number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker, mpm_winnt |
该指令为 Apache httpd process 的生命周期设置了ThreadsPerChild的最大配置 value。任何在重新启动期间更改此指令的尝试都将被忽略,但是在重新启动期间可以修改ThreadsPerChild直到此指令的 value。
使用此指令时必须特别小心。如果ThreadLimit
设置为远高于ThreadsPerChild的 value,则将分配额外未使用的共享 memory。如果ThreadLimit
和ThreadsPerChild都设置为高于系统可以处理的值,Apache httpd 可能无法启动或系统可能变得不稳定。对于 Apache httpd 的当前 run,不要将此指令的 value 设置为高于ThreadsPerChild的最大预测设置。
当与mpm_winnt和64
一起使用时,ThreadLimit
的默认值为1920
。
注意
服务器中存在ThreadLimit 20000
(或ThreadLimit 100000
,,ThreadLimit 15000
,mpm_winnt)的硬限制。这是为了避免由错别字引起的恶劣影响。要进一步增加它超过此限制,您需要修改 mpm 源文件中的 MAX_THREAD_LIMIT 的 value 并重建服务器。
ThreadsPerChild 指令
描述: | 每个子 process 创建的线程数 |
句法: | ThreadsPerChild number |
默认: | See usage for details |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker, mpm_winnt |
该指令设置每个子 process 创建的线程数。孩子在启动时创建这些线程,永远不会创建更多。如果使用像mpm_winnt这样的 MPM,其中只有一个子 process,这个数字应该足够高,以处理服务器的整个负载。如果使用像工人这样的 MPM,其中有多个子进程,则线程总数应足够高,以处理服务器上的 common 负载。
当与mpm_winnt和25
一起使用时,ThreadsPerChild
的默认值为64
。
ThreadsPerChild
的 value 不能超过将 ThreadLimit的 value。如果配置了更高的 value,它将在 start-up 处自动缩小,并将记录警告。这两个指令之间的关系在将 ThreadLimit中解释。
ThreadStackSize 指令
描述: | 处理 client 连接的线程使用的堆栈大小(以字节为单位) |
句法: | ThreadStackSize size |
默认: | 65536 on NetWare; varies on other operating systems |
Context: | 服务器配置 |
状态: | MPM |
模块: | event,worker, mpm_winnt, mpm_netware, mpmtos2 |
兼容性: | 可在 Apache HTTP Server 2.1 及更高版本中使用 |
ThreadStackSize
指令设置处理 client 连接和调用模块以帮助处理这些连接的线程的堆栈(用于自动数据)的大小。在大多数情况下,堆栈大小的操作系统默认值是合理的,但在某些情况下可能需要调整:
- 在具有相对较小的默认线程堆栈大小(e.g.,HP-UX)的平台上,Apache httpd 在使用一些使用相对大量自动数据存储的 third-party 模块时可能会崩溃。那些相同的模块可能在默认线程堆栈大小较大的其他平台上运行良好。通过将
ThreadStackSize
设置为高于操作系统默认值的 value 来解决此类崩溃。仅当 third-party 模块的提供程序指定它是必需的,或者如果 Apache httpd 崩溃的诊断指示线程堆栈大小太小,则此类调整是必需的。 - 在默认线程堆栈大小远远大于 web 服务器 configuration 所需的平台上,如果
ThreadStackSize
设置为低于操作系统默认值的 value,则每个子 process 的线程数可以更多。这种类型的调整只应在允许完整的 web 服务器处理集的测试环境中进行,因为可能存在需要更多堆栈来处理的不频繁请求。所需的最小堆栈大小很大程度上取决于所使用的模块,但 web 服务器 configuration 中的任何更改都可能使当前的ThreadStackSize
设置无效。 - 在 Linux 上,此指令只能用于增加默认堆栈大小,因为底层系统调用使用 value 作为最小堆栈大小。
ulimit -s
(通常较大)的软限制(如果无限制,则为 8MB)用作默认堆栈大小。
除非需要每个子 process 的大量线程,否则建议不要减少ThreadStackSize
。在某些平台(包括 Linux)上,128000 的设置已经太低,导致某些 common 模块崩溃。