Httpd-2.2常见配置总结

来源:互联网 发布:优化关键词密度的方法 编辑:程序博客网 时间:2024/06/05 16:33

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)

  1. 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认证配置示例:

  1. 定义安全域

    <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,建议此处写上,另外,便于以后的管理。)。

注意:只有访问日志才需要定制日志格式,错误日志的日志格式是固定的。

原创粉丝点击