Apache配置文件详解及优化
ServerTokens OS
#这个项目仅仅是在告知客户端我们服务器的版本和操作系统而已,不需要改动他
#如果不在乎你的系统信息被远程用户查询到,则可以将这个项目注释掉(不建议)
ServerRoot "/etc/httpd"
#服务器设置的最顶层目录,有点类似于chroot那种感觉。包括logs , modules等
#的数据都应该要放置在此目录下面(如果这些配置没有声明成绝对路径的话)
PidFile run/httpd.pid
#放置PID的文件,可方便apache软件的管理。只有相对路径考虑ServerRoot设置值,
#所以文件在/etc/httpd/run/httpd.pid
Timeout 60
#不论接收或发送,当持续连接等待超过60秒则该次连接就中断
#一般来说,此数值在300秒左右即可,不需要修改这个原始值
KeepAlive Off
#这里最好把默认值“Off”修改为“On”
#这里表示是否允许持续性的连接,也就是一个TCP连接可以具有多个文件资料传送的要求
#举例来说,如果你的网页内含有很多图片文件,那么这一次连接就会将所有的数据传送完
#而不必每一个图片都需要进行一次TCP连接。
MaxKeepAliveRequests 100
#可以将默认的100改成500或更高
#与上一个设置的值KeepAlive有关,当KeepAlive的值设置为On的时候,这个数值可以决定
#该次连接能够传输的最大传输数量。为了提高效率则可以改大一点。0代表不限制
KeepAliveTimeout 65
#在KeepAlive设置为“On”的情况下,该次连接在最后一次传输后等待延迟的秒数
#当超过该秒数的时候该连接中断。保持默认值15即可,如果设置的值太高(等待时间较长)
#在较忙碌的系统上面将会有较多的Apache程序占用资源,可能有效率方面的问题。
<IfModule prefork.c>
StartServers 8 #启动Apache的时候,唤醒几个PID来处理服务的。
#Apache使用了进程预派生的技术来处理请求,大大提高了响应速度,
MinSpareServers 5 #最小预备使用的PID数量
MaxSpareServers 20 #最大预备使用的PID数量
ServerLimit 4096 #服务器的限制
MaxClients 4096 #最多可以有多少个客户端同时连接到Apache
#最大的同时连接数量,也就是process不会超过这一数值。
#这个MaxClients设置值可以控制同时连上www服务器的总连接要求数量,
#也可以将其看作是最高实时在线人数。不过要注意的是:这个值并非越大越好
#因为他会消耗物理内存(与process有关),所以如果你设置太高导致超出物理内存
#能够容许的范围,那么效率就会大大降低(因为会跑SWAP),此外,MaxClients也在
#Apache编译的时候就指定最大值了,所以你也无法超出系统最大值,除非你重新编译Apache
MaxRequestsPerChild 4000
#每个程序能够提供的最大传输次数要求。举例来说:如果有个用户连上服务器之后,
#要求数百个网页,当他的要求数量超过这个值的时候则该程序会被丢弃,
#另外切换一个新程序。这个设置可以有效地管理每个process在系统上存活的时间。
#根据观察所得,新程序的效果较好。
</IfModule>
<IfModule worker.c>
StartServers 8
MaxClients 4000
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 75
MaxRequestsPerChild 0
</IfModule>
#上面的prefork和worker其实就是两个与服务器连接资源有关的设置项目。
#默认的项目配置对于一般中小型网站来说已经很够用了,不过如果网站的流量
#比较大,也可以修订一下里面的数值。这两个模块都是用在提供用户连接资源,
#设置的数值越大代表系统会启动越多的程序来提供Apache的服务,反映速度就比较快
#Redhat和CentOS将这两个模块分别放到了不同的执行文件中,分别是
# |- /usr/sbin/httpd 使用prefork模块
# |- /usr/sbin/httpd.worker 使用worker模块
#/etc/sysconfig/httpd这个文件决定了Apache使用哪一个模块,可以通过。
#修改这个文件来切换不同的工作模式。
prefork和worker模式的比较
prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。
worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起"死掉".由于线程共享内存空间,所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
#Apache提供了非常多的模块供我们使用,以上就是加载的模块
Include conf.d/*.conf
ServerAdmin root@localhost
#系统管理员的邮箱,当网站出现问题的时候,错误信息会显示的联系邮箱
DocumentRoot "/var/www/html"
#上面这一行的配置指定了放置首页的目录
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#Directory指定后面的路径是系统中的绝对路径
#这个设置是针对www服务器的默认环境而来的,因为是针对“/”的设置
#建议保留上面的默认值
<Directory "/var/www/html">
#使用Directory指定了一个绝对路径的目录
Options -Indexes FollowSymLinks
#Options(目录参数)
#此设置值表示在这个目录内能够让Apache进行的操作,也就是针对Apache的程序的权限设置。
#主要的参数值有:
# Indexes:如果在此目录下找不到首页文件(默认为index.html)时,
# 就显示整个目录下的文件名,至于首页文件名则与DirectoryIndex设置的值有关
# 建议注释掉Indexes
# FollowSymLinks:这是Fllow Symolic Links的缩写,字面意义是让连接文件可以生效。
# 我们知道首页的目录是在/var/www/html,既然是WWW的根目录,理论上就像被chroot
# 一般。一般说来说被chroot的程序无法离开其目录,也就是说,默认的情况下,你在
# /var/www/html下面的连接文件只要链接到非此目录的其他地方,则该连接文件默认是失效的。
# 但是使用这个设置可以让链接有效的离开本目录
# ExecCGI:让此目录具有执行CGI的权限,非常重要。举例来说,OpenWebMail使用了
# 很多Perl程序,你要让OpenWebMail可以执行,就需要在该程序所在目录拥有ExecCGI
# 的权限才行。但是要注意:不要让所有的目录均可以使用ExecCGI
# Includes:让一些Server-Side Include程序可以运行。建议可以加上去
# MultiViews:这个有点像是多国语言的支持,与语言数据有关。在错误信息的回报内容中
# 最常见,在同一台主机中,可以依据客户端的语言而给予不同的语言显示。默认在回报
# 信息中存在,你可以检查一下/var/www/error/目录下的数据。
AllowOverride None
#允许覆盖参数功能
#表示是否允许额外配置文件.htaccess的某些参数覆盖。我们可以在httpd.conf内设置好所有的权限
#不过这样一来,若用户自己的个人网页想要修改权限时将会对管理员造成困扰。因此,Apache默认
#可以让用户以目录下的.htaccess文件内覆盖<Direcoty>内的某些功能参数。这个项目则是在规定
#.htaccess可以覆盖的权限类型有哪些。常见的有以下几种:
# ALL:全部的权限均可以覆盖
# AuthConfig:仅有网页认证(帐号与密码)可以覆盖
# Indexes:仅允许Indexes方面的覆盖
# Limits:允许用户利用Allow、Deny与Order管理可浏览的权限
# None:不可覆盖,也就是让.htaccess文件失效
#使用.htaccess会严重影响到Apache的性能,如果不是特殊需要,建议关闭
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
#能否登陆浏览的权限
#决定此目录是否可被Apache的PID所浏览的权限设置。
#能否被浏览主要有两种判断的方式:
# deny,allow 以deny优先处理,但没有写入规则的默认为allow (可以理解拒绝所有,允许特定)
# allow,deny 以allow为优先处理,但是没有写入规则的默认为deny (可以理解允许所有,拒绝特定)
#所以在默认的情况下,因为是allow,deny 所以默认为deny(不可浏览)
#不过在下一行有个allow from all,allow优先处理,因此全部客户端均可浏览
#举个例子来说,我们要允许所有人访问除了192.168.61.61
#Order allow,deny
#allow from all
#deny 192.168.61.61
#以上这个例子很明显是允许所有拒绝特定的配置
#第二行定义了允许的规则,开放所有
#第三行定义了拒绝的规则,拒绝了一个IP,这个IP包含在第二行的all当中,
#所以它的权限就默认由最后一行配置决定,最后一行是deny,所以61.61被成功被拒之门外