<-
Apache > HTTP服务器 > 文档 > V2.0 > 模块

Apache MPM 公共指令

说明收集了被多个多路处理模块(MPM)实现的公共指令
状态MPM
top

AcceptMutex 指令

说明 Apache用于串行化多个子进程在(多个)网络套接字上接受请求的方法
语法AcceptMutex Default|method
默认值AcceptMutex Default
作用域server config
状态MPM
模块leader, perchild, prefork, threadpool, worker

AcceptMutex指令用于设置串行化多个子进程在(多个)网络套接字上接受请求的方法。在2.0版本以前,只能在编译时设定此方法。应当在这里使用的最佳方法取决于不同的硬件体系结构和操作系统。欲知详情,请参见性能调节文档。

如果设置为"Default",那么将会使用编译时自动选择的默认值。其他可用的方法在下面列出。注意,并不是所有的方法在所有的平台上都是可用的,如果指定了一个不可用的方法,将会在错误日志中记录下这个不可用的方法。

flock
这种方法调用系统函数flock(2)来锁定一个加锁文件(其位置取决于LockFile指令)。
fcntl
这种方法调用系统函数fcntl(2)来锁定一个加锁文件(其位置取决于LockFile指令)。
posixsem
(2.0及更新版本)这种方法使用了POSIX信号灯。如果一个运行中的线程占有了互斥segfaults,则信号灯的所有者将不会被恢复,从而导致服务器的挂起和失去响应。
pthread
(1.3及更新版本)这种方法使用了POSIX互斥,按理应该可以用于所有完整实现了POSIX线程规范的体系中,但是似乎只能在Solaris2.5及更新版本中,甚至只能在某种配置下正常运作。如果遇到这种情况,则应该提防服务器的挂起和失去响应。只提供静态内容的服务器可能不受影响。
sysvsem
(1.3及更新版本)这种方案使用SysV-style的信号灯以实现互斥。不幸的是,SysV-style的信号灯有一些副作用,其一是,Apache有可能不能在结束以前释放这种信号灯(见ipcs(8) man page),另外,这种信号灯API给与网络服务器有相同uid的CGI提供了拒绝服务攻击的机会(所有CGI,除非用了类似suexeccgiwrapper)。有鉴于此,在多数体系中都不用这种方法,除了IRIX(因为前两种方法在IRIX中代价太高)。

如果你想知道编译时自动选择的默认值,你可以将LogLevel设为"debug",这样默认的AcceptMutex就会记录到ErrorLog中。

top

BS2000Account 指令

说明 在BS2000机器上定义无特权帐户
语法BS2000Account account
作用域server config
状态MPM
模块perchild, prefork
兼容性 仅用于 BS2000 机器

BS2000Account指令仅仅允许用于BS2000主机。它必须被用来定义无特权的Apache子进程的帐户(用User指令定义的用户)编号。因为BS2000 POSIX子系统需要它来防止CGI脚本访问启动Apache父进程的特权帐号(通常是SYSROOT)所拥有的资源。

注意

只能使用一条BS2000Account指令。

参见

top

CoreDumpDirectory 指令

说明 Apache使用的内核转储目录
语法CoreDumpDirectory directory
默认值See usage for the default setting
作用域server config
状态MPM
模块beos, leader, mpm_winnt, perchild, prefork, threadpool, worker

这个指令用于控制Apache使用的内核转储目录。默认位于ServerRoot下,因为这个目录通常对于运行服务器的用户时不可写的,内核转储一般也就不会写入内容。如果你在调试中需要内核转储,你可以用这个指令来指定另外一个目录。

Linux上的内核转储

如果Apache以root身份启动并切换至其他用户,即使指定的转储目录对进程是可写的,Linux内核也将禁止Apache进行内核转储。但是Apache2.0.46及以后版本在你明确指定CoreDumpDirectory的情况下,能够在Linux2.4以上的版本中强制实现内核转储。

top

EnableExceptionHook 指令

说明 在子进程崩溃以后启用一个钩子来运行异常处理程序
语法EnableExceptionHook On|Off
默认值EnableExceptionHook Off
作用域server config
状态MPM
模块leader, perchild, prefork, threadpool, worker
兼容性 适用于2.0.49及以后版本

因为安全原因,这个指令只在编译时使用了"--enable-exception-hook"选项的情况下才可用。它会在一个子进程崩溃以后启用一个钩子(hook)来运行一个外部模块以做些后继处理。

目前有两个模块(mod_whatkilledusmod_backtrace)可以被钩子使用。请参见Jeff Trawick的EnableExceptionHook site 来获得更多信息。

