1  概述

HTTPD 2.4默认是用于centOS7上,该软件相比于HTTPD2.2 有了功能的改进。本文将对httpd2.4的新功能进行介绍,并介绍相关的常见配置

2  HTTPD 新特性

.(1) MPM支持运行为DSO机制;以模块形式按需加载,DSO:动态的共享模块

.(2) event MPM生产环境可用

.(3) 异步读写机制

.(4) 支持每模块及每目录的单独日志级别定义,centos6上是每个虚拟主机的日志记录,不支持目录的日志记录

.(5) 每请求相关的专用配置

.(6) 增强版的表达式分析式

.(7) 毫秒级持久连接时长定义

.(8) 基于FQDN的虚拟主机不需要NameVirutalHost指令

.(9) 新指令,AllowOverrideList

.(10) 支持用户自定义变量

.(11) 更低的内存消耗

3  配置机制变更

HTTPD2.4不再支持使用Order, Deny, Allow来做基于IP的访问控制

.新模块

.(1) mod_proxy_fcgi

FastCGI Protocol backend formod_proxy

.(2) mod_remoteip

Replaces the apparent client remoteIP address and hostname for the request with the IP address list presented by aproxies or a load balancer via the request headers.

.(3) mod_ratelimit

Provides Bandwidth Rate Limiting forClients 

CentOS 7 httpd程序环境

.CentOS 7httpd-2.4

.安装方法

rpm,编译安装

.Rpm安装程序环境:

