HTTP 之 httpd-2.4介绍和配置

** 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容