top

Group 指令

说明 对请求提供服务的Apache子进程运行时的用户组
语法Group unix-group
默认值Group #-1
作用域server config
状态MPM
模块beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
兼容性 只对全局配置有效

Group指令指定了用于对客户端请求提供服务的Apache子进程运行时的用户组。为了使用这个指令,Apache必须以root初始化启动,否则在切换用户组时会失败,并以初始化启动时的用户组运行。Unix-group是以下之一:

用户组的名称
通过名称引用组。
"#"号后跟一个组编号(GID)
通过编号引用组。

举例

Group www-group

建议你专门为Apache服务器建立一个新的用户组。一些管理员使用nobody用户,但是这并非总是可用或是合适的。

安全提示

不要将Group (或User)设置成root,除非你明确的知道你在作什么,并且明白其风险所在。

特别提示:在<VirtualHost>段中使用该指令已经不再被支持了。你可以使用suexecSuexecUserGroup指令来达到这个目的。

注意

虽然Group指令存在于beosmpmt_os2MPM中,但是事实上没用任何用处,不过是为了兼容性做了个摆饰。

top

Listen 指令

说明 服务器监听的IP地址和端口
语法Listen [IP-address:]portnumber
作用域server config
状态MPM
模块beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
兼容性 Apache2.0以后必须设置的指令

Listen指令指示Apache只在指定的IP地址和端口上监听;默认情况下Apache会在所有IP地址上监听。Listen是一个必须设置的指令。如果在配置文件中找不到这个指令,服务器将无法启动。这和先前的版本不一样。

Listen指令指定服务器在那个端口或地址和端口的组合上监听接入请求。如果只指定一个端口,服务器将在所有地址上监听该端口。如果指定了地址和端口的组合,服务器将在指定地址的指定端口上监听。

使用多个Listen指令可以指定多个不同的监听端口和/或地址端口组合。服务器将会对列出的所有端口和地址端口组合上的请求作出应答。

例如,想要服务器接受80和8000端口上的请求,可以这样设置:

Listen 80
Listen 8000

为了让服务器在两个确定的地址端口组合上接受请求,可以这样设置:

Listen 192.170.2.1:80
Listen 192.170.2.5:8000

IPv6地址必须像下面的例子一样,用方括号括起来:

Listen [fe80::a00:20ff:fea7:ccea]:80

错误条件

多个Listen指令指定了同一个地址和端口的组合后,会导致"Address already in use"错误。

参见

top

ListenBackLog 指令

说明 半链接(pending connection)队列的最大长度
语法ListenBacklog backlog
默认值ListenBacklog 511
作用域server config
状态MPM
模块beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker

半链接(pending connection)队列的最大长度。一般不需要调整此项参数,然而在一些系统上,必须增大此值以抵御TCP SYN 洪水攻击。参见操作系统的listen(2)系统调用的后备参数。

操作系统常常将此值限制为一个较小的数字,具体根据操作系统的不同而不同。需要注意的是,许多操作系统并正好不使用后备数值,而是取决于设置的值(通常大于后备值)。

top

LockFile 指令

说明 接受串行锁文件的位置
语法LockFile filename
默认值LockFile logs/accept.lock
作用域server config
状态MPM
模块leader, perchild, prefork, threadpool, worker

LockFile指令设置当AcceptMutex指令的值是fcntlflock的时候,Apache使用的锁文件的位置。该指令通常保持它的默认值。需要改变默认值的主要原因是位于一个NFS文件系统上,因为锁文件必须位于本地磁盘上。主服务器进程的PID会自动添加到文件名后面。

安全

最好不要将此文件放在任何人都可以具有写权限的目录(比如:/var/tmp)中,因为别人可以通过建立一个与服务器企图建立的锁文件同名的文件,来阻止服务器启动,从而造成一个拒绝服务攻击。

参见

top

MaxClients 指令

说明 允许同时伺服的最大接入请求数量
语法MaxClients number
默认值See usage for details
作用域server config
状态MPM
模块beos, leader, prefork, threadpool, worker

MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令设置的最大值限制为止。一旦一个链接被释放,队列中的请求将得到服务。

对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量。默认值是256。要增大这个值,你必须同时增大ServerLimit

对于线程型或者混合型的MPM(也就是beosworker), MaxClients表示可以用于伺服客户端请求的最大线程数量。线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。

top

MaxMemFree 指令

说明 主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(KB)
语法MaxMemFree KBytes
默认值MaxMemFree 0
作用域server config
状态MPM
模块beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt

