一、Centos7系統下實現httpd-2.2的安裝,並分別實現prefork、worker、event等幾種工作方式
centos6中光盤的本地yum源默認httpd程序包是2.2版本的,而centos7中默認的httpd程序包2.4版本的,centos7要安裝httpd-2.2就要下載好源碼包和對應的依賴包進行編譯安裝,安裝之前先簡單講解一下httpd的這三種處理模型,需要注意的是httpd-2.2的event事件驅動模型還只是測試使用功能並且不支持同時編譯多個模塊,每次只能選定一個模塊。
其對應的配置文爲:/etc/httpd/conf/httpd.conf
prefork:多進程模型,每個進程響應一個請求
一個主進程:負責生產子進程及回收子進程,負責創建套接字,負責接收請求,並將其派發給某子進程進行處理n個子進程:每個子進程處理一個請求
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求,有最大空閒和最小空閒
work:多進程多線程模型,每個線程處理一個用戶請求
一個主進程:負責生成子進程,負責創建套接字,負責接收請求,比將其派發給某子進程進行處理多個子進程:每個子進程負責生成多個線程,每個線程:負責響應用戶請求
併發響應數量:M*N
M:子進程數量
N:每個子進程所能創建的最大線程數量
event:事件驅動模型,多進程模型,每個進程響應多個請求
一個主進程:負責生成子進程,負責創建套接字,負責接收請求,比將其派發給某子進程進行處理
子進程:基於事件驅動機制只想響應多個請求
httpd-2.2:仍爲測試使用模型
httpd-2.4:event可在生產環境中使用
以下爲編譯安裝httpd-2.2的步驟:
1.安裝依賴環境組包
~]#yum install zlib-devel-y
~]#yum install expat-devel -y
~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y
2.提前下載好httpd安裝的依賴包apr/apr-util,並解壓安裝
~]# ls
apr-1.6.5.tar.gz apr-util-1.6.1.tar.gz httpd-2.2.32.tar.gz
~]# tar -zxvf apr-1.6.5.tar.gz
~]# tar -zxvf apr-util-1.6.1.tar.gz
~]# cd apr-1.6.5
apr-1.6.5]#./configure --prefix=/usr/local/apr-httpd/ --with-apr=/usr/local/apr-httpd/
apr-1.6.5]# make && make install
apr-1.6.5]#cd /root/apr-util-1.6.1
apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/
apr-util-1.6.1]# make && make install
3.編譯安裝httpd-2.2
apr-util-1.6.5]# cd ~
~]# tar -zxvf httpd-2.2.32.tar.gz
~]# cd httpd-2.2.32
httpd-2.2.32]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd/ --enable-so --enable-deflate --enable-headers --enable-rewrite --with-mpm=prefork --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/ --with-included-apr
httpd-2.2.32] make && make install
4.啓動httpd,並查看80端口是否監聽
apache]# /usr/local/apache/bin/httpd -k start
apache]# ss -tnl | grep 80
LISTEN 0 128 :::80 :::*
httpd2.2默認是prefork方式下工作的,要在幾個工作方式中切換,則需要修改etc/sysconfig/httpd下對應的配置,並重啓服務即可。
~]# vim /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.event #將該選項切換到對應模式,重啓服務即可
二、簡述request報文請求方法和狀態響應碼
http請求報文:http request
http響應報文:http response
一次http事務:請求<-->響應
http事務:
請求:request
響應:response
報文語法格式:
request報文
<method><request-URL><version>
<HEADERS>
<enter-body>
response報文
<version><status><reason-phrsse>
<HEADERS>
<enter-body>
method:請求方法,標明客戶端希望服務器對資源進行的動作
GET,HEAD,POST,PUT(DAV),DELETE,TRACE,OPTIONS
version:
HTTP/<major><minor>
status:
三位數字:如200,301,302,404,502;標記請求處理過程中發生的情況
reason-phrase:
狀態碼所標記的狀態的簡要描述
headers:
每個請求或響應報文可包含任意個首部,每個首部都有首部名稱,後面各一個冒號,而後跟上一個可選空格,接着是一個值
enter-body:
請求時附加的數據或響應時附加的數據
method(方法):
GET:從服務器獲取一個資源
HEAD:只從服務器獲取文檔的響應首部
POST:向服務器發動要處理的數據
PUT:將請求的主體部分存儲在服務器上
DELETE:請求刪除服務器上指定的文檔
TRACE:追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法
協議查看或分析工具:
tcpdump, tshark, wireshark
status(狀態碼):
1xx:100-101,信息提示
2xx:200-206,成功
3xx:300-305,重定向
4xx:400-415,錯誤類信息,客戶端錯誤
5xx:500-505,錯誤類信息,服務器端錯誤
常用狀態碼:
200:成功,請求的所有數據通過響應報文的enter-body部分發送;OK
301:請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently
302:與301相似,但在響應報文中通過Location指明資源現狀所處臨時新位置;Found
304:客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified
401:需要輸入賬號和密碼認證方式方能訪問資源;Unauthorized
403:請求被禁止;Forbidden
404:服務器無法找到客戶端請求的資源;Not Found
500:服務器內部錯誤;Internal Server Error
502:代理服務器從後端服務器收到了一條僞響應;Bad Gateway
三、詳細描述httpd虛擬主機、站點訪問控制、基於用戶的訪問控制、持久鏈接等應用配置實例
httpd基於虛擬主機:
虛擬主機
站點標識:socket
IP相同,但端口不同
IP不同,但端口均爲默認端口
FQDN不同:
請求報文首部
Host:www.listen.com
有三種實現方案:
基於IP:
爲每個虛擬主機準備至少一個IP地址
基於port:
爲每個虛擬主機使用至少一個獨立的port
基於FQDN:
爲每個虛擬主機使用至少一個FQDN
注意:一般虛擬主機不要與中心主機混用,因此,要使用虛擬主機,得先禁用“main”主機
禁用方法:註釋中心主機的DocumentRoot指令即可
虛擬主機的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可用指令:
ServerAlias:虛擬主機的別名,可多次使用
ErrorLog:錯誤日誌
CustomLog:訪問日誌
<Directory "">
....
</Directory>
Alias
......
基於IP的虛擬主機示例:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.138:80>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
基於端口的虛擬主機:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.137:8080>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
基於FQDN的虛擬主機:
<VirtualHost 192.168.73.137:80>
ServerName www.ilinux.com
DocumentRoot "/var/www/ilinux"
<Directory "/var/www/ilinux/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/ilinux_access.log" combined
</VirtualHost>
<VirtualHost 192.168.73.137:80>
ServerName www.iunix.com
DocumentRoot "/var/www/iunix"
<Directory "/var/www/iunix/">
Options None
Allowoverride None
Require all granted
</Directory>
Customlog "logs/iunix_access.log" combined
</VirtualHost>
注意:如果是httpd-2.2,則使用基於FQDN的虛擬主機時,需要事先使用如下指令:
NameVirtualHost IP:PORT
站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制
文件系統路徑:
<Directory "">
...
</Directory>
<File "">
....
</File>
<FileMatch "">
.....
</FileMatch>
URL路徑:
<Location "">
....
</Location>
<LocationMatch "">
....
</LocationMatch>
<Directory>中“基於源地址”實現訪問控制
httpd-2.2
(1)AllowOverride
與訪問控制相關的那些指令可以放在.htaccess文件(每個目錄下都可以有一個)中
ALL
None
(2)order和allow、deny
order:定義生效次序,寫在後面的表示默認法則
Allow from,Deny from
來源地址:
IP
NetAddr:
192.168
192.168.0.0
192.168.0.0/24
192.168.0.0/255.255.255.0
httpd-2.4
基於IP控制:
Require ip IP地址或網絡地址
Require not ip IP地址或網絡地址
基於主機名控制
Require host 主機名或域名
Require not host 主機名或域名
控制頁面資源允許所以來源的主機可訪問:
httpd-2.2
<Directory "">
...
Order allow,deny
Allow from all
</Directory>
httpd-2.4
<Directory "">
...
Require all granted
</Directory>
控制頁面資源拒絕所有來源的主機可訪問:
httpd-2.2
<Directory "">
...
Order allow,deny
Deny from all
</Directory>
httpd-2.4
<Directory "">
...
Require all denied
</Directory>
Options
後跟1個或多個空白字符分隔的“選項”列表
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件
None
All:All options except for MultiViews.
基於用戶的訪問控制
認證質詢:
WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼
認證:
Authorization:客戶端用戶填入賬號和密碼後再次發動請求報文,認證通過時,則服務器發送響應的資源
認證的方式有兩種:
basic:明文
digest:消息摘要認證
安全域:需要用戶認證後方能訪問的路徑,應該通過名稱對其進行標識,以便於告知用戶認證的原因
用戶的賬號和密碼存放於何處?
虛擬賬號:僅能用於訪問某服務時用到的認證標識
存儲:
文本文件
SQL數據庫
ldap目錄存儲
basic認證配置示例:
(1)定義安全域
<Directory "">
Options None
AllowOverride None
AuthType basic
AuthName "提示的說明"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
允許賬號文件中的所有用戶登錄訪問:
Require valid-user
(2)提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建及用戶管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用
-m:MD5格式加密
-s:sha格式加密
-D:刪除指定用戶
-b:批模式添加用戶
htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password
另外:基於組賬號進行認證
(1)定義安全域
<Directory "">
Options None
AllowOverride None
AuthType basic
AuthName "提示的說明"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_USER_GROUPE_FILE"
Require group grpname1 grpname2 ...
</Directory>
(2)創建用戶賬號和組賬號文件
組文件:每一行定義一個組
GRP_NAME:username1 username2 ...
持久連接
Persistent Connection:tcp連接建立後,每個資源獲取完成後不全斷開連街,而是繼續等待其他資源請求的進行
如何斷開?
數量限制
時間限制
副作用:對併發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常響應
折中:使用較短的持久連接時長,以及較少的請求數量
KeepAlive ON|OFF
KeepAliveTimeout 15
MaxKeepAliveRequests 100
測試:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host:WEB_SERVER_IP
注意:httpd-2.4的KeepAliveTimeout可以是毫秒級的