一、httpd2.2的组成:
/etc/httpd:服务器的根目录
conf/httpd.conf,conf.d/*:配置文件
conf/magic:MIME的配置文件
logs:日志文件的存放路径,符号链接/var/log/httpd
modules:动态模块文件的存放路径,符号链接/usr/lib64/httpd/modules
run:httpd主进程pid的存放路径,符号链接/usr/run/httpd
httpd的主配置文件:/etc/httpd/conf/httpd.conf
在此配置文件中,所有的配置项均被称为指令(Directive)
指令的格式:Directive Value
在主配置文件中,所有的指令都被分组到三个配置段中:
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
二、常用的配置指令:
Section 1: Global Environment:全局配置段
1.Listen Directive
定义服务器监听的有效套接字
格式:Listen [IPADDR:]port [protocol]
注意:
1.在各配置文件中,Listen指令可以出现多次,用于定义不同的监听套接字
2.Listen指令不能省略,否则服务器无法启动
3.如果省略IP地址,将会监听当前服务器所有被正确配置并生效的IP地址
4.在httpd2.2中,如果更改Listen中IP地址信息,则必须重启httpd进程才能生效,仅仅reload不能生效
2.KeepAlive Directive
开启或关闭HTTP协议的长链接功能
格式:KeepAlive On|Off
KeepAliveTimeout Directive
服务器在一个长链接上能够达到的子回话请求的最大时间间隔;默认的时间单位为秒
格式:KeepAliveTimeout number
MaxKeepAliveRequests Directive
一个长链接上所能够接受的最大的用户请求数量,默认是100个
格式:MaxKeepAliveRequests number
以上三条指令是与长链接相关的指令,长链接的断开条件:
时间限制、请求数量限制
使用Telnet测试长链接:
设置KeepAlive On ,重载httpd服务,默认 KeepAliveTimeout的值为15
3.MPM相关指令:
MPM:多道处理模块;
httpd-2.2的MPM不支持DSO机制,且event为测试模式
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
通过修改/etc/sysconfig/httpd文件来完成MPM功能切换;
HTTPD=/usr/sbin/httpd.worker
每次更换MPM模块,都需要重启httpd服务后才能生效,/etc/sysconfig/httpd是服务启动脚本/etc/init.d/httpd的配置文件;
查看httpd或httpd.worker程序的模块列表:
httpd -M
httpd.worker -M
查看httpd或httpd.worker程序的静态编译模块列表
httpd -l
httpd.worker -l
与prefoik模块相关的配置指令:
<IfModule prefork.c>
StartServers 8
//在服务主进程启动之后,预先fork多少子进程
MinSpareServers 5
//最少预留的空闲子进程的数量
MaxSpareServers 20
//最多预留的空闲子进程的数量
ServerLimit 256
//为MaxClient指令定义上限
MaxClients 256
//最多的客户端并发访问量
MaxRequestsPerChild 4000
//每个子进程能够处理的客户端请求的最大值
</IfModule>
与worker模块相关的配置指令
<IfModule worker.c>
StartServers 4
//在服务主进程启动之后,预先fork多少个子进程;
MaxClients 300
//最多的客户端并发访问量
MinSpareThreads 25
//最少预留的空闲线程的数量
MaxSpareThreads 75
//最多预留的空闲线程的数量
ThreadsPerChild 25
//每个子进程可以管理的线程数量
MaxRequestsPerChild 0
//每个子进程可以处理的客户端请求的最大值
</IfModule>
4.DSO机制:
链接动态模块并将其添加至活动模块列表
格式:LoadModule module filename
例:
LoadModule auth_basic_module modules/mod_auth_basic.so
modules是相对于ServerRoot指令定义的根目录的路径而言的
5.Include Directive
可以包括除了主配置文件之外的其他服务配置文件;支持Globbing
格式:Include file-path | directory-path | wildcard
示例:
Inlude conf.d/*.conf
6.User Directive
指定启动子进程的用户ID和组ID
格式:User User-Id
Group Group-Id
Section 2: 'Main' server configuration,定义了默认的web站点的基本属性
7.ServerAdmin Directive
定义了发送错误信息的邮箱地址;
格式:ServerAdmin email-address|URL
ServerName Directive
服务器做自我标识时使用的主机名和端口号的组合;
格式:ServerName [scheme://]domain-name|ip-address[:port]
DocumentRoot Directive
为web站点的资源提供路径映射;
格式:DocumentRoot directory-path
示例:
DocumentRoot "/var/www/html"
8.站点资源访问控制资源指令
1)基于文件系统的访问控制指令
a.基于指定目录的访问控制指令
<Directory "/PATH/TO/SOME_DIR">
Options Directive
AllowOverride Directive
Order Directive
Allow Directive
Deny Directive
</Directory>
b.基于特定文件的访问控制指令
<File "FILENAME">
Directive Value
</File>
c.基于模式匹配的方式进行访问控制的指令
<FilesMatch regex>
Directive Value
</FilesMatch>
<DirectoryMatch regex>
Directive Value
</DirectoryMatch>
2)基于URL的访问控制指令
a.基于URL进行访问控制:
<Location URL-path|URL>
Directive Value
</Location>
b.基于URL的模式匹配的方式进行访问控制:
<LocationMatch regex>
Directive Value
</LocationMatch>
3)指令具体内容
①Options Directive
指定的目录中激活web访问控制相关特性;
格式:Options [+|-]option [[+|-]option] ...
取值可以是:None, All, Indexes, Includes, FollowSymLinks, SymLinksifOwnerMatch, ExecCGI, MultiViews...
Indexes:启用DocumentRoot的索引特性;当web站点没有定义符合要求的主页或者主页不存在时,在浏览器上允许以索引的方式列表显示整个DocumentRoot中所有的资源给用户选择;一般用于资源下载站点;对于正常的web站点来说,应禁用此功能;
FollowSymLinks:跟踪符号链接并找到被链接的文件,并可以在客户端浏览器中打开;
SymLinksifOwnerMatch:只有处理客户端请求的子进程的所有者与符号链接文件的所有者为同一用户时,才跟踪符号链接;
②AllowOverride Directive
控制被允许放置于.htaccess文件中的指令是否生效;
格式:AllowOverride All|None|directive-type [directive-type]
httpd允许在web站点的文档根目录中以及各级子目录中使用.htaccess文件进行资源的访问控制;凡是放置于.htaccess文件中的指令,有继承的特性;如果每次执行指令都要读取该文件进行比对,则运行效率会下降,所以通常建议该指令的值设置为"None";
③Order Directive
定义基于IP地址的访问控制管理的顺序;
a.配置顺序:
根据指定的Allow和Deny的顺序来执行;
b.范围顺序:
匹配范围越小的,越优先执行;
格式:Order ordering
ordering可以包含两种通用顺序:
Allow, Deny:
先计算Allow指令的匹配,如果能够匹配任意规则,则允许;
再计算Deny指令的匹配,如果能够匹配任意规则,则阻止;
如果没有匹配,则默认阻止所有;
Deny, Allow:
先计算Deny指令的匹配,如果能够匹配任意规则,则阻止;
再计算Allow指令的匹配,如果能够匹配任意规则,则允许;
如果没有匹配,则默认允许所有;
④Deny Directive
控制阻止访问服务器的客户端主机;
格式:Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Allow Directive
控制允许访问服务器的客户端主机;
格式:Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
host可以写成:
域名或FQDN:example.net www.abc.com
单个IP:172.16.0.1
逻辑网段:172.16 172.16.0.0/16 172.16.0.0/255.255.0.0
示例:
Order allow,deny
Allow from all
//允许所有客户端主机访问当前服务器的web站点服务;
Order deny,allow
Deny from 172.16.0.1
//仅阻止IP地址为172.16.0.1的主机访问当我服务器的web站点服务;
9.DirectoryIndex Directive
为当前web站点指定默认的主页文件名称;
格式:DirectoryIndex disabled | local-url [local-url] ...
注意:
1) DirectoryIndex指令之后可以设置多个本地URL作为主页文件名称;按照顺序从前到后进行名称匹配,如果能够匹配成功,就将该资源当作本站点的主页文档;如果没有匹配成功,且Options指令中也没有定义Indexes特性,则web服务器阻止本次请求;
2) 如果请求资源时明确的给出URL,则DirectoryIndex指令的值无任何意义;
10.日志相关指令
ErrorLog Directive
标明错误信息的日志记录的位置(文件路径)
格式:ErrorLog file-path|syslog[:[facility][:tag]]
示例:
ErrorLog logs/error_log
LogLevel Directive
控制错误日志记录的详细程度;
格式:LogLevel [module:]level [module:level] ...
level包括:emerg、alert、crit、error、warn、notice、info、debug
注意:
1) 日志记录等级越高,在错误日志中记录的信息就会越少;
2) 选择的日志记录等级,有向上兼容的特性;
CustomLog Directive
标明记录访问日志的文件的路径及日志记录的格式;
格式:CustomLog file format
示例:
CustomLog logs/access_log combined
LogFormat Directive
功能:描述了在访问日志中记录信息的特定格式;
格式:LogFormat format|nickname [nickname]
常用的format:
%h:远程主机名称;如果HostnameLookups的值设置为Off,则记录远程主机的IP地址;
%l:远程登录名称;如果没有登录名,就在日志中记录为"-";
%u:远程用户名称;记录通过身份验证之后访问资源的用户名称;
%t:收到客户端请求的时候的服务器的时间戳;[18/Sep/2011:19:18:28 -0400]
"%r":请求报文首部的首行;
"GET /index.html HTTP/1.1"
%>s:请求报文的状态信息;
%b:以字节为单位的响应报文的长度;
"%{Referer}i":访问此页面之前通过哪个超链接跳转而来;使用"{}"引用的内容是报文首部中的首部名称;
"%{User-Agent}i":客户端使用的http应用程序及相关信息;
示例:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
四种格式,默认选择combined
CustomLog logs/access_log combined
11.定义路径别名的指令:
Alias Directive
将指定的URL映射至本地的文件系统路径;
格式:Alias URL-path file-path|directory-path
示例:
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
AliasMatch Directive
使用正则表达式将URL映射至本地的文件系统路径;
格式:AliasMatch regex file-path|directory-path
示例:
AliasMatch ^/exam(.*)?$ "/tmp/exam$1"
<Directory "/tmp/exam/">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
12.服务器系统状态数据查询:
前提:LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>
ExtendedStatus On|Off:开启或关闭更多的额外状态信息展示;
三、虚拟主机配置段:
### Section 3: Virtual Hosts
<VirtualHost> Directive
启动并配置虚拟主机及相关参数;
格式:
<VirtualHost addr[:port] [addr[:port]] ...>
Directive Value
</VirtualHost>
使用虚拟主机:默认一个httpd仅能构建一个web站点,因此很多的情况下,我们需要在同一台服务器上架构多个web站点,此时则需要使用虚拟主机来定义。如果启用了虚拟主机,每个独立的Web站点都必须要有至少一个独立的主机标识:
IP地址 + Port + 主机头(请求报文首部中的Host首部的值,通常为FQDN)
三种典型的虚拟主机实现方式:
1) 基于IP地址构建的虚拟主机;
2) 基于Port构建的虚拟主机;
3) 基于主机头构建的虚拟主机;
注意:Main Server和Virtual Host不能同时被定义;而且一旦虚拟主机配置被激活,Main Server就不再有效;
常用指令:
NameVirtualHost Directive
功能:在使用基于主机头构建虚拟主机时,指定虚拟主机名称;
格式:NameVirtualHost addr[:port]
配置示例:
/etc/httpd/conf/httpd.conf中添加如下指令:
1
2
|
Listen172.16.88.99:8000 NameVirtualHost 172.16.88.99:80 |
/etc/httpd/conf.d/vhost1.conf的内容如下:
1
2
3
4
5
6
7
8
9
10
|
<VirtualHost 192.168.109.2:80> ServerNamewww.ppp213.com DocumentRoot "/myvhost/vhost1/" <Directory "/myvhost/vhost1" > Options None AllowOverride None Order allow,deny Allow from all < /Directory > < /VirtualHost > |
/etc/httpd/conf.d/vhost2.conf的内容如下
1
2
3
4
5
6
7
8
9
10
|
<VirtualHost 192.168.109.20:8080> ServerNamewww.ppp213.cn DocumentRoot "/myvhost/vhost2/" <Directory "/myvhost/vhost2/" > Options None AllowOverride None Order allow,deny Allow from all < /Directory > < /VirtualHost > |
/etc/httpd/conf.d/vhost3.conf的内容如下
1
2
3
4
5
6
7
8
9
10
|
<VirtualHost 192.168.109.20:80> ServerName www.ppp213.org DocumentRoot "/myvhost/vhost3/" <Directory "/myvhost/vhost3/" > Options None AllowOverride None Order allow,deny Allow from all < /Directory > < /VirtualHost > |
为主机添加新的ip地址 192.168.109.20:
1
|
ip add add 192.168.109.20 /16 dev eth0 label eth0:0 |
分别创建/myvhost/vhost1,/myvhost/vhost2,/myvhost/vhost3,并再其下创建index.html,重新载入httpd服务后,分别访问192.168.109.2、192.168.109.20、192.168.109.20:8080