** 1 概述**
HTTPD 2.4默認(rèn)是用于centOS7上,該軟件相比于HTTPD2.2 有了功能的改進(jìn)。本文將對httpd2.4的新功能進(jìn)行介紹,并介紹相關(guān)的常見配置
由于格式問題,本文的相關(guān)代碼見文章 http://ghbsunny.blog.51cto.com/7759574/1970553
2 HTTPD 新特性
.(1) MPM支持運(yùn)行為DSO機(jī)制拧烦;以模塊形式按需加載佑刷,DSO:動態(tài)的共享模塊
.(2) event MPM生產(chǎn)環(huán)境可用
.(3) 異步讀寫機(jī)制
.(4) 支持每模塊及每目錄的單獨(dú)日志級別定義莉擒,centos6上是每個虛擬主機(jī)的日志記錄,不支持目錄的日志記錄
.(5) 每請求相關(guān)的專用配置
.(6) 增強(qiáng)版的表達(dá)式分析式
.(7) 毫秒級持久連接時長定義
.(8) 基于FQDN的虛擬主機(jī)不需要NameVirutalHost指令
.(9) 新指令瘫絮,AllowOverrideList
.(10) 支持用戶自定義變量
.(11) 更低的內(nèi)存消耗
3 配置機(jī)制變更
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程序環(huán)境
.CentOS 7:httpd-2.4
.安裝方法
rpm涨冀,編譯安裝
.Rpm安裝程序環(huán)境:
.配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/.conf
.模塊相關(guān)的配置文件:
/etc/httpd/conf.modules.d/.conf
.systemdunit file:
/usr/lib/systemd/system/httpd.service
.主程序文件:
/usr/sbin/httpd
httpd-2.4支持MPM的動態(tài)切換
CentOS 7 httpd 程序環(huán)境
.日志文件:
/var/log/httpd
access_log:訪問日志
error_log:錯誤日志
.站點(diǎn)文檔:
/var/www/html
.模塊文件路徑:
/usr/lib64/httpd/modules
.服務(wù)控制:
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這個文件下啟用對應(yīng)MPM相關(guān)的LoadModule指令即可
如果啟動的命令是apachectl,那么關(guān)閉的時候也要用apachectl來控制麦萤,而不能用systemctl來控制鹿鳖,這個是配套的
如果更換模塊為worker或者event后重啟失敗,可能是/etc/httpd/conf.d/php.conf的值設(shè)置有問題壮莹,把以下兩行注釋翅帜,再重啟即可
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更改涝滴,然后要設(shè)置directory進(jìn)行授權(quán)。cent7上默認(rèn)創(chuàng)建的目錄是不允許訪問的胶台。所以要進(jìn)行授權(quán)歼疮。
vim /etc/httpd/conf/httpd.confDocumentRoot /app
授權(quán)如下
vim /etc/httpd/conf.d/newhome.conf<directory /app>require all granted</directory>
(3) 基于IP的訪問控制
無明確授權(quán)的目錄,默認(rèn)拒絕
允許所有主機(jī)訪問:Require all granted
拒絕所有主機(jī)訪問:Require all denied
控制特定的IP訪問:
Require ip IP ADDR:授權(quán)指定來源的IP訪問
Require not ip IP ADDR:拒絕特定的IP訪問
控制特定的主機(jī)訪問:
Require host HOSTNAME:授權(quán)特定主機(jī)訪問
Require not host HOSTNAME:拒絕
HOSTNAME:
FQDN:特定主機(jī)
domin.tld:指定域名下的所有主機(jī)
.不能有失敗概作,至少有一個成功匹配
<RequireAll>……</RequireAll>
以下配置除了172.18.50.63這個ip不能訪問腋妙,其他所有的主機(jī)都能訪問
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能訪問讯榕,其他所有的主機(jī)都不能訪問
vim /etc/httpd/conf.d/newhome.conf<directory /app><requireany>require all deniedrequire ip 172.18.50.63</requireany></directory>
(4) 虛擬主機(jī)
基于FQDN的虛擬主機(jī)也不再需要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>
例子二
首先要建立三個主站點(diǎn)a.com,b.com,c.com愚屁,虛擬主機(jī)建立完成后,默認(rèn)的主站點(diǎn)會失效痕檬,主站點(diǎn)會變更為配置文件中的第一個虛擬主機(jī)的站點(diǎn)霎槐,注意:任意目錄下的頁面只有顯式授權(quán)才能被訪問
虛擬主機(jī)配置文件如下
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>
測試的主機(jī)指定的dns要能解析這三個站點(diǎn),或者可以直接添加在測試主機(jī)的hosts進(jìn)行測試
(5) 開啟https
安裝mod_ssl梦谜,和httpd-2.2相同配置
(6) 長連接
KeepAlive on #默認(rèn)支持持久連接KeepAlive Timeout #msMaxKeepAlive Requests 100
毫秒級持久連接時長定義
** (7) Sendfile機(jī)制**
提高訪問性能的設(shè)置丘跌,默認(rèn)啟用,配置語句
EnableSendfile on
Sendfile機(jī)制的相關(guān)原理如下
.不用sendfile的傳統(tǒng)網(wǎng)絡(luò)傳輸過程:
.read(file, tmp_buf, len)
.write(socket, tmp_buf, len)
實(shí)現(xiàn)機(jī)制如下:
.硬盤>>kernel buffer >> user buffer >> kernel socket buffer >> 協(xié)議棧
資源是從硬盤復(fù)制到內(nèi)核緩沖區(qū)唁桩,然后在復(fù)制到httpd的應(yīng)用程序緩沖區(qū)闭树,然后應(yīng)用程序封裝響應(yīng)頭部,再交給內(nèi)核緩存荒澡,造成了效率低下
.一般網(wǎng)絡(luò)應(yīng)用通過讀硬盤數(shù)據(jù)报辱,寫數(shù)據(jù)到socket 來完成網(wǎng)絡(luò)傳輸,底層執(zhí)行過程:
.1系統(tǒng)調(diào)用read()產(chǎn)生一個上下文切換:從user mode 切換到kernel mode,然后DMA 執(zhí)行拷貝单山,把文件數(shù)據(jù)從硬盤讀到一個kernel buffer 里碍现。
.2 數(shù)據(jù)從kernelbuffer 拷貝到userbuffer幅疼,然后系統(tǒng)調(diào)用read() 返回,這時又產(chǎn)生一個上下文切換:從kernel mode 切換到user mode
.3 系統(tǒng)調(diào)用write()產(chǎn)生一個上下文切換:從user mode 切換到kernel mode昼接,然后把步驟2讀到user buffer 的數(shù)據(jù)拷貝到kernel buffer(數(shù)據(jù)第2次拷貝到kernel buffer)爽篷,不過這次是個不同的kernel buffer,這個buffer和socket 相關(guān)聯(lián)慢睡。
.4 系統(tǒng)調(diào)用write()返回逐工,產(chǎn)生一個上下文切換:從kernel mode 切換到user mode(第4次切換),然后DMA從kernel buffer 拷貝數(shù)據(jù)到協(xié)議棧(第4次拷貝)
.上面4個步驟有4次上下文切換,有4次拷貝一睁,如果能減少切換次數(shù)和拷貝次數(shù)將會有效提升性能
.在kernel2.0+ 版本中钻弄,系統(tǒng)調(diào)用sendfile()就是用來簡化上面步驟提升性能的。sendfile() 不但能減少切換次數(shù)而且還能減少拷貝次數(shù)
.用sendfile()來進(jìn)行網(wǎng)絡(luò)傳輸?shù)倪^程:
.sendfile(socket, file, len);
.硬盤>>kernel buffer (快速拷貝到kernelsocket buffer) >> 協(xié)議棧
.1系統(tǒng)調(diào)用sendfile()通過DMA 把硬盤數(shù)據(jù)拷貝到kernel buffer者吁,然后數(shù)據(jù)被kernel 直接拷貝到另外一個與socket 相關(guān)的kernel buffer窘俺。這里沒有user mode 和kernel mode 之間的切換,在kernel 中直接完成了從一個buffer 到另一個buffer 的拷貝复凳。
.2DMA 把數(shù)據(jù)從kernelbuffer 直接拷貝給協(xié)議棧瘤泪,沒有切換,也不需要數(shù)據(jù)從usermode 拷貝到kernelmode育八,因?yàn)閿?shù)據(jù)就在kernel 里
5 反向代理功能
2.4默認(rèn)支持反向代理对途,反向代理相當(dāng)于是代替客戶端訪問后端服務(wù)器,httpd可以實(shí)現(xiàn)髓棋,但是httpd不能實(shí)現(xiàn)大規(guī)模的調(diào)度作用实檀,所以一般不用來實(shí)現(xiàn)反向代理, 一般前端用haproxy這種專業(yè)的反向代理服務(wù)器按声,本身沒有web功能膳犹,就是用來做代理用的。
nginx也可以做代理服務(wù)器签则,郵件服務(wù)器须床,網(wǎng)頁服務(wù)器,但是渐裂,nginx的功能比haproxy弱豺旬,但是企業(yè)還是比較多用nginx來做代理服務(wù)器,因?yàn)閚ginx的代理服務(wù)器功能基本能滿足轉(zhuǎn)發(fā)柒凉,而且可以當(dāng)網(wǎng)頁服務(wù)器族阅,本身可以響應(yīng)web請求。
.啟用反向代理
ProxyPass "/" "http://www.example.com/"# ProxyPass 指請求從客戶端到反向代理服務(wù)器#"/" 這里代表URL扛拨,這里是主站點(diǎn)的根#"http://www.example.com/" 是后端的服務(wù)器ProxyPassReverse "/" "http://www.example.com/"# ProxyPassReverse是指后端服務(wù)器"http://www.example.com/"將結(jié)果返回到反向代理的服務(wù)器上
以上兩個語句是配套出現(xiàn)
例子
例子一
.特定URL反向代理
在172.18.50.75這臺機(jī)器上配置耘分,如果訪問http://172.18.50.75 會被轉(zhuǎn)發(fā)到http://172.18.50.61/,如果訪問http://172.18.50.75/bbs,就會被轉(zhuǎn)發(fā)到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的主機(jī)上curl http://172.18.50.75/bbs 和curl http://172.18.50.75 看到結(jié)果央渣,如果有重定向,加-L選項(xiàng)渴频,會將請求再發(fā)一次芽丹,發(fā)到重定向后的地址
例子二
實(shí)現(xiàn)基于端口的虛擬主機(jī)
vim /etc/httpd/conf.d/virtualhost.conf
<directory/app>requireall granted
</directory>
listen8080
<virtualhost*:8080>
servernamewww.c.com
documentroot"/app/c.com/"
</virtualhost>
測試,在其他主機(jī)上curl http://172.18.50.75:8080
6 總結(jié)
本文主要是介紹了httpd的一些新特性和常見的幾種配置卜朗,其他內(nèi)容可以參見博客http://ghbsunny.blog.51cto.com/7759574/1970486拔第。