MaxMemFree指令用于设置主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(KB)。若未设置或设置为"0",将表示无限。

top

MaxRequestsPerChild 指令

说明 每个子进程在其生存期内允许伺服的最大请求数量
语法MaxRequestsPerChild number
默认值MaxRequestsPerChild 10000
作用域server config
状态MPM
模块leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker

MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild设为"0",子进程将永远不会结束。

不同的默认值

mpm_netwarempm_winnt的默认值是"0"。

MaxRequestsPerChild设置成非零值有两个好处:

注意

对于KeepAlive的链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

top

MaxSpareThreads 指令

说明 最大空闲线程数
语法MaxSpareThreads number
默认值See usage for details
作用域server config
状态MPM
模块beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker

设置最大空闲线程数。不同的MPM对这个指令的处理是不一样的:

perchild的默认值是"MaxSpareThreads 10"。这个MPM基于每个子进程监视空闲线程数。如果某个子进程中的空闲线程太多,服务器将杀死多余的空闲线程。

worker, leaderthreadpool的默认值是"MaxSpareThreads 250"。这些MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。

mpm_netware的默认值是"MaxSpareThreads 100"。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。

beosmpmt_os2的工作方式与mpm_netware差不多,beos的默认值是"MaxSpareThreads 50";mpmt_os2的默认值是"MaxSpareThreads 10"。

限制

MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:

参见

top

MinSpareThreads 指令

说明 最小空闲线程数
语法MinSpareThreads number
默认值See usage for details
作用域server config
状态MPM
模块beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker

设置最小空闲线程数。不同的MPM对这个指令的处理是不一样的:

perchild的默认值是"MinSpareThreads 5"。这个MPM基于每个子进程监视空闲线程数。如果某个子进程中的空闲线程数太少,服务器将在其中创建新的线程。这样,如果你将NumServers设置为"10"并将MinSpareThreads设置为"5",系统将至少拥有50个空闲线程。

worker, leaderthreadpool的默认值是"MinSpareThreads 75"。这些MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

mpm_netware的默认值是"MinSpareThreads 10"。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。

beosmpmt_os2的工作方式与mpm_netware差不多,beos的默认值是"MinSpareThreads 1";mpmt_os2的默认值是"MinSpareThreads 5"。

参见

top

PidFile 指令

说明 服务器用于记录父进程(监控进程)PID的文件
语法PidFile filename
默认值PidFile logs/httpd.pid
作用域server config
状态MPM
模块beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker

PidFile指令设置服务器用于记录父进程(监控进程)PID的文件。如果指定的不是绝对路径,那么将视为基于ServerRoot的相对路径。

例子

PidFile /var/run/apache.pid

这个文件通常用来便于给服务器父进程发送一个信号,用于关闭或重启服务器,以重新打开ErrorLogTransferLog文件、重新读取配置文件。这些可以通过发送一个"SIGHUP"(kill -1)信号到PidFile记录的进程UID。

PidFile和其他日志文件一样要注意放置位置和安全问题。

注意

从Apache2开始,推荐使用apachectl脚本来启动或停止服务器。

top

ScoreBoardFile 指令

说明 存储子进程协调数据(coordination data)的文件
语法ScoreBoardFile file-path
默认值ScoreBoardFile logs/apache_status
作用域server config
状态MPM
模块beos, leader, mpm_winnt, perchild, prefork, threadpool, worker

Apache使用记分板(scoreboard)在父进程和子进程之间进行通信。一些体系结构要求有一个文件来帮助通信。如果未指定这个文件,Apache会首先尝试在匿名共享内存中建立完整的记分板(scoreboard),若失败,将继续尝试使用基于文件的共享存储器在磁盘上建立这个文件。若利用这个指令指定这个文件的位置,则Apache将总是在磁盘上建立这个文件。

例子

ScoreBoardFile /var/run/apache_status

基于文件的共享存储器对于使用直接访问记分板(scoreboard)的第三方程序是很有用的。

如果你将ScoreBoardFile放置在RAM disk中,你将会发现对速度提升有很大帮助。但是同其他日志文件一样也要注意放置位置和安全问题。

参见

top

SendBufferSize 指令

说明 TCP缓冲区大小(字节)
语法SendBufferSize bytes
默认值SendBufferSize 0
作用域server config
状态MPM
模块beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker

服务器将会通过这个指令设置TCP缓冲区的大小(字节)。提高这个值会导致两个后果:高速度和高潜伏时间(100ms左右)。

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

top

ServerLimit 指令