.配置文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d/*.conf

.模块相关的配置文件:

/etc/httpd/conf.modules.d/*.conf

.systemdunit file

/usr/lib/systemd/system/httpd.service

.主程序文件:

/usr/sbin/httpd

httpd-2.4支持MPM的动态切换

CentOS 7 httpd 程序环境

.日志文件:

/var/log/httpd

access_log:访问日志

error_log:错误日志

.站点文档:

/var/www/html

.模块文件路径:

/usr/lib64/httpd/modules

.服务控制:

systemctlenable|disablehttpd.service
systemctl{start|stop|restart|status}httpd.service

4   常见配置

.(1) 切换使用的MPM

.Centos 7:/etc/httpd/conf.modules.d/00-mpm.conf

00-mpm.conf这个文件下启用对应MPM相关的LoadModule指令即可

如果启动的命令是apachectl,那么关闭的时候也要用apachectl来控制,而不能用systemctl来控制,这个是配套的

如果更换模块为worker或者event后重启失败,可能是/etc/httpd/conf.d/php.conf的值设置有问题,把以下两行注释,再重启即可

#php_value session.save_handler "files"
#php_valuesession.save_path   "/var/lib/php/session"


.centos6编译安装:

vim  /etc/httpd24/httpd.conf
Include /etc/httpd24/extra/httpd-mpm.conf
LoadModule  mpm_event_module  modules/mod_mpm_event.so

(2)切换主目录:

DocumentRoot  /path

这个和centOS6不一样,先改配置文件,把DocumentRoot更改,然后要设置directory进行授权。cent7上默认创建的目录是不允许访问的。所以要进行授权。

vim /etc/httpd/conf/httpd.conf
DocumentRoot  /app


授权如下

vim  /etc/httpd/conf.d/newhome.conf
<directory /app>
require all granted
</directory>

(3) 基于IP的访问控制

无明确授权的目录,默认拒绝

允许所有主机访问:Require all granted

拒绝所有主机访问:Require all denied

控制特定的IP访问:

Require ip  IP  ADDR:授权指定来源的IP访问

Require not ip  IP  ADDR:拒绝特定的IP访问

控制特定的主机访问:

Require host HOSTNAME:授权特定主机访问

Require not host HOSTNAME:拒绝

HOSTNAME

         FQDN:特定主机

        domin.tld:指定域名下的所有主机

.不能有失败,至少有一个成功匹配

<RequireAll>
……
</RequireAll>


#以下配置除了172.18.50.63这个ip不能访问,其他所有的主机都能访问

vim  /etc/httpd/conf.d/newhome.conf
<directory /app>
<requireall>
require all granted
require not ip 172.18.50.63
</requireall>
</directory>


.多个语句有一个成功,即成功

<RequireAny>
……
</RequireAny>


#以下配置除了172.18.50.63这个ip能访问,其他所有的主机都不能访问

vim  /etc/httpd/conf.d/newhome.conf
<directory /app>
<requireany>
require all denied
require  ip 172.18.50.63
</requireany>
</directory>


(4) 虚拟主机

基于FQDN的虚拟主机也不再需要NameVirutalHost指令,但是centos62.2)要配置namevirtualhost*:802.4不需要配置这行代码

 例子一

<VirtualHost*:80>
ServerName  www.b.net
DocumentRoot  "/apps/b.net/htdocs" 
<Directory"/apps/b.net/htdocs">
Options None
AllowOverride  None
Require all granted
</Directory>
</VirtualHost>

 例子二

首先要建立三个主站点a.com,b.com,c.com,虚拟主机建立完成后,默认的主站点会失效,主站点会变更为配置文件中的第一个虚拟主机的站点,注意:任意目录下的页面只有显式授权才能被访问

虚拟主机配置文件如下

vim  /etc/httpd/conf.d/virtualhost.conf
<directory /app>
require all granted
</directory>
<virtualhost *:80>
servername www.a.com
documentroot "/app/a.com/"
</virtualhost>
<virtualhost *:80>
servername www.b.com
documentroot "/app/b.com/"
</virtualhost>
<virtualhost *:80>
servername www.c.com
documentroot "/app/c.com/"
</virtualhost>

测试的主机指定的dns要能解析这三个站点,或者可以直接添加在测试主机的hosts进行测试 

(5) 开启https

安装mod_ssl,和httpd-2.2相同配置

(6) 长连接

KeepAlive  on 
#默认支持持久连接
KeepAlive  Timeout #ms
MaxKeepAlive  Requests 100


毫秒级持久连接时长定义

 (7) Sendfile机制

提高访问性能的设置,默认启用,配置语句 

EnableSendfile on

Sendfile机制的相关原理如下

.不用sendfile的传统网络传输过程:

.read(file, tmp_buf, len)

.write(socket, tmp_buf, len)

实现机制如下:

.硬盘>>kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

资源是从硬盘复制到内核缓冲区,然后在复制到httpd的应用程序缓冲区,然后应用程序封装响应头部,再交给内核缓存,造成了效率低下

.一般网络应用通过读硬盘数据,写数据到socket 来完成网络传输,底层执行过程:

.1系统调用read()产生一个上下文切换:从user mode 切换到kernel mode,然后DMA 执行拷贝,把文件数据从硬盘读到一个kernel buffer 里。

.2 数据从kernelbuffer 拷贝到userbuffer,然后系统调用read() 返回,这时又产生一个上下文切换:从kernel mode 切换到user mode

.3 系统调用write()产生一个上下文切换:从user mode 切换到kernel mode,然后把步骤2读到user buffer 的数据拷贝到kernel buffer(数据第2次拷贝到kernel buffer),不过这次是个不同的kernel buffer,这个buffersocket 相关联。

.4 系统调用write()返回,产生一个上下文切换:从kernel mode 切换到user mode(4次切换),然后DMAkernel buffer 拷贝数据到协议栈(第4次拷贝)

.上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会有效提升性能

.kernel2.0+ 版本中,系统调用sendfile()就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数

.sendfile()来进行网络传输的过程:

.sendfile(socket, file, len);

.硬盘>>kernel buffer (快速拷贝到kernelsocket buffer) >> 协议栈

.1系统调用sendfile()通过DMA 把硬盘数据拷贝到kernel buffer,然后数据被kernel 直接拷贝到另外一个与socket 相关的kernel buffer。这里没有user mode kernel mode 之间的切换,在kernel 中直接完成了从一个buffer 到另一个buffer 的拷贝。

.2DMA 把数据从kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从usermode 拷贝到kernelmode,因为数据就在kernel

5  反向代理功能

2.4默认支持反向代理,反向代理相当于是代替客户端访问后端服务器,httpd可以实现,但是httpd不能实现大规模的调度作用,所以一般不用来实现反向代理, 一般前端用haproxy这种专业的反向代理服务器,本身没有web功能,就是用来做代理用的。

nginx也可以做代理服务器,邮件服务器,网页服务器,但是,nginx的功能比haproxy弱,但是企业还是比较多用nginx来做代理服务器,因为nginx的代理服务器功能基本能满足转发,而且可以当网页服务器,本身可以响应web请求。

.启用反向代理

ProxyPass  "/"   "http://www.example.com/"
# ProxyPass  指请求从客户端到反向代理服务器
#"/" 这里代表URL,这里是主站点的根
#"http://www.example.com/"  是后端的服务器
ProxyPa***everse   "/"   "http://www.example.com/"
# ProxyPa***everse是指后端服务器"http://www.example.com/"将结果返回到反向代理的服务器上

以上两个语句是配套出现

例子

例子一

.特定URL反向代理

172.18.50.75这台机器上配置,如果访问http://172.18.50.75 会被转发到http://172.18.50.61/,如果访问http://172.18.50.75/bbs,就会被转发到http://172.18.50.63/sunny.txt

vim/etc/httpd/conf.d/virtualhost.conf
<directory/app>
requireall granted
</directory>
<virtualhost*:80>
servernamewww.a.com
documentroot"/app/a.com/"
proxypass"/" "http://172.18.50.61/"
proxypa***everse"/" "http://172.18.50.61"
</virtualhost>
<virtualhost*:80>
servernamewww.b.com
documentroot"/app/b.com/"
proxypass"/bbs" "http://172.18.50.63/sunny.txt"
proxypa***everse"/bbs" "http://172.18.50.63/sunny.txt"
</virtualhost>

测试,在能够解析http://172.18.50.75的主机上curl  http://172.18.50.75/bbs  curl  http://172.18.50.75 看到结果,如果有重定向,加-L选项,会将请求再发一次,发到重定向后的地址

例子二

实现基于端口的虚拟主机

vim /etc/httpd/conf.d/virtualhost.conf
<directory/app>
requireall granted
</directory>
listen8080
<virtualhost*:8080>
servernamewww.c.com
documentroot"/app/c.com/"
</virtualhost>
测试,在其他主机上curl http://172.18.50.75:8080

6 总结

本文主要是介绍了httpd的一些新特性和常见的几种配置,其他内容可以参见博客http://ghbsunny.blog.51cto.com/7759574/1970486。