一、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式
centos6中光盘的本地yum源默认httpd程序包是2.2版本的,而centos7中默认的httpd程序包2.4版本的,centos7要安装httpd-2.2就要下载好源码包和对应的依赖包进行编译安装,安装之前先简单讲解一下httpd的这三种处理模型,需要注意的是httpd-2.2的event事件驱动模型还只是测试使用功能并且不支持同时编译多个模块,每次只能选定一个模块。
其对应的配置文为:/etc/httpd/conf/httpd.conf
prefork:多进程模型,每个进程响应一个请求
一个主进程:负责生产子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理n个子进程:每个子进程处理一个请求
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,有最大空闲和最小空闲
work:多进程多线程模型,每个线程处理一个用户请求
一个主进程:负责生成子进程,负责创建套接字,负责接收请求,比将其派发给某子进程进行处理多个子进程:每个子进程负责生成多个线程,每个线程:负责响应用户请求
并发响应数量:M*N
M:子进程数量
N:每个子进程所能创建的最大线程数量
event:事件驱动模型,多进程模型,每个进程响应多个请求
一个主进程:负责生成子进程,负责创建套接字,负责接收请求,比将其派发给某子进程进行处理
子进程:基于事件驱动机制只想响应多个请求
httpd-2.2:仍为测试使用模型
httpd-2.4:event可在生产环境中使用
以下为编译安装httpd-2.2的步骤:
1.安装依赖环境组包
~]#yum install zlib-devel-y
~]#yum install expat-devel -y
~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y
2.提前下载好httpd安装的依赖包apr/apr-util,并解压安装
~]# ls
apr-1.6.5.tar.gz apr-util-1.6.1.tar.gz httpd-2.2.32.tar.gz
~]# tar -zxvf apr-1.6.5.tar.gz
~]# tar -zxvf apr-util-1.6.1.tar.gz
~]# cd apr-1.6.5
apr-1.6.5]#./configure --prefix=/usr/local/apr-httpd/ --with-apr=/usr/local/apr-httpd/
apr-1.6.5]# make && make install
apr-1.6.5]#cd /root/apr-util-1.6.1
apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/
apr-util-1.6.1]# make && make install
3.编译安装httpd-2.2
apr-util-1.6.5]# cd ~
~]# tar -zxvf httpd-2.2.32.tar.gz
~]# cd httpd-2.2.32
httpd-2.2.32]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd/ --enable-so --enable-deflate --enable-headers --enable-rewrite --with-mpm=prefork --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/ --with-included-apr
httpd-2.2.32] make && make install
4.启动httpd,并查看80端口是否监听
apache]# /usr/local/apache/bin/httpd -k start
apache]# ss -tnl | grep 80
LISTEN 0 128 :::80 :::*
httpd2.2默认是prefork方式下工作的,要在几个工作方式中切换,则需要修改etc/sysconfig/httpd下对应的配置,并重启服务即可。
~]# vim /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.event #将该选项切换到对应模式,重启服务即可
二、简述request报文请求方法和状态响应码
http请求报文:http request
http响应报文:http response
一次http事务:请求<-->响应
http事务:
请求:request
响应:response
报文语法格式:
request报文
<method><request-URL><version>
<HEADERS>
<enter-body>
response报文
<version><status><reason-phrsse>
<HEADERS>
<enter-body>
method:请求方法,标明客户端希望服务器对资源进行的动作
GET,HEAD,POST,PUT(DAV),DELETE,TRACE,OPTIONS
version:
HTTP/<major><minor>
status:
三位数字:如200,301,302,404,502;标记请求处理过程中发生的情况
reason-phrase:
状态码所标记的状态的简要描述
headers:
每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面各一个冒号,而后跟上一个可选空格,接着是一个值
enter-body:
请求时附加的数据或响应时附加的数据
method(方法):
GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部
POST:向服务器发动要处理的数据
PUT:将请求的主体部分存储在服务器上
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
协议查看或分析工具:
tcpdump, tshark, wireshark
status(状态码):
1xx:100-101,信息提示
2xx:200-206,成功
3xx:300-305,重定向
4xx:400-415,错误类信息,客户端错误
5xx:500-505,错误类信息,服务器端错误
常用状态码:
200:成功,请求的所有数据通过响应报文的enter-body部分发送;OK
301:请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302:与301相似,但在响应报文中通过Location指明资源现状所处临时新位置;Found
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401:需要输入账号和密码认证方式方能访问资源;Unauthorized
403:请求被禁止;Forbidden
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway
三、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例
httpd基于虚拟主机:
虚拟主机
站点标识:socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同:
请求报文首部
Host:www.listen.com
有三种实现方案:
基于IP:
为每个虚拟主机准备至少一个IP地址
基于port:
为每个虚拟主机使用至少一个独立的port
基于FQDN:
为每个虚拟主机使用至少一个FQDN
注意:一般虚拟主机不要与中心主机混用,因此,要使用虚拟主机,得先禁用“main”主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可用指令:
ServerAlias:虚拟主机的别名,可多次使用
ErrorLog:错误日志
CustomLog:访问日志
<Directory "">
....
</Directory>
Alias
......
基于IP的虚拟主机示例:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.138:80>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
基于端口的虚拟主机:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.137:8080>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
基于FQDN的虚拟主机:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.137:80>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
注意:如果是httpd-2.2,则使用基于FQDN的虚拟主机时,需要事先使用如下指令:
NameVirtualHost IP:PORT
站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
文件系统路径:
<Directory "">
...
</Directory>
<File "">
....
</File>
<FileMatch "">
.....
</FileMatch>
URL路径:
<Location "">
....
</Location>
<LocationMatch "">
....
</LocationMatch>
<Directory>中“基于源地址”实现访问控制
httpd-2.2
(1)AllowOverride
与访问控制相关的那些指令可以放在.htaccess文件(每个目录下都可以有一个)中
ALL
None
(2)order和allow、deny
order:定义生效次序,写在后面的表示默认法则
Allow from,Deny from
来源地址:
IP
NetAddr:
192.168
192.168.0.0
192.168.0.0/24
192.168.0.0/255.255.255.0
httpd-2.4
基于IP控制:
Require ip IP地址或网络地址
Require not ip IP地址或网络地址
基于主机名控制
Require host 主机名或域名
Require not host 主机名或域名
控制页面资源允许所以来源的主机可访问:
httpd-2.2
<Directory "">
...
Order allow,deny
Allow from all
</Directory>
httpd-2.4
<Directory "">
...
Require all granted
</Directory>
控制页面资源拒绝所有来源的主机可访问:
httpd-2.2
<Directory "">
...
Order allow,deny
Deny from all
</Directory>
httpd-2.4
<Directory "">
...
Require all denied
</Directory>
Options
后跟1个或多个空白字符分隔的“选项”列表
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许跟踪符号链接文件所指向的源文件
None
All:All options except for MultiViews.
基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:
Authorization:客户端用户填入账号和密码后再次发动请求报文,认证通过时,则服务器发送响应的资源
认证的方式有两种:
basic:明文
digest:消息摘要认证
安全域:需要用户认证后方能访问的路径,应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码存放于何处?
虚拟账号:仅能用于访问某服务时用到的认证标识
存储:
文本文件
SQL数据库
ldap目录存储
basic认证配置示例:
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType basic
AuthName "提示的说明"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
(2)提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
-m:MD5格式加密
-s:sha格式加密
-D:删除指定用户
-b:批模式添加用户
htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password
另外:基于组账号进行认证
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType basic
AuthName "提示的说明"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_USER_GROUPE_FILE"
Require group grpname1 grpname2 ...
</Directory>
(2)创建用户账号和组账号文件
组文件:每一行定义一个组
GRP_NAME:username1 username2 ...
持久连接
Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连街,而是继续等待其他资源请求的进行
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应
折中:使用较短的持久连接时长,以及较少的请求数量
KeepAlive ON|OFF
KeepAliveTimeout 15
MaxKeepAliveRequests 100
测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host:WEB_SERVER_IP
注意:httpd-2.4的KeepAliveTimeout可以是毫秒级的