Apache常用目录详解
1) /etc/httpd/conf/httpd.conf (Apache的主配文件)
httpd.conf是Apache的主配文件,整个Apache也不过就是这个配置文件,里面几乎包含了所有的配置。有的distribution都将这个文件拆分成数个小文件分别管理不同的参数。但是主要配置文件还是以这个文件为主。只要找到这个文件名就知道如何设置了。后面会详细解释Apache主配文件的每一行配置
2) /etc/httpd/conf.d/*.conf (include文件)
如果你不想要修改原始配置文件httpd.conf的话,那么可以将你自己的额外参数文件独立出来,注意以.conf结尾放在/etc/httpd/conf.d/目录下。重启Apache的时候,这个配置文件就会被读入主配文件之中了。他的好处就是当你在进行系统升级的时候,几乎不需要改动原本的配置文件,只要将你自己的额外参数文件复制到正确的地点即可,维护起来非常方便。
3) /etc/httpd/modules/
Apache支持很多的外挂模块,例如PHP以及SSL都是Apache外挂的一种。所有你想要使用的模块文件默认是放置在这个目录当中的。
4) /var/www/html/ (网站根目录)
这个目录就是Apache默认的存放首页的目录(默认是index.html)
5) /var/www/error/
当因为服务器设置错误,或是浏览器要求的数据错误时,在浏览器上出现的错误信息就以这个目录的默认信息为主
6) /var/www/icons/
这个目录提供Apache默认给予的一些小图示,可以随意使用。
7) /var/www/cgi-bin/
默认给一些可执行的CGI(网页程序)程序放置的目录。
8) /var/log/httpd/
默认的Apache日志文件都放在这里,对于流量比较大的网站来说,这个目录要格外注意,这里的数据文件可能会非常大。
9) /usr/sbin/apachectl
这个就是Apache的主要执行文件,这个执行文件其实就是一个Shell Script而已,他可以主动地侦测系统上面的一些设置值,好让你启动Apache时更简单一些。
10) /usr/sbin/httpd
这个是主要的Apache二进制执行文件。
11) /usr/bin/htpasswd (Apache密码保护)
在当你想要登入某些网页时你需要输入帐号与密码,那Apache本身就提供一个最基本的密码保护方式,该密码的产生就是通过这个命令来实现的。
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的时候,唤醒几个进程来处理服务的。Apache使用了进程预派生的技术来处理请求,大大提高了响应速度
MinSpareServers 5 //最小预备使用的进程数量
MaxSpareServers 20 //最大预备使用的进程数量
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使用哪一个模块,可以通过。修改这个文件来切换不同的工作模式。
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优先处理,因此全部客户端均可浏览
Apache配置文件权限操作
在权限配置一块让人一头雾水,下面我整理了一下相关的文档,希望能拨开云雾
Apache内部的Order可以处理相关权限的限制,其中有两个值,Allow和Deny
Order deny,allow 可以理解为拒绝所有,开放特定
Order allow,deny 可以理解为开放所有,拒绝特定
当allow与deny中有重复的规则出现,则最后一条的配置起到了决定性的作用,举个例子来说,我们要允许所有人访问除了192.168.1.1
Order allow,deny
allow from all
deny 192.168.1.1
以上这个例子很明显是允许所有拒绝特定的配置
第二行定义了允许的规则,开放所有第三行定义了拒绝的规则,拒绝了一个IP,这个IP包含在第二行的all当中,所以它的权限就默认由最后一行配置决定,最后一行是deny,所以61.61被成功被拒之门外
接下来举一个只允许1.1访问的例子
Order deny,all
deny from all
allow 192.168.1.1
这个例子的第一行声明了它是拒绝所有而允许特定
第二行拒绝了所有访问
第三行配置了一个允许的IP,这个IP当然也是包含在第二行的all之中,出现了重复定义,所以它的规则默认按照最后一条执行,最后一条是放行,所以成功被释放
</Directory>
</IfModule>
DirectoryIndex jfedu.php index.html index.html.var
网站默认的首页文件的名称
如果客户端在地址栏中只输入到目录,例如http://localhost/时,那么Apache将会拿哪一个文件作为首页来显示呢?这个文件的文件名就是在这里定义的了,如果上面的文件全部存在的话,就会按照设置的顺序显示排在最前面的首页,这个与之前在Option中谈到的Indexes有关。
Alias /icons/ "/var/www/icons/"
Alias 网址延伸 实际Linux目录
制作了一个目录的别名
<Directory "/var/www/icons">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
这个Alias很有趣,可以制作出类似于链接文件的东西。当你输入http://localhost/icons时,其实你的/var/www/html/中并没有icons那个目录,不过由于Alias别名的关系,会让该网址直接链接到/var/www/icons/下,因为设置了一个新的可浏览的目录,所以多了个<Dirctory>来限定权限
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
ScriptAlias 网址延伸 实际Linux目录
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
与上面的icons类似,不过这边却是以ScriptAlias(可执行脚本的别名)为设置值,这个设置值可以指定该目录下面为"具有ExecCGI能力"的目录所在。所以你可以将类似OpenWebMail的程序放置到/var/www/cgi-bin/内,就不必额外设置其他的
目录来放置你的CGI程序了。
Some examples:
ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /missing.html
ErrorDocument 404 "/cgi-bin/missing_handler.pl"
ErrorDocument 402 http://www.example.com/subscription_info.html
错误页面的设置
404的第一个例子中使用的是相对路径,必须放置在首页目录下
402的例子直接跳转到了另一个页面
NameVirtualHost *:80
如果需要开启虚拟主机的功能,需要首先把这一行的注释拿掉
这里的*号意味着监听每一个IP的80端口
<VirtualHost *:80>
这里一定要注意,这个标签后面的IP定义一定要和上面NameVirtualHost定义的一致
ServerAdmin webmaster@dummy-host.example.com
这一行不是必须的,指定了管理员的邮箱
DocumentRoot /www/docs/dummy-host.example.com
这一行是必须的配置,它指定这个虚拟主机的网页存放目录
ServerName dummy-host.example.com
ServerName是必须要有的配置,这里需要定义一个能被DNS或Hosts解析的完整域名
ErrorLog logs/dummy-host.example.com-error_log
以上这一行的配置意为将这个主机发生的错误日志写入到指定的文件中,而不是写入到默认的文件中
默认的错误日志路径为:/var/log/httpd/errorlog
CustomLog logs/dummy-host.example.com-access_log common
以上这一行的配置意为将访问日志写入到指定的文件中,而不写入到默认的/var/log/httpd/accesslog中
</VirtualHost>
上面一块是一个虚拟主机的配置实例
在虚拟主机之上还能设置很多的功能,不过最精简的配置是需要有
ServerName和DocumentRoot这两个配置
在添加了虚拟主机的配置之后需要把中心主机的信息也单独写成一个虚拟机的配置,不然中心主机名的服务就不知道丢到哪里去了,这一步骤在Apache帮助文档中称做:取消中心主机
当然,如果你想有多个域名都指向到同一个虚拟主机是可以通过在<VirtualHost>块中配置ServerAlias功能来实现的。
注意点一:DNS指向问题
如果你设置了别名,多个域名指向同一个虚拟主机,那么一定要保证DNS能正常解析的到
注意点二:<VirtualHost>段配置指定作用域的问题
你可以把其他一些指令放入<VirtualHost>段中,以更好的配置一个虚拟主机。
大部分指令都可以放入这些<VirtualHost>段中以改变相应虚拟主机配置。
如果您想了解一个特定的指令是否可以这样运用,请查看帮助手册中指令的作用域。
主服务器(main server)范围内的配置指令(在所有<VirtualHost>配置段之外的指令)仅在它们没有被虚拟主机的配置覆盖时才起作用。
注意点三:虚拟主机名的问题
当一个请求到达的时候,服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的IP地址。如果能够匹配,它就会查找每个与这个IP地址相对应的<VirtualHost>段,并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。
如果找到了,它就会使用这个服务器。否则,将使用符合这个IP地址的第一个列出的虚拟主机。
顺序展示:
客户端发起一个访问域名的请求—>DNS解析到目标主机
—>检查是否开启了虚拟主机的功能—>检查是否能和NameVirtualHost相匹配
—>查找出每个与该IP对应的虚拟主机段配置—>尝试找出与请求的完整域名相同的ServerName或ServerAlias
—>如果找到就使用这个虚拟主机的配置—>如果配置中与中心主机的配置不冲突则优先使用中心主机的配置
如果找不到与之相匹配的完整域名的虚拟主机配置—>使用符合这个IP地址的第一个虚拟主机
综上所述,第一个列出的虚拟主机充当了默认虚拟主机的角色。
当一个IP地址与NameVirtualHost指令中的配置相符的时候,
主服务器中的DocumentRoot将永远不会被用到。
所以,如果你想创建一段特殊的配置用于处理不对应任何一个虚拟主机的请求的话,你只要简单的把这段配置放到<VirtualHost>段中,并把它放到配置文件的最前面就可以了。