说明 服务器允许配置的进程数上限
语法ServerLimit number
默认值See usage for details
作用域server config
状态MPM
模块leader, perchild, prefork, threadpool, worker

对于preforkMPM,这个指令设置了MaxClientsfor the lifetime of the Apache process最大允许配置的数值。对于workerMPM,这个指令和ThreadLimit结合使用设置了MaxClients for the lifetime of the Apache process最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。

使用这个指令时要特别当心。如果将ServerLimit设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimitMaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。

对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。

对于worker, leaderthreadpoolMPM,只有在你需要将MaxClientsThreadsPerChild设置成需要超过默认16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients ThreadsPerChild需要的子进程数量高。

对于perchildMPM,只有在你需要将NumServers设置成高于默认值8的时候才需要使用这个指令。

注意

Apache在编译时内部有一个硬性的限制"ServerLimit 20000"。你不能超越这个限制。

参见

top

StartServers 指令

说明 服务器启动时建立的子进程数
语法StartServers number
默认值See usage for details
作用域server config
状态MPM
模块leader, mpmt_os2, prefork, threadpool, worker

StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。

不同的MPM默认值也不一样。对于leader, threadpoolworker默认值是"3"。对于prefork默认值是"5",mpmt_os2是"2"。

top

StartThreads 指令

说明 服务器启动时建立的线程数
语法StartThreads number
默认值See usage for details
作用域server config
状态MPM
模块beos, mpm_netware, perchild

设置了服务器启动时建立的线程数量。因为线程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。

对于perchild,默认值是"StartThreads 5",并平均分配给各个进程。

对于mpm_netware,默认值是"StartThreads 50",由于只有一个进程,所有所有的线程都将用于伺服请求。

对于beos,默认值是"StartThreads 10",同样所有所有的线程都将用于伺服请求。

top

ThreadLimit 指令

说明 每个子进程可配置的线程数上限
语法ThreadLimit number
默认值See usage for details
作用域server config
状态MPM
模块leader, mpm_winnt, perchild, threadpool, worker
兼容性 仅用于2.0.41及以后版本的mpm_winnt

这个指令设置了每个子进程的可配置的线程数ThreadsPerChild的上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。

使用这个指令时要特别当心。如果将ThreadLimit设置成一个高出ThreadsPerChild实际需要很多的值,将会有过多的共享内存被分配。如果将ThreadLimitThreadsPerChild设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。

对于mpm_winntThreadLimit的默认值是1920;对于其他MPM这个值是64

注意

Apache在编译时内部有一个硬性的限制"ThreadLimit 20000"(对于mpm_winnt是"ThreadLimit 15000"),你不能超越这个限制。

top

ThreadsPerChild 指令

说明 每个子进程建立的线程数
语法ThreadsPerChild number
默认值See usage for details
作用域server config
状态MPM
模块leader, mpm_winnt, threadpool, worker

这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。如果使用一个类似于mpm_winnt只有一个子进程的MPM,这个数值要足够大,以便可以处理可能的请求高峰。如果使用一个类似于worker有多个子进程的MPM,每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。

对于mpm_winntThreadsPerChild的默认值是64;对于其他MPM是25

top

User 指令

说明 实际服务于请求的子进程运行时的用户
语法User unix-userid
默认值User #-1
作用域server config
状态MPM
模块leader, perchild, prefork, threadpool, worker
兼容性 2.0版本起只在全局服务器配置中可用

User指令用于设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。如果你以非root身份启动服务器,子进程将不能够切换至非特权用户,并仍然以启动服务器的原始用户的身份运行。如果确实以root用户启动了服务器,那么父进程将仍然以root身份运行。Unix-userid 是下列值之一:

一个用户名
通过用户名引用用户
"#"号后面跟一个用户编号
通过用户编号引用用户

用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问哪些不想为外界所知道的文件,同样的,该用户亦需没有执行哪些不应当被外界执行的程序的权限。强烈推荐你专门为Apache子进程建立一个单独的用户和组。一些管理员使用nobody用户,但是这并不能总是符合要求,因为可能有其他程序使用这个用户。

安全

不要将User (或Group)设置成root,除非你明确的知道你在作什么,并且明白其风险所在。

使用perchildMPM(不同的虚拟主机以不同的UID运行)时,User指令定义了"主服务器"和不含AssignUserID指令的<VirtualHost>段的UID。

特别提示:在<VirtualHost>段中使用该指令已经不再被支持了。你可以使用suexecSuexecUserGroup指令来达到这个目的。

注意

虽然User指令存在与beosmpmt_os2MPM中,但是只是为了保持兼容性而没有任何用处。