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服務器。
image.png
實現過程如下:
需要三臺主機,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