1、新特性
- 新特性
MPM支持运行为DSO机制;以模块形式按需加载
event MPM生产环境可用
异步读写机制
支持每模块及每目录的单独日志级别定义
每请求相关的专用配置
增强版的表达式分析式
毫秒级持久连接时长定义
基于FQDN的虚拟主机不需要NameVirutalHost指令
新指令,AllowOverrideList
支持用户自定义变量
更低的内存消耗 - 修改了一些配置机制
不再支持使用Order, Deny, Allow来做基于IP的访问控制 - 新模块
(1) mod_proxy_fcgi
FastCGI Protocol backend for mod_proxy
(2) mod_remoteip
Replaces the apparent client remote IP address and hostname for the request with the IP address list presented by a proxies or a load balancer via the request headers.
(3) mod_ratelimit
Provides Bandwidth Rate Limiting for Clients
2、CentOS 7 httpd程序环境
CentOS 7:httpd-2.4
安装方法:rpm,编译安装
Rpm安装程序环境:
配置文件和httpd-2.2没有区别
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf,httpd-2.2中没有这个文件
systemd unit file:/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
httpd-2.4支持MPM的动态切换
日志文件:
/var/log/httpd
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:没有变化
/usr/lib64/httpd/modules
服务控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service
3、httpd-2.4配置
- 切换使用的MPM
vim /etc/httpd/conf.modules.d/00-mpm.conf
httpd-2.2中是修改vim /etc/sysconfig/httpd文件,两者有区别
ab -c 100 -n 1000 http://172.18.21.107/ ---测试一下event MPM模式性能,发现性能和prefork差不多
因为httpd-2.4是基于模块化的,所以编译安装时不需要像httpd-2.2一样安装三种模式下的三个程序,每个程序都需要编译安装一次。
- 修改主目录
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/app/website1"
<directory /app/website1>
require all granted ---因为在httpd-2.4里面默认对更改的主目录所有人是没有授权的,也就是不能访问,所以必须对这个目录进行授权才可以
</directory>
- 基于IP的访问控制
无明确授权的目录,默认拒绝
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝
HOSTNAME分为两类:
FQDN:特定主机
domin.tld:指定域名下的所有主机,也可以用域名
允许所有的,但拒绝特定的
<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒绝特定IP
</RequireAll>
拒绝所有的,但允许特定的
<RequireAny>
Require all denied
require ip 172.16.1.1允许特定IP
</RequireAny
示例
1、实现允许所有的主机访问,但拒绝172.18.21.106
vim /etc/httpd/conf.d/test.conf
<directory "/app/website1">
<requireall>
require all granted
require not ip 172.18.21.106
</requireall>
</directory>
2、实现拒绝所有的主机,但允许172.18.21.106主机访问
vim /etc/httpd/conf.d/test.conf
<directory "/app/website1">
<requireany>
require all denied
require ip 172.18.21.106
</requireany>
</directory>
测试以上两种配置
curl -I 172.18.21.107 ---可以用这个命令进行测试是否允许访问
HTTP/1.1 403 Forbidden ---403表示禁止访问,如果是200就表示允许访问
Date: Fri, 29 Sep 2017 08:31:52 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
总结:curl -I 这个命令很常用,可以用来显示响应报文的头部信息,这个响应报文是从服务器响应给客户端的。
- 虚拟主机
1、创建虚拟主机的三个主目录文件
mkdir /app/{a.com,b.com,c.com}
echo /app/a.com > /app/a.com/index.html
echo /app/b.com > /app/b.com/index.html
echo /app/c.com > /app/c.com/index.html
2、创建配置文件
vim /etc/httpd/conf.d/vhost.conf
<virtualhost *:80>
servername www.a.com
documentroot "/app/a.com"
<directory "/app/a.com">
require all granted
</directory>
</virtualhost>
<virtualhost *:80>
servername www.b.com
documentroot "/app/b.com"
<directory "/app/b.com">
require all granted
</directory>
</virtualhost>
<virtualhost *:80>
servername www.c.com
documentroot "/app/c.com"
<directory "/app/c.com">
require all granted
</directory>
</virtualhost>
systemctl reload httpd
- https和持久连接
安装mod_ssl,实现https的配置和httpd-2.2操作相同
支持毫秒级持久连接时长定义
KeepAlive on
KeepAliveTimeout
MaxKeepAliveRequests 100
用如下方法发送一个请求报文,可以判断默认的配置是否支持持久连接
[root@centos6 httpd]#telnet 172.18.21.107 80
Trying 172.18.21.107...
Connected to 172.18.21.107.
Escape character is '^]'.
GET / http/1.1 ---请求报文的开始行:方法、URL(/表示访问网站的根目录)、协议类型
host :www.a.com ---请求报文的头部行,执行完这个操作后要按两次回车才能显示响应报文的头部信息及访问的内容
HTTP/1.1 200 OK
Date: Sat, 30 Sep 2017 11:27:59 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 30 Sep 2017 11:07:57 GMT
ETag: "b-55a66275eb66c"
Accept-Ranges: bytes
Content-Length: 11
Content-Type: text/html; charset=UTF-8
/app/a.com ----显示访问的内容
GET / http/1.1 ---连接一次可以发送多个请求,说明默认就是持久连接的
host :www.b.com
HTTP/1.1 200 OK
Date: Sat, 30 Sep 2017 11:28:34 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 30 Sep 2017 11:08:10 GMT
ETag: "b-55a66282ab513"
Accept-Ranges: bytes
Content-Length: 11
Content-Type: text/html; charset=UTF-8
httpd-2.4 的主配置文件中没有上面说的持久连接的三行内容,但默认是持久连接的,可以把上面三行加到配置文件中调整持久连接的时间和最大请求次数。
- sendfile机制
不用sendfile 的传统网络传输过程是:比如客户端发送一个下载请求,服务器端在访问资源时,要到磁盘上去下载数据,这个过程是用户空间通过系统调用给内核发指令,内核到磁盘上去读数据,并将数据存储到内核的缓存空间,然后再将数据发送给用户空间,并存储到用户空间的缓存空间,用户空间封装http的头部,然后将数据写入用户的缓存空间,通过系统调用将数据发送给内核,缓存到内核的存储空间,然后将数据发送出去,这里用户缓存空间和内核的缓存空间都是内存空间,只不过各自有各自的内存空间,并且各自有各自的读的缓存空间和写的缓存空间。
sendfie机制的作用是用户发送指令给内核空间后,内核直接从磁盘上读取数据并发送出去,这样可以有效的提升性能。
如何开启
vim /etc/httpd/conf/httpd.conf
EnableSendfile on ---默认这一项是开启的,就不用改了
4、httpd的反向代理功能
反向代理就是转发,也就是客户端去访问反向代理服务器,通过反向代理服务器转发调度功能去访问web服务器。
实现过程如下:
需要三台主机,a客户端,b是反向代理服务器,c是web服务器
1、在b上的操作:
vim /etc/httpd/conf.d/vhost.conf
<virtualhost *:80>
servername www.a.com
documentroot "/app/a.com"
<directory "/app/a.com">
require all granted
</directory>
proxypass "/" "http://172.18.21.106/"
proxypassreverse "/" "http://172.18.21.106/" ---表示客户端访问b的主目录就转发给c,c的地址是172.18.21.106,这里也可以在/后面加上目录的名字,表示访问主目录下的特定目录
</virtualhost>
2、在c上搭建一个web服务器,并且主页文件内容是alias / /root/text
3、在a上测试
curl www.a.com a去访问b
alias / /root/text ---发现显示的是c的内容,转发成功
同时在c上打开日志可以发现访问请求是来自b,而不是来自a