HTTP:hyper text transfer protocol,80/tcp 超文本傳輸協議
http協議版本:
HTTP/0.9:原型版本,功能簡陋。僅能實現簡單的資源交互,不支持多媒體內容。
HTTP/1.0:第一個廣泛使用的版本,支持MIME,從而支持多媒體,但緩存機制設計仍然簡陋和薄弱
HTTP/1.1:增強了緩存功能
HTTP/2.0:
http是基於tcp完成的協議
一次完整的http請求處理過程:
(1)建立或處理連接,接收請求或拒絕請求
(2)接收請求,接收來自於網絡的請求報文中對某一資源的一次請求的過程
(3)處理請求,對請求報文進行解析,並獲取請求的資源及請求方法等相關信息
(4)訪問資源,獲取請求報文中請求的資源
(5)構建響應報文,一旦web服務器找到資源,而且這個資源也允許被某個客戶端訪問,這個
時候它就要能夠拿到這個資源,把它封裝成一個響應報文,並指明這個資源內部的內容格式發
送給客戶端。
(6)發送響應報文
(7)記錄日誌
httpd的特性:
高度模塊化:core+modules 任何一個組件出現問題或者需要升級,它隻影響一個模塊,而不
會影響整體的代碼,任何一個模塊崩潰,有可能只需要替換一個模塊即可
DSO:Dynamic Shared Object 動態共享對象
MPM:Mutipath Processing Modules:實現多種不同的I/O模型。
Prefork:多進程模型,主進程,生成多個子進程,每個子進程響應一個請求;
worker:多線程模式,主進程,生成多個子進程,每個子進程生成多個線程,每個線程響
應一個請求;
event:事件驅動模型,主進程,生成多個子進程,每個子進程響應多個請求;
I/O類型
同步和異步:synchronous,asynchronous;關注的是消息通知機制
同步:調用發出後不會立即返回,但是一旦返回,則返回的是最終結果。
異步:調用發出後,被調方立即返回消息,但返回並非最終結果,被調用者通過狀態,通知
機制等來通知調用者,或通過回調函數來處理結果。
阻塞和非阻塞:block,noblock ;關注的是調用者等待被調用者返回結果時的狀態
阻塞:調用結果返回前,調用者被掛起;調用者只有在得到返回結果之後才能繼續;
非阻塞:調用者在結果返回之前,不會被掛起,即調用不會阻塞調用者;
I/O模型:
blocking IO:阻塞式IO
noblocking IO:非阻塞IO
IO multiplexing:複用型IO
signal driven IO:事件驅動式IO
通知:
水平觸發:多次通知
邊緣觸發:只通知一次
asynchronous IO:異步IO
一個進程發起IO調用時,這個IO將由兩個階段組成(一次IO,指的是磁盤IO),第一步:數據
從磁盤到內核內存,第二步:數據從內核內存到進程內存。真正被稱爲IO是數據從內核內存到進
程內存的過程。
實際上,除非特別指定,幾乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。這給網絡編程帶來了一個很大的問題,如在調用send()的同時,線程將被阻塞,在此期間,線程將無法執行任何運算或響應任何的網絡請求。
程序環境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服務腳本:
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日誌文件目錄:
/var/log/httpd
access_log:訪問日誌
error_log:錯誤日誌
站點文檔目錄:
/var/www/html
配置文件組成部分:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
常用配置:
1 修改監聽的IP和PORT
Listen [IP:]PORT IP可省略,省略表示監聽本地所有ip地址;listen可以應用多次
2 持久連接
目前多數的瀏覽器都請求服務器保持持續連接,這種功能就稱爲“KeepAlive“,它是HTTP1.1標
準規格,一般是用來強化服務器的性能。在使用保持連接功能時,設置客戶一次請求連接能影響
文件的最大上限,建議把默認值設爲ON,以便提高訪問性能。但當使用負載均衡時,會影響負載
均衡的效果,在未斷開連接之前,同一客戶端時中被定向至同一臺服務器。
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待
其他的請求完成;
KeepAlived On|Off 是否開啓持久連接
MaxKeepAliveRequests # 數量限制
KeepAliveTimout # 時間限制
測試:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3 MPM 多路處理模塊 prefork,worker,event
http-2.2不支持同時編譯多個模塊,所以一次編譯只能選定一個,rpm安裝的包提供
三個二進制執行程序,分別用於實現對不同MPM機制的支持。
<IfModule prefork.c> #判定模塊是否存在
StartServers 8
#默認啓動的工作進程數;不包括主進程,主進程只是負責子進程的創建回收等
MinSpareServers 5 #最少空閒進程數
MaxSpareServers 20 #最大空閒進程數
ServerLimit 256 #最大活動進程數
MaxClients 256
#併發請求的最大數;請求連接進來不一定會活動,要小與等與ServerLimit
MaxRequestsPerChild 4000 #每個進程在生命週期內所能服務的最多的請求個數;
</IfModule>
<IfModule worker.c>
StartServers 4 #啓動的子進程的個數
MaxClients 300 #併發請求的最大數
MinSpareThreads 25 #最小空閒線程數
MaxSpareThreads 75 #最大空閒線程數
ThreadsPerChild 25 #每個子進程可生成的線程數
MaxRequestsPerChild 0
#每個子進程在生命週期內所能服務的最多的請求個數,0標示不限定
</IfModule>
默認爲/usr/sbin/httpd,其使用prefork。
更換使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=
重啓服務生效;
4 DSO模塊加載方式
配置指令實現模塊加載
LoadModule <mod_name> <mode_path>
模塊路徑可使用相對地址,相對於ServerRoot(/etc/httpd)指向的路徑而言:
/etc/httpd/modules/
httpd -M:列出已經裝載的所有DSO以及非DSO模塊
httpd -l:列出支持使用的非DSO模塊
5 定義站點根目錄
DocumentRoot /path/to/somewhere
文檔路徑映射:
DocumentRoot指向的路徑爲URL路徑的起始位置;
DocumentRoot “/var/www/html“
test/index.html --> http://HOST:PORT/test/index.html
apache服務器存放頁面的路徑,默認所有要求提供HTTP服務的連接,都要以這個目錄爲主目錄,默認爲/var/www/html
6 站點訪問控制
可基於兩種類型的路徑指明對哪些資源進行訪問控制
文件系統路徑
<Directory ""> </Directory>
<FileMatch ""> <FileMatch>
URL路徑:
<Location ""> </Location>
...
訪問控制機制:
基於來源地址;
基於帳號;
7 Directory中“基於來源地址“實現訪問控制
(1)Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:缺少指定的默認頁面時,允許將目錄中所有文件以列表形式返回給用戶,危險!
Includes:允許是用mod_include模塊實現服務器端包含(SSI);
FollowSymlinks:允許跟蹤符號連接文件;
SymlinksIfOwnerMatch:在鏈接文件屬主屬組與源文件的屬主屬組相同時,允許跟隨符號連接所指向的原始文件;
ExecCGI:允許是用mod_cgi模塊執行CGI腳本;
MultiViews:允許是用mod_negotiation實現內容協商;
None:所有都不啓用;
All:允許所有;
(2)基於來源地址的訪問控制機制
Order:檢查次序
Order allow,deny
Order deny,allow
Allow from
Deny from
來源地址:IP 或 NetAddr 172.16 | 172.16.0.0 | 172.16.0.0/16
<Directory>可以配置網站目錄下的訪問屬性,使用<Directory ~ "path">可以基於正則表達式的匹配,但是一般不建議使用,會消耗時間。類似的指令還有:
<Location [~] "">:配置URL訪問屬性,與<Directory>相似(可以配置ststus頁面或者定義了別名的路徑等);
<File [~] "">:限制單個文件的訪問屬性;
<locationmatch "">:相當於Location ~,但一般建議使用此配置進行正則匹配;
如果某要配置其屬性的URL能映射到某具體文件系統路徑,建議使用。
8 定義默認主頁面
DirectryIndex index.html index.html.var
自左而右,依次匹配
9 日誌設定
默認日誌目錄:/var/log/httpd
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
訪問日誌:
CustomLog logs/access_log_combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客戶端IP地址;
%l:Remote logname (from identd, if supplied) -表示爲空;
%u:Remote user,(from auth;may be bogus if return status (%s) is 401);
%t:服務器收到請求的時間;
%r:請求報文的道行信息;
%>s:響應狀態碼;
%b:響應報文的大小,單位是字節,不包括響應報文首部;
"%{Referer}i:請求報文中“referer“首部的值;當前資源的訪問入口;
"%{User-Agent}i:請求報文中“User-Agent“首部的值,即發出請求用到的應用程序;
詳情請參考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10 路徑別名
DocumentRoot "www/htdocs"
http://server1/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /alias/ "/PATH/TO/SOMEDIR/"
意味着訪問http://Server_IP/alias時,其頁面文件來自於/PATH/TO/SOMEDIR/這個位置
注意:前後路徑要一致,結尾都有“/“或者都沒有
Alias /bbs/ "/forum/htdocs"
http://server1/bbs/index.html
--> /forum/htdocs/index.html
11 設定默認字符集
AddDefaultCharset UTF-8
GBK,GB2313,GB18030
12 基於用戶的訪問控制
當你的網站或者站點的某個路徑只想讓你授權的用戶訪問時,就可以使用基於用戶的訪問控制
認證質詢:
WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼;
認證:
Authorization:客戶端用戶天如帳號和密碼後,再次發送請求報文,認證成功,則服務器發送響應資源
認證類型: basic:明文 digest:消息摘要,hash編程後發送,大多瀏覽器不支持
安全域:需要用戶認證後方能訪問的路徑;
應該通過名稱對其進行標示,並用於告知用戶認證的原因;
用戶的帳號和密碼存儲於何處?
虛擬帳號:僅用於訪問某服務器時用到的認證標識;
存儲: 文本文件;SQL數據庫;ldap,nis
basic認證:
(1)定義安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
Require user username1 username2 ...
</Directoty>
允許帳號文件中的所有用戶登陸訪問: Requie valid-user
(2)提供帳號和密碼存儲(文本文件)
使用htpasswd命令進行管理
htpasswd [options] passwordfile username
-c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;
-m:md5加密用戶密碼;
-s:sha1加密用戶密碼;
-D:刪除指定用戶;
(3)實現基於組進行認證
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directoty>
要提供:用戶帳號文件和組文件;
組文件:每行定義一個組
基於用戶的訪問控制
1 使用htpasswd命令生成用戶認證庫;
2 編寫配置文件 /etc/httpd/conf/httpd.conf
3 創建安全域,即訪問目錄。最後重新加載服務即可
基於組進行認證
1 使用htpasswd命令生成認證庫,同上。創建組文件。
2 修改配置文件 /etc/httpd/conf/httpd.conf
3 創建安全域,即訪問目錄。最後重新加載服務即可
13 虛擬主機
即爲一個物理服務器提供多個站點。有三種實現方案:
基於ip:爲每個虛擬主機準備至少一個ip地址;
基於port:爲每個虛擬主機準備至少一個專用port;實踐中很少使用;
基於hostname:爲每個虛擬主機準備至少一個專用hostname;
注意:一般虛擬主機不要與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;
禁用中心主機:註釋DocumentRoot
NameVirtualHost *:80 #使用基於域名的虛擬主機時需要啓動此項,在httpd-2.4中不需要使用
每個虛擬主機都有專用配置:
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>
基於ip
1 分別創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
實驗效果:分別輸入不同的ip,訪問到不同的頁面。
基於port
1 創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
實驗效果:分別輸入ip的不同端口,訪問到不同的頁面。前提是在listen處打開這個端口。
基於域名
1 創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
3 注意打開修改NameVirtualHost選項!
實驗效果:分別輸入不同域名,訪問到不同的頁面。訪問的主機做好域名解析!
14 內置的status頁面
<Location /server-status>
SetHandler server-status
Order dent,allow
Dent from all
Allow from 172.25
</Location>
實現:基於帳號實現訪問控制