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:
"_" 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,如需转载请自行联系原作者