Httpd-2.2常见配置总结
httpd配置文件的组成:
# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1:Global Environment
### Section 2:'Main' server configuration
### Section 3:Virtual Hosts
注意:由于该文件比较大,所以修改之前建议先备份一下。
注意:配置文件分三大部分,是我们人为划分的,配置参数放的位置并没有特殊的要求。不过,有过有重复的配置参数的话,后面的配置参数会将前面的配置参数给覆盖掉(也就是说,配置文件中后面的数据生效。)。
配置格式:directive value
directive:不区分字符大小写
value:为路径时,是否区分大小写,取决于文件系统
(1)启动服务的时候,会显示一大段描述信息(不能确定服务器的全称域名),虽然不会影响服务正常运行,可是看起来不爽。如果想要取消描述的话,需要修改配置文件中"Serverame"项。网站可以随便写,不过正常的话,建议写服务器的网站名。
(2)配置文件中有一行"ServerRoot"项,制定了该httpd服务的配置文件的根目录。该文件下的所有相对路径,都是性对于"ServerRoot"的。比如"PidFile"定义主进程的主配置文件的pid文件。
(3)响应首部会显示服务器的版本信息,为了保证服务器安全,所以建议修改将此处的信息给隐藏掉(尽可能少的显示信息)。需要修改"ServerTokens"
更改服务端的配置文件:
使用本机查看结果(按道理,找一台客户机查看效果比较好):
注意:默认只有这几种显示方式。如果(Server:Apache)也想要修改的话,指令里面没有,只能通过更改源码,重新编译来实现了。还有一种方法是,在调度器上做一下设置,即通过调度器,将"Server"给隐藏掉。(apache、nginx都存在这样的问题。)
(4)监听端口,http协议默认监听的是80端口。要修改的话,可以通过更改配置文件中的"Listen"项。服务端更改过配置文件之后,重新加载配置文件,客户端在访问的时候,就需要指定端口号了。
格式:Listen [IP-address:]portnumber [protocol]
示例:Listen 192.170.2.1:8443 https
使用客户端访问:
注意:httpd可以监听多个端口。可以绑定ip地址(服务端自己的ip)和端口。只能通过这个ip地址的这个端口来访问http服务。示例:"Listen 192.168.109.201:156"。
注意:"Listen"项是不可以注释掉的。注释掉的话,将导致无法启动服务。
(5)持久连接,Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成。即有一个资源需要调用另一个资源,当第一个资源下载结束后,链接并不会断开,而是会继续下载另一个资源。注意:httpd服务默认是关闭持久连接;
断开条件:
数量限制:100
时间限制:以秒为单位, httpd-2.4 支持毫秒级
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;
折衷:使用较短的持久连接时间
设置:
KeepAlive On|Off
KeepAliveTimeout 15(持久连接的超时时间)
MaxKeepAliveRequests 100(一个链接最多的请求资源)
注意:两个条件只要有一个满足条件,便会结束连接。
测试:(可以通过telnet服务测试)
telnet WEB_SERVER_IP PORT(注意:此时只是三次握手成功!)
GET /URL HTTP/1.1(注意:使用telnet连接的时候,要自己构造一个请求报文,详情将实验。)
Host: WEB_SERVER_IP(注意:使用telnet测试的时候,这个host:ip地址可以随便敲。如果是使用浏览器的话,那么这个ip地址,就是web服务器的ip地址。)
修改服务端的配置信息:
注意:修改配置后,需要重启服务。
使用telnet客户端测试:
实验:查看web访问的请求头部、默认的httpd服务是持久连接没有打开:
1、建立一个有多个资源网站(本实验是2个资源):
2、开启httpd服务,并通过浏览器访问该网站:
3、通过抓包查看是否是持久连接:
(6)MPM( Multi-Processing Module)多路处理模块,prefork, worker, event(试验阶段)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持
确认方法:
ps aux | grep httpd
注意:默认为/usr/sbin/httpd, 即prefork模式
查看httpd模块列表:
查看静态编译的模块:httpd -l
查看静态编译及动态装载的模块:httpd –M
注意:动态模块加载:不需重启即生效
动态模块路径:/usr/lib64/httpd/modules/
更换使用的httpd程序:
编辑/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
注意:需要重启服务生效
pstree -p|grep httpd 查看进程和线程
查看httpd.work模块列表:
查看静态编译的模块:httpd.worker -l
查看静态编译及动态装载的模块:httpd.worker –M
(7)DSO: Dynamic Shared Object
加载动态模块配置:/etc/httpd/conf/httpd.conf
配置指定实现模块加载格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
示例:
LoadModuleauth_basic_modulemodules/mod_auth_basic.so
注意:/usr/lib64目录下有很多模块文件,其中.al后缀的文件是静态模块;.so后缀的文件是动态模块;
注意:httpd默认是没有php模块儿的。
(8)配置文件中"DocumentRoot"项,默认是"/var/www/html"定义'Main' server的文档页面路径:
DocumentRoot "/path"
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
示例:
DocumentRoot "/app/data"
http://HOST:PORT/test/index.html --> /app/data/test/index.html
注意:SELinux和iptables的状态;
(9)配置文件中"DirectoryIndex"项,访问该目录的时候,默认访问的是"DirectoryIndex"定义的页面。
DirectoryIndex index.html index.html.var
注意:该配置有优先级,在前面的优先级比较高。
注意:如果在DocumentRoot目录下有一个目录,里面没有" index.html index.html.var",在没有做设置的情况下,会显示该目录下的文件。
问题:如果DocumentRoot目录下没有"index.html index.html.var"文件,会显示httpd的默认的错误页面?原因是什么?
原因:在/etc/httpd/conf.d/目录下有一个子配置文件,名为"welcome",里面设置了,当访问"/"的时候,就会显示"403 /error/noindex.html"错误页面。
(10)站点访问控制常见机制:可基于两种机制指明对哪些资源进行何种访问控制;
首先,需要指定对那些文件、目录做访问控制:
文件系统路径:
<Directory "/path">(目录)
...
</Directory>
<File "/path/file">(文件,可以使用通配符)
...
</File>
<FileMatch "PATTERN">(正则表达式)
...
</FileMatch>
URL路径:(URL路径指的是网址后面的内容)
<Location "">(通常定义目录)
...
</Location>
<LocationMatch "">(正则表达式)
...
</LocationMatch>
注意:URL路径的方式指定文件,更加常用。
示例:
<FilesMatch "\.(gif|jpe?g|png)$">
<Files "?at.*">通配符
<Location /status>
<LocationMatch "/(extra|special)/data">
其次,指定了文件后,就要指定对该文件的访问控制;访问控制机制有两种:客户端来源地址,用户账号;
<Directory>中"基于源地址"实现访问控制(基于用户账号的访问控制,见14)
-
Options:后跟1个或多个以空白字符分隔的选项列表在选项前的+,- 表示增加或删除指定选项;
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;(也就是说,加上该设置,如果访问的url路径下没有index.html文件的时候,就返回该目录列表。)(默认情况下不允许访问该目录结构。而在/var/www/html目录下,创建的目录可以显示目录结构是因为,配置文件中有一段设置,规定"/var/www/html/"目录下的新建目录,可以显示其文件列表。而在welcome.conf配置文件中规定了,根目录不允许显示其目录结构。)
FollowSymLinks:允许访问符号链接文件所指向的源文件;(默认情况下允许访问软连接)
None:全部禁用;
All:全部允许;
注意:对于web文件,要注意文件的权限,例如,对于一个文件只有所有者有读权限的文件,并且文件的所有者是root,那么,这种情况下,不管怎么对该文件做访问控制,都没用!因为web服务,是通过apache用户,来提供服务的,所以,要保证apache用户有读的权限。可以使用acl:"setfacl -m u:apache:r m.txt",不过对单个文件设置acl比较麻烦,所以可以使用默认的acl,即对该目录下的新建的文件,默认就有acl权限。"setfacl -m d:u:apache:r /app/test"取消acl的命令"setfacl -R -b /app/test.dir/"
示例:
<Directory/web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory/web/docs/spec>
Options FollowSymLinks
</Directory>
<Directory/web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory/web/docs/spec>
Options +Includes -Indexes
</Directory>
注意:测试indexes选项的时候,访问"DocumentRoot"目录的时候,由于有一个welcome.conf子配置文件项,对"DocumentRoot"做了设置,所以,做实验的时候,建议将该项设置,给注释掉。
注意:测试FollowSymlinks选项,做软连接的时候,注意源文件的权限。
注意:建议使用curl命令测试,因为浏览器有缓存。
注意:除了文件名,大小写无关紧要。
注意:子目录会继承父目录的访问权限设置!如果子目录不想与父目录一致,那就需要重新设置。
(2) AllowOverride:与访问控制相关的那些指令,可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令。
注意:只对<directory>语句有效
AllowOverride All:所有指令都有效(表示所有指令都可以在目录中,创建.htaccess文件来定义访问权限。)
AllowOverride None:可以认为.htaccess文件无效
AllowOverride AuthConfig Indexes:除了AuthConfig(身份验证)和Indexes的其它指令都无法覆盖
注意:有httpd2-2版本有bug,配置文件中,只能使用allowoverride all/none;
注意:为什么名为".htaccess"的文件名,可以自定义该目录的访问控制。因为主配置文件中"AccessFileName"项,来定义该文件名。
注意:目录下隐藏文件,可以使用"ip/[dirextory]/.htaccess"方式查看文件中的内容吗?答案:不允许,因为主配置文件中,定义了所有".ht"开头的文件,拒绝访问。如果这两行注释掉的话,那么就可以访问该文件了。
(3) order和allow、deny
order:定义生效次序;写在后面的表示默认法则
Order allow,deny
Order deny,allow
Allow from [ip]
Deny from [ip]
注意:文件格式要求很严格。
注意:Order只适用于httpd-2.2版本。
来源地址:
IP
网络:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
示例:
<files "*.txt">
order deny,allow
deny from 172.16. 100.100
allow from 172.16
</files>
<files "*.txt">
order allow,deny
deny from 172.16.100.100
allow from 172.16
</files>
<directory /app/test.dir>
order deny,allow
deny from 192.168.109.10
allow from 192.168.109.0/24
</directory>
<filesmatch '\.(sh|conf)$'>
order deny,allow
deny from all
</filesmatch>
<location "/admin">
order allow,deny
allow from 192.168.109.4 127.0.0.1
</location>
(11)日志设定:
日志类型:访问日志、错误日志
错误日志:
ErrorLog、logs/error_log
LogLevel:warn
loglevel 可选值:
debug, info, notice, warn,error,crit, alert, emerg
访问日志:
定义日志格式:LogFormat format strings LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""combined
使用日志格式(配置文件):
CustomLoglogs/access_log(访问日志) combined
参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客户端IP地址;
%l:远程用户,启用mod_ident才有效,通常为减号"-";
%u:验证(basic,digest)远程用户,非登录访问时,为一个减号"-";
%t:服务器收到请求时的时间(英式时间);
%r:First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本;
%>s:响应状态码,类似于403、响应报文首部的200(OK)、301(文档在其他地方)等等;
%b:响应报文的大小,单位是字节;纯数据大小,不包括响应报文http首部;
%{Referer}i:请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的。可以用来防止盗链;
%{User-Agent}i:请求报文中首部"User-Agent"的值;即发出请求的应用程序(浏览器的类型);
(12)设定默认的字符集:需要更改配置文件中的"AddDefaultCharset"项,该项默认是"UTF-8"
中文字符集:GBK, GB2312, GB18030;(一般政府网站使用中文的字符集)
(13)定义路径别名
格式: Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs":
含义:http://www.magedu.com/download/bash.rpm ==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
含义:http://www.magedu.com/download/bash.rpm ==>/rpms/pub/bash.rpm
http://www.magedu.com/images/logo.png ==>/www/htdocs/images/logo.png
注意:为了避免有缓存影响实验,所以,使用IE浏览器测试的时候,建议使用"ctrl+F5";
(14)基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因 (比如:对于一些大公司,人员比较多,将所有的用户账号放在一台专门的机器上(比如微软的DC有一个AD数据库),当用户想要使用电脑的时候,需要通过网络,将用户名密码发送到身份验证的主机上,验证通过,才可以访问机器。)
用户的账号和密码:
虚拟账号:仅用于访问某服务时用到的认证标识;(有别于操作系统的用户、账号)
存储:文本文件,SQL数据库(比较安全),ldap目录存储,nis等;
basic认证配置示例:
-
定义安全域
<Directory "/path"> Options None
AllowOverride None
AuthTypeBasic
AuthName"String"(描述语句,可以随便指定)
AuthUserFile"/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
注意:允许账号文件中的所有用户登录访问:Require valid-user;
注意:也可以使用allowoverrideauthconfig,然后再必要的目录下创建.htaccess文件的形式。
(2) 提供账号和密码存储(文本文件),使用专用命令完成此类文件的创建及用户管理;
htpasswd[options] /PATH/HTTPD_PASSWD_FILEusername
-c:自动创建文件,仅应该在文件不存在时使用;
-m:md5格式加密,默认方式;
-s:sha格式加密;
-D:删除指定用户;
示例:htpasswd -c /etc/httpd/conf.d/.httpdusers.txt http3
注意:首先需要对目标目录做一个声明,然后再使用htpasswd命令创建用户。
注意:由于该文件存放的是用户名、密码,建议将其设成隐藏文件。
注意:设置完成后,注意重新加载配置文件。
基于组账号进行认证
(1) 定义安全域
<Directory "/path">
AuthTypeBasic
AuthName"String"
AuthUserFile"/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
Require groupgrpname1 grpname2 ...
</Directory>
(2) 创建用户账号和组账号文件;组文件中,每一行定义一个组;
首先,手动创建一个组文件,vim /etc/httpd/conf.d/.htgroup,在里面定义组的信息,格式是:"GRP_NAME: username1 username2 ...",然后在域文件中指定组文件。
示例:
vim /etc/httpd/conf.d/.htgroup
webadmins:wang mage
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmins
</Directory>
问题:根据(10)、(14)项,可以根据客户端IP地址或者是用户账号,来设置访问机制;如果两种方式混合起来的话,使用方法是怎样的呢?
答案:通过"SatisfyALL|Any"来控制;如果是在
ALL:客户机IP和用户验证都需要通过才可以;
Any:客户机IP和用户验证,有一个满足即可;
示例一:
<directory /var/www/html/secert>
authtype basic
authname "test156"
authuserfile "/etc/httpd/conf.d/httpdusers.txt"
Require valid-user
Order allow,deny
Allow from 192.168.109.0/24
Satisfy Any
</directory>
注意:该项配置表示,允许"/etc/httpd/conf.d/httpdusers.txt"文件中定义的用户访问该secert目录;也允许在192.168.109.0/24网段中的机器访问。
注意:对用户身份的验证,只适用于<Directory>、.htaccess文件中!
示例二:
(15)status页面(状态页)用于查看httpd服务的工作状态。该页面,默认是关闭的。要开启该功能的话,查看httpd服务是否已加载该"status_module"模块(默认已加载,可以通过httpd -M,查看该模块的加载情况,如果没有的话,需要在配置),由于配置文件中默认注释掉了该功能,所以,需要在主配置文件中删掉注释"#";
LoadModule status_modulemodules/mod_status.so(主配置文件中默认就有该信息;)
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>(去掉主配置文件中的"#";)
注意:如果想要查看更加详细的信息的话,可以打开主配置文件中的"ExtendedStatus On"项,显示扩展信息;
注意:如果想要对"server-status"添加访问控制的话,只能针对ip地址设置访问控制策略。因为用户身份验证不支持"<location>";
(16)虚拟主机,有的时候,使用一台web服务器为一个网站提供服务,略显浪费。可以使用虚拟主机的技术,将多个网站,放置在一个web服务器中,相互之间,互不影响。
站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机使用至少一个独立的port;
基于FQDN:为每个虚拟主机使用至少一个FQDN;
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerNameFQDN
DocumentRoot"/path"
</VirtualHost>
其它可用指令:
ServerAlias:虚拟主机的别名,可多次使用;
ErrorLog: 错误日志;
CustomLog:访问日志;
<Directory "/path">
</Directory>
Alias
注意:建议将虚拟主机的配置信息,放置在子配置文件中。(主配置文件的末尾也有虚拟主机的配置,不过,默认是被注释的。)
注意:根据不同的FQDN,创建虚拟主机的原理是:在http协议的头部,有一部分信息记录着客户端访问的FQDN(Host: www.magedu.com)服务端可以从根据FQDN来创建不同的虚拟主机。
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机;禁用方法:注释中心主机的DocumentRoot指令即可;
示例:
基于IP的虚拟主机示例:(注意:这里的ip是web服务器的ip。)
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于端口的虚拟主机:可和基于IP的虚拟主机混和使用
listen 808
listen 8080
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:808>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于FQDN的虚拟主机:
NameVirtualHost *:80 (注意:httpd-2.4不需要此指令)
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
注意:基于FQDN实现虚拟机的实验,在客户端需要编辑hosts文件,模拟DNS的解析。
注意:基于FQDN的虚拟机实现方法中,实验成功后,如果使用ip访问,那么访问的是第一个虚拟机的网站。
注意:基于ip和端口号的虚拟机的实验,可以写"servername"项(为了避免主配置文件中没有指定Servername,建议此处写上,另外,便于以后的管理。)。
注意:只有访问日志才需要定制日志格式,错误日志的日志格式是固定的。