Apache HTTP服务器V2.0

| 说明 | Apache用于串行化多个子进程在(多个)网络套接字上接受请求的方法 |
|---|---|
| 语法 | AcceptMutex Default|method |
| 默认值 | AcceptMutex Default |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, perchild, prefork, threadpool, worker |
AcceptMutex指令用于设置串行化多个子进程在(多个)网络套接字上接受请求的方法。在2.0版本以前,只能在编译时设定此方法。应当在这里使用的最佳方法取决于不同的硬件体系结构和操作系统。欲知详情,请参见性能调节文档。
如果设置为"Default",那么将会使用编译时自动选择的默认值。其他可用的方法在下面列出。注意,并不是所有的方法在所有的平台上都是可用的,如果指定了一个不可用的方法,将会在错误日志中记录下这个不可用的方法。
flockLockFile指令)。fcntlLockFile指令)。posixsempthreadsysvsemipcs(8) man page),另外,这种信号灯API给与网络服务器有相同uid的CGI提供了拒绝服务攻击的机会(所有CGI,除非用了类似suexec或cgiwrapper)。有鉴于此,在多数体系中都不用这种方法,除了IRIX(因为前两种方法在IRIX中代价太高)。如果你想知道编译时自动选择的默认值,你可以将LogLevel设为"debug",这样默认的AcceptMutex就会记录到ErrorLog中。
| 说明 | 在BS2000机器上定义无特权帐户 |
|---|---|
| 语法 | BS2000Account account |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | perchild, prefork |
| 兼容性 | 仅用于 BS2000 机器 |
BS2000Account指令仅仅允许用于BS2000主机。它必须被用来定义无特权的Apache子进程的帐户(用User指令定义的用户)编号。因为BS2000 POSIX子系统需要它来防止CGI脚本访问启动Apache父进程的特权帐号(通常是SYSROOT)所拥有的资源。
只能使用一条BS2000Account指令。
| 说明 | Apache使用的内核转储目录 |
|---|---|
| 语法 | CoreDumpDirectory directory |
| 默认值 | See usage for the default setting |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, leader, mpm_winnt, perchild, prefork, threadpool, worker |
这个指令用于控制Apache使用的内核转储目录。默认位于ServerRoot下,因为这个目录通常对于运行服务器的用户时不可写的,内核转储一般也就不会写入内容。如果你在调试中需要内核转储,你可以用这个指令来指定另外一个目录。
如果Apache以root身份启动并切换至其他用户,即使指定的转储目录对进程是可写的,Linux内核也将禁止Apache进行内核转储。但是Apache2.0.46及以后版本在你明确指定CoreDumpDirectory的情况下,能够在Linux2.4以上的版本中强制实现内核转储。
| 说明 | 在子进程崩溃以后启用一个钩子来运行异常处理程序 |
|---|---|
| 语法 | EnableExceptionHook On|Off |
| 默认值 | EnableExceptionHook Off |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, perchild, prefork, threadpool, worker |
| 兼容性 | 适用于2.0.49及以后版本 |
因为安全原因,这个指令只在编译时使用了"--enable-exception-hook"选项的情况下才可用。它会在一个子进程崩溃以后启用一个钩子(hook)来运行一个外部模块以做些后继处理。
目前有两个模块(mod_whatkilledus和mod_backtrace)可以被钩子使用。请参见Jeff Trawick的EnableExceptionHook site 来获得更多信息。
| 说明 | 对请求提供服务的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>段中使用该指令已经不再被支持了。你可以使用suexec的 SuexecUserGroup指令来达到这个目的。
| 说明 | 服务器监听的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"错误。| 说明 | 半链接(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)系统调用的后备参数。
操作系统常常将此值限制为一个较小的数字,具体根据操作系统的不同而不同。需要注意的是,许多操作系统并正好不使用后备数值,而是取决于设置的值(通常大于后备值)。
| 说明 | 接受串行锁文件的位置 |
|---|---|
| 语法 | LockFile filename |
| 默认值 | LockFile logs/accept.lock |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, perchild, prefork, threadpool, worker |
LockFile指令设置当AcceptMutex指令的值是fcntl或flock的时候,Apache使用的锁文件的位置。该指令通常保持它的默认值。需要改变默认值的主要原因是位于一个NFS文件系统上,因为锁文件必须位于本地磁盘上。主服务器进程的PID会自动添加到文件名后面。
最好不要将此文件放在任何人都可以具有写权限的目录(比如:/var/tmp)中,因为别人可以通过建立一个与服务器企图建立的锁文件同名的文件,来阻止服务器启动,从而造成一个拒绝服务攻击。
| 说明 | 允许同时伺服的最大接入请求数量 |
|---|---|
| 语法 | MaxClients number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, leader, prefork, threadpool, worker |
MaxClients指令设置了允许同时伺服的最大接入请求数量。任何超过MaxClients限制的请求都将进入等候队列,直到达到ListenBacklog指令设置的最大值限制为止。一旦一个链接被释放,队列中的请求将得到服务。
对于非线程型的MPM(也就是prefork),MaxClients表示可以用于伺服客户端请求的最大子进程数量。默认值是256。要增大这个值,你必须同时增大ServerLimit。
对于线程型或者混合型的MPM(也就是beos或worker), MaxClients表示可以用于伺服客户端请求的最大线程数量。线程型的beos的默认值是50。对于混合型的MPM默认值是16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要将MaxClients增加到超过16个进程才能提供的时候,你必须同时增加ServerLimit的值。
| 说明 | 主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(KB) |
|---|---|
| 语法 | MaxMemFree KBytes |
| 默认值 | MaxMemFree 0 |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt |
MaxMemFree指令用于设置主内存分配程序在未调用free()的情况下允许持有的最大自由内存数量(KB)。若未设置或设置为"0",将表示无限。
| 说明 | 每个子进程在其生存期内允许伺服的最大请求数量 |
|---|---|
| 语法 | MaxRequestsPerChild number |
| 默认值 | MaxRequestsPerChild 10000 |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker |
MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild设为"0",子进程将永远不会结束。
mpm_netware和mpm_winnt的默认值是"0"。
将MaxRequestsPerChild设置成非零值有两个好处:
对于KeepAlive的链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。
| 说明 | 最大空闲线程数 |
|---|---|
| 语法 | MaxSpareThreads number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker |
设置最大空闲线程数。不同的MPM对这个指令的处理是不一样的:
perchild的默认值是"MaxSpareThreads 10"。这个MPM基于每个子进程监视空闲线程数。如果某个子进程中的空闲线程太多,服务器将杀死多余的空闲线程。
worker, leader和threadpool的默认值是"MaxSpareThreads 250"。这些MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
mpm_netware的默认值是"MaxSpareThreads 100"。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。
beos和mpmt_os2的工作方式与mpm_netware差不多,beos的默认值是"MaxSpareThreads 50";mpmt_os2的默认值是"MaxSpareThreads 10"。
MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:
perchild要求MaxSpareThreads小于等于ThreadLimitmpm_netware要求MaxSpareThreads大于MinSpareThreadsleader, threadpool, worker要求MaxSpareThreads大于等于MinSpareThreads加上ThreadsPerChild的和| 说明 | 最小空闲线程数 |
|---|---|
| 语法 | 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, leader和threadpool的默认值是"MinSpareThreads
75"。这些MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
mpm_netware的默认值是"MinSpareThreads 10"。既然这个MPM只运行单独一个子进程,此MPM当然亦基于整个服务器监视空闲线程数。
beos和mpmt_os2的工作方式与mpm_netware差不多,beos的默认值是"MinSpareThreads 1";mpmt_os2的默认值是"MinSpareThreads 5"。
| 说明 | 服务器用于记录父进程(监控进程)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
这个文件通常用来便于给服务器父进程发送一个信号,用于关闭或重启服务器,以重新打开ErrorLog和TransferLog文件、重新读取配置文件。这些可以通过发送一个"SIGHUP"(kill -1)信号到PidFile记录的进程UID。
PidFile和其他日志文件一样要注意放置位置和安全问题。
从Apache2开始,推荐使用apachectl脚本来启动或停止服务器。
| 说明 | 存储子进程协调数据(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中,你将会发现对速度提升有很大帮助。但是同其他日志文件一样也要注意放置位置和安全问题。
| 说明 | TCP缓冲区大小(字节) |
|---|---|
| 语法 | SendBufferSize bytes |
| 默认值 | SendBufferSize 0 |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker |
服务器将会通过这个指令设置TCP缓冲区的大小(字节)。提高这个值会导致两个后果:高速度和高潜伏时间(100ms左右)。
如果设置为"0",将使用操作系统默认值。
| 说明 | 服务器允许配置的进程数上限 |
|---|---|
| 语法 | 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设置成一个高出实际需要许多的值,将会有过多的共享内存被分配。如果将ServerLimit和MaxClients设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。
对于preforkMPM,只有在你需要将MaxClients设置成高于默认值256的时候才需要使用这个指令。要将此指令的值保持和MaxClients一样。
对于worker, leader和threadpoolMPM,只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。
对于perchildMPM,只有在你需要将NumServers设置成高于默认值8的时候才需要使用这个指令。
Apache在编译时内部有一个硬性的限制"ServerLimit 20000"。你不能超越这个限制。
| 说明 | 服务器启动时建立的子进程数 |
|---|---|
| 语法 | StartServers number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, mpmt_os2, prefork, threadpool, worker |
StartServers指令设置了服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
不同的MPM默认值也不一样。对于leader, threadpool和worker默认值是"3"。对于prefork默认值是"5",mpmt_os2是"2"。
| 说明 | 服务器启动时建立的线程数 |
|---|---|
| 语法 | StartThreads number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | beos, mpm_netware, perchild |
设置了服务器启动时建立的线程数量。因为线程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
对于perchild,默认值是"StartThreads
5",并平均分配给各个进程。
对于mpm_netware,默认值是"StartThreads 50",由于只有一个进程,所有所有的线程都将用于伺服请求。
对于beos,默认值是"StartThreads
10",同样所有所有的线程都将用于伺服请求。
| 说明 | 每个子进程可配置的线程数上限 |
|---|---|
| 语法 | ThreadLimit number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, mpm_winnt, perchild, threadpool, worker |
| 兼容性 | 仅用于2.0.41及以后版本的mpm_winnt |
这个指令设置了每个子进程的可配置的线程数ThreadsPerChild的上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。
使用这个指令时要特别当心。如果将ThreadLimit设置成一个高出ThreadsPerChild实际需要很多的值,将会有过多的共享内存被分配。如果将ThreadLimit和ThreadsPerChild设置成超过系统的处理能力,Apache可能无法启动,或者系统将变得不稳定。该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。
对于mpm_winnt,ThreadLimit的默认值是1920;对于其他MPM这个值是64。
Apache在编译时内部有一个硬性的限制"ThreadLimit 20000"(对于mpm_winnt是"ThreadLimit 15000"),你不能超越这个限制。
| 说明 | 每个子进程建立的线程数 |
|---|---|
| 语法 | ThreadsPerChild number |
| 默认值 | See usage for details |
| 作用域 | server config |
| 状态 | MPM |
| 模块 | leader, mpm_winnt, threadpool, worker |
这个指令设置了每个子进程建立的线程数。子进程在启动时建立这些线程后就不再建立新的线程了。如果使用一个类似于mpm_winnt只有一个子进程的MPM,这个数值要足够大,以便可以处理可能的请求高峰。如果使用一个类似于worker有多个子进程的MPM,每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。
对于mpm_winnt,ThreadsPerChild的默认值是64;对于其他MPM是25。
| 说明 | 实际服务于请求的子进程运行时的用户 |
|---|---|
| 语法 | 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>段中使用该指令已经不再被支持了。你可以使用suexec的 SuexecUserGroup指令来达到这个目的。