httpd程序配置详解

Posted by Mathew on 2016-08-21

Apache是HTTP协议的一种实现,Apache实现的程序名字叫做httpd。

本文采用yum方式安装httpd做测试。

查看安装后生成哪些配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
[root@daniel ~]# rpm -ql httpd 
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/logrotate.d/httpd
/etc/rc.d/init.d/htcacheclean
/etc/rc.d/init.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/usr/lib64/httpd
/usr/lib64/httpd/modules
/usr/lib64/httpd/modules/mod_actions.so
/usr/lib64/httpd/modules/mod_version.so
/usr/lib64/httpd/modules/mod_vhost_alias.so
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
# 过多省略
/var/log/httpd
/var/run/httpd
/var/www
/var/www/cgi-bin
/var/www/error
/var/www/error/HTTP_BAD_GATEWAY.html.var
/var/www/error/HTTP_BAD_REQUEST.html.var
/var/www/error/HTTP_FORBIDDEN.html.var
/var/www/error/HTTP_GONE.html.var
/var/www/error/HTTP_INTERNAL_SERVER_ERROR.html.var
/var/www/error/HTTP_LENGTH_REQUIRED.html.var
/var/www/error/HTTP_METHOD_NOT_ALLOWED.html.var
/var/www/error/HTTP_NOT_FOUND.html.var
/var/www/error/HTTP_NOT_IMPLEMENTED.html.var
/var/www/error/HTTP_PRECONDITION_FAILED.html.var
/var/www/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
/var/www/error/HTTP_REQUEST_TIME_OUT.html.var
/var/www/error/HTTP_REQUEST_URI_TOO_LARGE.html.var
/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var
/var/www/error/HTTP_UNAUTHORIZED.html.var
/var/www/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
/var/www/error/HTTP_VARIANT_ALSO_VARIES.html.var
/var/www/error/README
/var/www/error/contact.html.var
/var/www/error/include
/var/www/error/include/bottom.html
/var/www/error/include/spacer.html
/var/www/error/include/top.html
/var/www/error/noindex.html
/var/www/html
/var/www/icons
/var/www/icons/README
/var/www/icons/world2.png
[root@daniel ~]#

安装生成文件解读

* 配置文件
1
2
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
* 服务脚本
1
2
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd
* 主程序文件
1
2
3
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
* 日志文件目录
1
2
3
/var/log/httpd
- access_log: 访问日志
- error_log:错误日志
* 站点文档目录
1
/var/www/html
* 模块文件路径
1
/usr/lib64/httpd/modules
* 配置文件的组成
1
2
3
4
~]# grep "Section" /etc/httpd/conf/httpd.conf 
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts

常用配置

* 修改监听的IP和Port
1
2
3
Listen [IP:]PORT

省略ip表示监听本机所有IP; Listen可重复出现多次;
* 持久连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成;
如何断开?
数量限制:100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;
折衷:使用较短的持久连接时间;
httpd-2.4 支持毫秒级持久时间;
非持久连接

KeepAlive On|Off
MaxKeepAliveRequests #
KeepAliveTimeout #

测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
* MPM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Multipath Process Module:多道处理模块
perfork,worker,event

http-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:
# ps aux | grep httpd

默认为/usr/sbin/httpd,其使用prefork
查看模块列表:
查看静态编译的模块
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
查看静态编译及动态装载的模块
# httpd -M

更换使用的httpd程序
/etc/sysconfig/httpd
HTTPD=
重启服务生效

prefork的配置
<IfModule prefork.c>
StartServers 8 # 服务启动时候启动进程数
MinSpareServers 5 # 最小空闲进程数
MaxSpareServers 20 # 最大空闲进程数
ServerLimit 256 # 服务器允许最大值
MaxClients 256 # 客户端最大数量
MaxRequestsPerChild 4000 #
</IfModule>

worker的配置
<IfModule worker.c>
StartServers 4 # 服务启动时候启动多少进程
MaxClients 300 # 服务器端最大线程数
MinSpareThreads 25 # 最小空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadsPerChild 25 # 每个进程所启动的线程数
MaxRequestsPerChild 0
</IfModule>

PV,UV
PV:Page View
UV:User View
* DSO
1
2
3
4
5
6
配置指令实现模块加载
LoadModule <mod_name> <mod_path>

模块路径可使用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言;
/etc/httpd/modules/
* 定义 'Main' Server的文档页面路径
1
2
3
4
5
6
DocumentRoot

文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html

修改服务器默认路径

* 站点访问控制
1
2
3
4
5
6
7
8
9
10
11
12
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory ""> </Direcotry>
<File ""> </File>
<FileMatch ""> </FileMatch>
URL路径:
<Location ""> </Location>
...

访问控制机制:
基于来源地址;
基于账号;
* Directory中"基于来源地址"实现访问控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(1) Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None, All
Indexes: 索引;
FollowSymlinks:允许跟踪符号链接文件;

(2) 基于来源地址的访问控制机制
Order:检查次序
Order allow,deny
Order deny,allow
Allow from
Deny from

来源地址:
IP
NetAddr:
192.168
192.168.0.0
192.168.0.0/24
192.168.98.1/255.255.255.0
* 定义默认主页面
1
DirecotryIndex index.html index.html.var
* 日至设定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
错误日志:
ErrorLog logs/error_log
LogLevel warn

debug, info, notice, warn, error, crit, alert, emerg

访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);
%t:Time the request was received (standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的道行信息(method url version);
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;

详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
* 路径别名
1
2
3
4
5
6
7
8
9
DocumentRoot "/www/htocs"
http://www.maricle.com.cn/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

Alias /URL/ "/PATH/TO/SOMEDIR/"

Alias /bbs/ "/forum/htdocs"
http://www.maricle.com.cn/bbs/index.html
--> /forum/htdocs/bbs/
* 设定默认字符集
1
2
3
AddDefaultCharset UTF-8

GBK, GB2312, GB18030
* 基于用户的访问控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;

认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;

认证类型:
basic:明文
digest:消息摘要

安全域:需要用户认证后方能访问的路径;
应该通过名称对其进行标识,并用于告知用户认证的原因;

用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;

存储:
文本文件
SQL数据库
ldap
nis

basic认证:
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>

允许账号文件中的所有用户登录访问:
Require valid-user

(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户

(3) 实现基于组进行认证
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directory>

要提供:用户账号文件和组文件;

组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ...


示例:
<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 webadmin
</Directory>

基于用户的访问控制

基于组的访问控制

* 虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;

可混合使用上述三种方式中任意方式;

注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot

每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
SeverName
DocumentRoot ""
</VirtualHost>

ServerAlias: 虚拟主机的别名;
ErrorLog
CustomLog
<Directory "">
</Directory>

示例1:基于ip
<VirtualHost 192.168.98.138:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 192.168.98.150:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

示例2:基于port
<VirtualHost 192.168.98.138:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 192.168.98.138:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>

示例3:基于hostname
<VirtualHost 192.168.98.138:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 192.168.98.138:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 192.168.98.138:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>

基于IP地址的虚拟主机
在httpd.conf末尾加上上述示例3,使用IP命令配置三个IP地址,注释掉默认的DocumentRoot,创建相应的DocumentRoot目录,保证监听端口都为80

基于端口号的虚拟主机
在httpd.conf末尾加上上述示例2,配置Listen 监听多个端口。创建相应的DocumentRoot目录,保证指定的端口都被监听。

基于主机名的访问控制
保证IP地址和端口号都不变,确保ServerName 监听本网络地址。

* 内置的status页面
1
2
3
4
5
6
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>