** 1 概述**
HTTPD 2.4默认是用于centOS7上,该软件相比于HTTPD2.2 有了功能的改进。本文将对httpd2.4的新功能进行介绍,并介绍相关的常见配置
由于格式问题,本文的相关代码见文章 http://ghbsunny.blog.51cto.com/7759574/1970553
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 7:httpd-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.servicesystemctl{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.confInclude /etc/httpd24/extra/httpd-mpm.confLoadModule mpm_event_module modules/mod_mpm_event.so
(2)切换主目录:
DocumentRoot /path
这个和centOS6不一样,先改配置文件,把DocumentRoot更改,然后要设置directory进行授权。cent7上默认创建的目录是不允许访问的。所以要进行授权。
vim /etc/httpd/conf/httpd.confDocumentRoot /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 grantedrequire 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 deniedrequire ip 172.18.50.63</requireany></directory>
(4) 虚拟主机
基于FQDN的虚拟主机也不再需要NameVirutalHost指令,但是centos6(2.2)要配置namevirtualhost:80,2.4不需要配置这行代码
例子一
<VirtualHost:80>ServerName www.b.netDocumentRoot "/apps/b.net/htdocs" <Directory"/apps/b.net/htdocs">Options NoneAllowOverride NoneRequire 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.comdocumentroot "/app/a.com/"</virtualhost><virtualhost *:80>servername www.b.comdocumentroot "/app/b.com/"</virtualhost><virtualhost *:80>servername www.c.comdocumentroot "/app/c.com/"</virtualhost>
测试的主机指定的dns要能解析这三个站点,或者可以直接添加在测试主机的hosts进行测试
(5) 开启https
安装mod_ssl,和httpd-2.2相同配置
(6) 长连接
KeepAlive on #默认支持持久连接KeepAlive Timeout #msMaxKeepAlive 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,这个buffer和socket 相关联。
.4 系统调用write()返回,产生一个上下文切换:从kernel mode 切换到user mode(第4次切换),然后DMA从kernel 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/" 是后端的服务器ProxyPassReverse "/" "http://www.example.com/"# ProxyPassReverse是指后端服务器"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>
servername www.a.comdocumentroot"/app/a.com/"proxypass"/" "http://172.18.50.61/"proxypassreverse"/" "http://172.18.50.61"</virtualhost><virtualhost:80>
servernamewww.b.com
documentroot"/app/b.com/"proxypass"/bbs" "http://172.18.50.63/sunny.txt"proxypassreverse"/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。