http://httpd.apache.org/docs/2.2/ //官方手册
一、httpd的特性
二、安装httpd
三、httpd基础配置详解
四、详细实验
一、httpd的特性
高度模块化:core + modules
DSO:dynamic share object动态共享对象,支持动态装卸载
MPM:multi process modules:多道处理模块,决定httpd的工作方式来响应用户请求
prefork:多进程模型,每个进程响应一个请求;
1个主进程:负责[生成/回收]子进程处理用户请求;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
n个子进程:每个子进程处理一个请求
工作模型:会预先生成几个空闲进程,随时等待响应用户请求;定义最大空闲和最小空闲
worker:多进程多线程模型,每线程处理一个用户请求
1个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
n个子进程:每个子进程负责生成多个线程
每个线程,负责响应用户请求
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量
event:事件驱动模型,多进程模型,每个进程响应多个请求
1个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
子进程:基于事件驱动机制直接响应多个请求;
http2.2:仍为测试使用模型
http2.4:event可以直接使用
============================================
prefork 1=n===? 1*n //每个子进程只响应1个请求
worker 1=n=m===? m*n //1个子进程响应1个请求
event 1==n===?? 1*n //每个子进程响应多个请求
并发服务器响应模型:
单进程模型
多进程模型
复用的I/O的模型
多线程
事件驱动
复用的多进程多线程模型
MPM:2.2和2.4
prefork:多进程模型,一个主进程,生成n个子进程,一个进程响应一个请求
worker:多进程多线程模型,一个主进程,生成多个子进程,每个子进程生成多个线程,一个线程响应一个用户请求
event:事件驱动模型,多进程模型,一个进程,生成多个子进程,一个进程响应多个请求
相同点:都有主进程,都有子进程 //最常见的多道处理模块机制
http的程序版本
httpd 1.3官方已经停止维护
http2.0,2.4是主流版本
http2.4目前最稳定
httpd的功能特性
CGI:common gateway Interface
虚拟主机:IP,PORT,FQDN
反向代理:
负载均衡:
丰富的用户认证机制:
basic
digest
支持第三方模块:
...
二、安装httpd
rpm包
编译安装:定制新功能,或其他原因
CentOS 6:httpd2.2
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd //prefork的模型,默认
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
//http2.2这几个模型,是不支持动态装卸载的
日志文件:
/var/log/httpd
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules/
服务控制
service
chkconfig httpd on|off
CentOS 7: httpd2.4 //MPM可以动态装载
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块配置文件
/etc/httpd/conf.modules.d/* 根据名字按顺序进行加载
systemd unit file:
/usr/lib/systemd/system/httpd.service
基于unit加载服务
主程序:
/usr/sbin/httpd //http-2.4支持MPM的动态切换
日志文件:
/var/log/httpd
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules/
服务控制:
sysemctl {enabled|disable} httpd.service
三、httpd基础配置详解
httpd-2.2常用配置
httpd.conf //三段
1.全局配置
2.主服务器配置
3.虚拟主机配置
配置格式:
directive value
directive:不区分大小写,
value:一般也不区分大小写,为路径时,是否区分字符大小写,取决于fs
常用配置:
//cp httpd.conf{,.bak} //建议先备份一下
1.修改监听的ip和port
Listen [IP:]PORT
1.//省略IP标识为0.0.0.0;本机所有ip
2.listen 80
listen 8080 //同时在80和8080端口提供服务
3.修改监听socket,重启服务进程才能生效,reload不能生效
2.持久链接 //
persistent Connection:TCP连接建立后,每个资源获取完成后,不完全断开链接,而是继续等待其他资源请求的进行
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到响应;
折中:使用较短的持久链接时长,以及较少的请求数量
KeepAlive On|Off //默认关闭
MaxKeepAliveRequests 100 //最多请求次数
KeepAliveTimeout 15 //超时时间,相当于汽车的3年10w公里,一样,只要满足其中一样,就废弃该进程
3.MPM
httpd2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的模块
//CentOS所提供的的rpm包同时提供了三个rpm包,但同时只能使用一个
httpd:prefork //默认使用的MPM模块
httpd.worker:
httpd.event //分别用于实现对不同的MPM机制的实现,确认现在使用
ps aux |grep httpd //查看当前使用的模型
查看httpd程序的模块列表
1.httpd -l //静态编译的模块
2.httpd -M //查看静态和动态[共享]的所有模块
更换其他MPM
1.service httpd stop
2.vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event} //启用
3.service httpd start
4.ps aux |grep httpd
注意:httpd2.2不建议使用event
而且用线程取代进程,所带来的的性能提升是有限的
重启服务进程方式可生效
4.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Prefork
<
IfModule
prefork.c>
StartServers 8 //服务启动进程
MinSpareServers 5 //最小空闲进程
MaxSpareServers 20 //最大保持空闲的进程的数量
ServerLimit 256 //最多允许maxclient启用多少个进程
MaxClients 256 //最大并发量,就是同时访问数量
MaxRequestsPerChild 4000 //每个进程最多可以处理多少个请求
</
IfModule
>
pv:page view页面访问单个页面
uv:用户访问量
Worker
<
IfModule
worker.c>
StartServers 4 //随服务启动进程数
MaxClients 300 //最大并发客户端连接数
MinSpareThreads 25 //最少保留多少空闲线程数量
MaxSpareThreads 75 // 4*25=100>75因此开机只会启动3个进程,1个为主进程
ThreadsPerChild 25 //每个进程可以生成的子线程
MaxRequestsPerChild 0 //每个进程最多可以处理多少个请求,能处理多少个,就处理多少个
</
IfModule
>
|
watch -n.5 'ps aux |grep httpd' //每0.5s检测一次
service httpd restart //刚开始启动4个,后期会减去一个
5.DSO//动态加载模块
配置指定实现模块
1
2
3
4
|
LoadModule <
mod_name
> <
mod_path
> //模块名称相对路径,相对于ServerRoot路径,/etc/httpd/
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
|
6.定义中心主机的文档页面路径
只提供一个站点:
1.只提供一个虚拟主机
2.使用Main server
文档路径映射:DocuemntRoot指向的路径为URL路径的起始位置
DocumentRoot "/var/www/html" //设定根目录
7.站点访问控制
可基于两种机制指明对哪些资源进行何种访问控制
文件系统路径
URL路径
[FS路径]/var/www/html/index.html-->[URL路径]192.168.0.1/index.html
注意:访问控制实在 <DocumentRoot /var/www/html>中定义的
1.单个目录及其子目录
<Directory />
Options FollowSymLinks
AllowOverride None
...
</Directory>
2.单个文件
<file "" >
...
</file>
3.一类文件
<FileMatch "PATTERN" > //匹配一类文件,但是要启用正则表达式引擎才能使用
...
</FileMatch>
4.URL路径
<Location "/" >
...
</Location>
<LocationMatch "/" >
...
</LocationMatch>
示例:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Indexes:指明的URL路径下不存在于定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:
8.定义网站主界面:以及访问控制参数
DirectoryIndex index.html index.html.var
重命名index.html ,以及/etc/httpd/conf.d/welcome.conf
service httpd restart //将看到索引
1
2
3
4
5
6
|
<
Directory
"/var/www/html">
Options Indexes FollowSymLinks //删除indexes将看不到索引
AllowOverride None
Order allow,deny
Allow from all
</
Directory
>
|
修改后再次查看:forbidden
1.Options Indexes FollowSymLinks
Indexes :是否允许索引
FollowSymlinks:是否跟随符号链接到源文件
SymLinksifOwnerMatch:链接文件的属主和目标文件的属主相同时
ExecCGI:允许执行cgi脚本
MultiViews:是否允许内容协商
None:都不
All:所有都允许
Options None 最好
2.AllowOverride None //允许覆盖?
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)
All //所有都可以放进去
None:
Authconfig
Limit
FileInfo
//对目录访问的映像特别打,因此不建议使用
3.Order allow,deny //谁可以访问,先匹配allow规则,后匹配deny规则,后面的为默认法则
Allow from all
来源地址:
IP:
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9.定义路径别名
Alias /download/ "/rpms/pub"
http://wwww.baidu.com/download/a.txt
/rpms/pub/a.txt
格式:
Alias /URL/ "/Path/to/some_resource"
10.设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
11.日志
日志类型:访问日志和错误日志
访问日志:
错误日志:
错误日志:
ErrorLog logs/error_log
LogLevel warn
LogLevel级别:debug, info, notice, warn, error, crit, alert, emerg.
当定义到某一个级别的时候:比这个级别高的都要记录
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
访问日志:
CustemLog logs/access_log combined
日志文件 日志格式
1
2
3
4
5
6
7
8
9
10
11
|
日志格式中的宏或者其他定义:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:client的IP地址
%l:Remote User:通常为一个减号("-")
%u:Remote User(from auth;) 非为登录访问时,其为一个减号
$t:服务器收到请求时的时间
%r:first line of request,表示请求报文的首行;记录了请求的“方法”,“URL"以及协议版本号
%>s:响应状态码
%b:响应报文的大小,bytes,不包含http首部
%{Referer}i:请求报文中首部"Referer"的值;即从哪个页面中的超链接跳转至当前页面的;
%(User-Agent);请求报文中首部"User-Agent"的值,即发出请求的程序
|
12.基于用户的访问控制
网站中提供的认证:
1.表单认证
2.http协议自身提供的认证
用户认证的过程发送的账号和密码是明文发送的
认证质询:www.Authenticate:响应码为401,拒绝客户端请求,并说明要求client提供账号和密码
认证:Authentication:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
认证方式:
basic:明文
digest:消息摘要认证
安全域:需要用户认证后才能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码存放于何处:
虚拟账号:仅用于访问某网络服务时用到认证标识
存储:
文本文件;
SQL数据库;
ldap目录存储:
basic认证示例:
1.定义安全域
1
2
3
4
5
6
7
8
9
10
|
<Directory
""
>
Options None
AllowOverride None
//其他定义的
AuthType Basic
AuthName
"String"
AuthUserFIle "/path/to/httpd_passwd“
require user username1 username2 ...
...
</Directory>
Require valid-user
//允许所有用户
|
2.提供账号和密码存储(文本文件)
13.虚拟主机
站点标识:socket
IP相同:但端口不同
IP不同:但端口相同80/443
FQDN不同:端口和IP相同
请求报文中首部 //对应的是FQDN
Host:www.mt.com
三种实现方案:
基于ip:为每个虚拟主机至少准备一个ip地址
基于port:为每个虚拟使用至少一个独立Port
基于FQDN:为每个虚拟主机使用至少一个FQDN
注:一般虚拟主机不和中心主机混用,二者选其一
禁用方法:注释中心主机DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot " "
</VirtualHost>
其他可用指令:
ServerAlias:虚拟主机的别名,可使用多次
ErrorLog:专用的错误日志
CustomLog:
<Directory ...>
...
</Directory>
Alias 等 //在中心主机中实用的都可以在中心主机上使用
14.status页面 //不能随意允许用户访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1.vim httpd.conf 加载模块
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order deny,allow
Allow
from
all
</Location>
httpd -t
service httpd reload
2.http:
//192.168.4.109/server-status
"_"
Waiting
for
Connection,
"S"
Starting up,
"R"
Reading Request,
"W"
Sending Reply,
"K"
Keepalive (read),
"D"
DNS Lookup,
"C"
Closing connection,
"L"
Logging,
"G"
Gracefully finishing,
//等待所有请求完成后,关闭连接
"I"
Idle cleanup of worker,
"."
Open slot with no current process
|
四、详细实验
前提:
setenforce 0 //关闭selinux
iptables -F //清空防火墙规则,防止干扰实验
实验1.basic认证
1.vim httpd.conf
1
2
3
4
5
6
7
8
|
<Directory
"/var/www/html/admin"
>
Options None
AllowOverride None
AuthType Basic
AuthName
"动感地带 Enter Your name"
//提示信息
AuthUserFile
"/etc/httpd/conf/.htpasswd"
Require user tom
</Directory>
|
httpd -t //检查语法,测试目录中的文件后缀要是.html ,否则会出现登录后“forbidden"
2.创建密码文件
htpasswd -c -m .htpasswd tom //第一次用-c,第二次千万不要用-c
htpasswd -m .htpasswd wolf // tom,wolf,jerry
-m :md5加密存放
-D:删除用户
-s:sha加密
Require valid-user //任意用户都可以
3.基于组认证 //失败
1
2
3
4
5
6
|
AuthUserFile
"/etc/httpd/conf/.htpasswd"
1.AuthGroupFile
"/path/to/grouop_file"
2.Require
group
Group1 group2
3.创建用户账号和组账号文件
组文件:每一行定义一个组
GRP_name:username1 username2 ...
//如此简单
|
4.require valid_user //允许任意用户访问
AuthType只有两个:Basic和Diget
mod_auth_basic and by mod_auth_digest
基于组的认证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<Directory
""
>
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile
"/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile
"/PATH/TO/HTTPD_GROUP_FILE"
Require
group
grpname1 grpname2 ...
</Directory>
<Directory /
var
/www/html/upload/>
Options None
AllowOverride None
AuthType Basic
AuthName
"Admin Realm"
AuthUserFile
"/etc/httpd/conf/.htpasswd"
AuthGroupFile
"/etc/httpd/conf/.htgroup"
Require
group
mygroup
</Directory>
[root@httpd conf]# cat ./.htgroup
mygroup: tom Jason
othergroup: obama
|
实验2:虚拟主机 //一个主机上存放多个网站
一.基于不同ip的虚拟主机 //三个站点使用同一个ip,同一个端口,不同域名
1.:192.168.4.110/109/111
1
2
3
4
|
mkdir -pv /www/{a.com,b.net,c.org}/hdocs
echo
"a.com"
> /www/a.com/hdocs/index.html
echo
"c.org"
> /www/c.org/hdocs/index.html
echo
"b.net"
> /www/b.net/hdocs/index.html
|
2.vim httpd.conf
#DocumentRoot "/var/www/html" //注释
建议新建另外一个文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vim /etc/httpd/conf.d/virhosts.conf
<
VirtualHost
192.168.4.109:80>
ServerName www.a.com
DocumentRoot "/www/a.com/hdocs"
</
VirtualHost
>
<
VirtualHost
192.168.4.110:80>
ServerName www.b.net
DocumentRoot "/www/b.net/hdocs"
</
VirtualHost
>
<
VirtualHost
192.168.4.111:80>
ServerName www.c.org
DocumentRoot "/www/c.org/hdocs"
</
VirtualHost
>
|
httpd -t //检查语法
警告信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@localhost conf.d]# httpd -t
[Fri Nov 24 07:51:47 2017] [warn] VirtualHost 192.168.154.132:80 overlaps with VirtualHost 192.168.154.132:80, the first has precedence, perhaps you need a NameVirtualHost directive
[Fri Nov 24 07:51:47 2017] [warn] VirtualHost 192.168.154.132:80 overlaps with VirtualHost 192.168.154.132:80, the first has precedence, perhaps you need a NameVirtualHost directive
[Fri Nov 24 07:51:47 2017] [warn] NameVirtualHost *:80 has no VirtualHosts
Syntax OK
[root@localhost conf.d]# cat virtualhost.conf
NameVirtualHost 192.168.154.132:80
<VirtualHost 192.168.154.132:80>
Servername wwww.a.com
DocumentRoot
"/var/www/html/a.com"
</VirtualHost>
<VirtualHost 192.168.154.132:80>
Servername wwww.b.net
DocumentRoot
"/var/www/html/b.net"
</VirtualHost>
<VirtualHost 192.168.154.132:80>
Servername wwww.c.org
DocumentRoot
"/var/www/html/c.org"
</VirtualHost>
|
//改成这样,或者把ip地址,改为* 就不会出警告信息了
二. 基于端口 //三个站点,同一个ip,不同端口,不同域名
ifconfig eth0:0 down //建议把那几个虚拟断开都关了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
vim vhosts.conf
Listen 888
Listen 8888
<VirtualHost 192.168.4.109:80>
ServerName www.a.com
DocumentRoot
"/www/a.com/hdocs"
</VirtualHost>
<VirtualHost 192.168.4.109:888>
ServerName www.b.net
DocumentRoot
"/www/b.net/hdocs"
</VirtualHost>
<VirtualHost 192.168.4.109:8888>
ServerName www.c.org
DocumentRoot
"/www/c.org/hdocs"
</VirtualHost>
|
httpd -t
service httpd restart
注意:基于端口和基于ip可以混合使用
三.基于FQDN //同端口,同ip,不同域名
1.修改配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
NameVirtualHost 192.168.4.109:80
<
VirtualHost
192.168.4.109:80>
ServerName www.a.com
DocumentRoot "/www/a.com/hdocs"
</
VirtualHost
>
<
VirtualHost
192.168.4.109:80>
ServerName www.b.net
DocumentRoot "/www/b.net/hdocs"
</
VirtualHost
>
<
VirtualHost
192.168.4.109:80>
ServerName www.a.com
DocumentRoot "/www/c.org/hdocs"
</
VirtualHost
>
|
2.修改自己的host文件,或者改为自己建立的dns
vim hosts
192.168.4.109 www.a.org
192.168.4.109 www.b.net
192.168.4.109 www.c.org
IP: 不同ip,不同域名,端口号可以相同,也可以不同
Port: 同一ip,不同端口,不同域名
FQDN: 同一ip,同一端口,不同域名
实验3:keepalive的测试
1.另外一条机器安装telnet,模拟访问server:192.168.4.109
telnet 192.168.4.109 80
GET /index.html HTTP/1.1 //不行的话,可以HTTP/1.0
Host: 192.168.4.109
两个回车
2.KeepAlive On
service httpd reload
再次测试,获取到数据后,不会立即断开
默认超时时间15s,
keepalive具体可以参考:http://blog.csdn.net/zlxfogger/article/details/44919995
附件:修改alias但是不能访问,alias对应的路径
Alias /tt/ "/tmp/test/" //放在DocumentRoot之前就可以了
DocumentRoot "/var/www/html"
附件:Could not reliably determine the server's fully quality
vim httpd.conf
ServerName MT:80 //主机名为MT
书籍推荐:<http协议权威指南>
小结:httpd配置
Listen [IP:]PORT
持久链接:
KeepAlive [On|Off]
MPM:
prefork,worker,event
DSO: LoadModule
httpd -l/-M
DocumentRoot
访问控制
1.<Directory>
Options Indexes FollowSymLinks
Order Allow Deny
Allow from
Deny from
</Directory>
2.<Location>
<Location /server-status>
SetHandler server-status
Order deny,allow
Allow from all
</Location>
定义默认主页面
DirectoryIndex
ErrorLog
CustomLog
LogFormat
%{Referer}i:引用Referer首部的信息
Alias /URL/ "/path/to/somedir/" //斜线双方要么有,要么都没有
AddDefaultCharset
基于用户访问控制
认证方式:basic,digest //主要使用basic
AuthType Basic
AuthName “STIRNG“
AuthUserFile
AuthGroupFile
Require user/group/valid-user //valid有效的,正当的
.htpasswd
htpasswd
虚拟主机:IP,Port,FQDN
本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2044059,如需转载请自行联系原作者