一.http協議
http協議的版本:
http/0.9:誕生於1991,僅用戶傳輸html文檔,不能包含圖片
http/1.0:引入MIME,支持多媒體數據的處理,keep-alive(保存連接),有緩存功能
http/1.1:支持更多的請求方法,更精細的緩存控制,持久連接
http/1.0 和 http/1.1之所以能夠傳輸多媒體數據,是因爲引入了MIME
MIME:Multipurpose Internet Mail Extension
MIME 引入了base64的編碼機制,能夠實現對二進制數據編碼成文本發送,並能夠
讓接收方還原回來的格式;
2.http報文
HTTP事務:一次請求以及與其對應的響應
HTTP資源請求的方法:GET PUT HEAD (只發報文首部響應就可以,) POST DELETE
1) HTTP 請求
HTTP請求報文
<method > <request-URL> <version>起始行,請求行
<>headers> (名稱+值)
<entity-body> 實體
2) HTTP響應:response
HTTP響應報文
報文格式:
<version> <status> <reason-phrase> 起始行,響應行
<headers>
<entity-body>
<method>:請求方法,希望服務器端執行的動作,如GET,HEAD,POST
等
<request-url>:請求的資源,可以是相對路徑,也是完整的URL
<version>:協議版本,格式HTTP/<major>.<minor>,如http/1.0
<headers>:HTTP首部
<status>:狀態碼
<reason-phrase>:原因短語,數字狀態碼易度信息
<entity-body>:主體部分
HTTP請求方法:
GET:請求獲取一個資源,需要服務器發送
HEAD:跟GET相似,但不需要服務發送資源而僅傳回響應首部;
POST:支持HTML表單提交,表達中有用戶填入的數據,這些數據會發送
到服務器端,由服務器存儲至某位置(例如發送處理程序)
PUT:與GET相反,向服務寫入文檔,例如發佈系統
DELETE:請求刪除URL指向的資源
OPTIONS:探測服務器端對某資源所支持的請求方法
TRACE:跟蹤請求要經過的防火牆 代理或網關等
擴展方法:LOCK MKCOL COPY MOVE
3)HTTP協議:是一種stateless(無狀態)協議
一次HTTP事務結束後,連接即行斷開,所以效率會低很多,因此爲了
提高效率,要爲HTTP提供加速方式
(1)並行請求:多線程,但第一次是單線程的,只請求一個資源
(2)持久連接:三次爲首連接後不斷,知道最後一個請求結束後,再一次一次斷開,
持久連接也會有缺陷,如果一個用戶接進來以後,連接時間過長,這勢必
會造成資源被佔用:
1:設定超時時長
2.限制最大資源請求
HTTP狀態碼:
1**:信息狀態碼
2**:成功狀態碼
200: OK
201: Created
3**:重定向狀態碼
301:Moved Permanently,在響應報文中試用首部"Location:URL"指向資源所處的位置
302:Found,在響應報文中試用首部"Location: URL"指定臨時資源位置;
304:Not Modified,條件式請求中試用;
4**:客戶端類的錯誤
2**:成功狀態碼
200: OK
201: Created
201: Created
3**:重定向狀態碼
301:Moved Permanently,在響應報文中試用首部"Location:URL"指向資源所處的位置
302:Found,在響應報文中試用首部"Location: URL"指定臨時資源位置;
304:Not Modified,條件式請求中試用;
4**:客戶端類的錯誤
403:Forbidden,請求被服務器拒絕
404:Not Found,服務器無法找到請求的URL
405:Method Not Allowrd,不允許請求試用此方法請求相應的URL
5**:服務器類的錯誤
500:Internet Server Error,服務器內部錯誤;
502:Bad Gateway,代理服務器從上游收到一條僞響應;
503:Service Unavailable,服務器此時無法提供服務,但將來可能可用;
5)HTTP首部:請求和響應
Connection:定義C/S之間關於請求/響應的有關選項
對於http/1.0,Connection:keep-alive
Via:顯示了報文經過的中間節點,意思是找誰代理的
Cache-Control:緩存控制 緩存指示 能不能緩存 能緩存多久,在http/1.1中
較常見
Pragma
(2)請求首部:
下四層的請求都是由內核處理的(內核空間),上面的就是用戶空間了
Host:請求的主機號和端口號,虛擬主機環境下用於不同的虛擬主機
Referer:指明瞭請求當前資源的原始資源的URL
User-Agent:用戶代理,使用什麼工具發出的請求.爬蟲也是一種用戶代理
1.Accept首部:用戶標明客戶更傾向於支持的能力
ACCEPT:指明服務器端能發送的媒體類型
Accept-Charset:支持使用的字符集
Accept-Language:支持使用語言
2.條件請求首部:
Expect:
If-Modified-Since:是否在制定時間以來修改過此資源,如果修改,就髮狀態碼,
再發送資源
If-None-Match
跟安全相關的請求首部
Authorization:客戶端提交給服務端的認證數據,如帳號和密碼
Cookie:客戶端發送給服務端身份標識.session是服務端的,session是靠cookie去實現的
Server:向客戶端標明服務器程序名稱和版本
1.協商首部:
2)HTTP響應:response <request-url>: 請求的資源,可以是相對路徑,也是完整的URL
PUT:與GET相反,向服務寫入文檔;例如發佈系統
DELETE:請求刪除URL指向的資源
OPTIONS:探測服務器端對某資源所支持的請求方法
5xx:服務器類的錯誤
(1)通用首部:請求和響應都可以使用的;
Pragma
(2)請求首部:
Authorization: 客戶端提交給服務端的認證數據,如帳號和密碼
Cookie2
(3)響應首部:
①、協商首部:
Content-Location
If-Modified-Since: 是否在指定時間以來修改過此資源,如果改過,就髮狀態碼,再發送資源
If-None-Match
跟安全相關的請求首部:
Authorization: 客戶端提交給服務端的認證數據,如帳號和密碼
Cookie: 客戶端發送給服務器端身份標識。session是服務器端的,session是靠cookie去實現的
Cookie2
(3)響應首部:
Age:
Server: 向客戶端標明服務器程序名稱和版本
①、協商首部:
Accept-Ranges: 對當前資源來講,服務器所能夠接受的範圍類型
Vary: 首部列表,服務器會根據列表中的內容挑選出最適合的版本發送給客戶端。比如,比較繁忙的服務器會把資源經過壓縮以後再發送給客戶端,但客戶端上有些低版本的瀏覽器不支持壓縮格式,所以在服務器端會提供多種版本
②、跟安全相關的響應首部:
Set-Cookie: 服務器端在某客戶端第一次請求時發給令牌
Set-Cookie2:
WWW-Authentication: 質詢,即要求客戶提供帳號和密碼
(4)實體首部:用於指定實體屬性
Location: 資源的新位置
Allow: 允許對此資源使用的請求方法
①、內容首部:
Content-Encoding
Content-Language
Content-Length
Content-Location
Content-Range
Content-Type
②、緩存首部:
ETag: 實體標籤
Expires: 過期期限
Last-Modified: 上一次的修改時間
二、httpd功能特性介紹
httpd俗稱apache,是目前市場份額最高的網絡服務,它是高度模塊化的,它的模塊不但可以在編譯時選擇,而且在選擇完成以後,這個模塊到底啓不啓用也可以定義。
core + modules
DSO模塊: Dynamic Shared Object
MPM: Multipath Processing Module,多道處理模塊,非一個模塊,而是對一種特性的稱謂
prefork:
一個進程一個請求,預先forck好多個,prefork是基於事件分離器來工作的,而select的文件數最大不能超過1024個,也就是說prefork最多能處理1024個進程
worker:
一個進程多個線程,一個線程一個請求
event:
一個線程響應多個請求。event是基於事件驅動(event-driven)的,主要目的在於實現單線程響應多個請求;
1)監聽套接字
Listen [IP:]port
此指令可以出現多次, 用於指定監聽多個不同的套接字:
Listen 80
Listen 172.16.251.93:8080
2)配置使用keep alive
KeepAlive {On|Off}
KeepAliveTimeout 2
MaxKeepAliveRequests 50
3)MPM
<IfModule prefork.c>
StartServers: 默認啓動的工作進程數;
MinSpareServers: 最少空閒進程數;
MaxSpareServers: 最大空閒進程數;
ServerLimit: 最大活動進程數;
MaxClients: 併發請求的最大數;
MaxRequestsPerChild: 每個子進程在生命週期內所能夠服務的最多請求個數;
</IfModule>
<IfModule worker.c>
StartServers:啓動的子進程的個數
MaxClients: 併發請求的最大數;
MinSpareThreads:最小空閒線程數;
MaxSpareThreads:最大空閒線程數;
ThreadsPerChild:每個子進程可生成的線程數;
MaxRequestsPerChild:每個子進程在生命週期內所能夠服務的最多請求個數,0表示不限定;
</IfModule>
4)DSO模塊加載方式
LoadModule module_name /path/to/module
如果使用相對路徑,則對於ServerRoot所定義的位置而言;例如:
LoadModule php5_module /usr/lib64/httpd/modules/php5.so
讓服務重載配置文件方能生效;
httpd -M: 列出已經裝載的所有DSO及非DSO模塊
httpd -l: 列出支持使用的非DSO模塊
5)配置站點根目錄
DocumentRoot /path/to/somewhere
6)配置頁面訪問屬性
<Direcotry "/path/to/somewhere">
Options:
Indexes: 缺少指定的默認頁面時,允許將目錄中的所有文件以列表形式返回給用戶;危險;
FollowSymLinks: 允許跟隨符號鏈接所指向的原始文件;
None: 所有都啓用;
All: 所有都啓用;
ExecCGI: 允許使用mod_cgi模塊執行CGI腳本;
Includes: 允許使用mod_include模塊實現服務器端包含(SSI);
MultiViews:允許使用mod_negotiation實現內容協商;
SymLinksIfOwnerMatch:在鏈接文件屬主屬組與原始文件的屬主屬組相同時,允許跟隨符號鏈接所指向的原始文件;
<Directory>
7)基於主機的訪問控制
<Direcotry "/path/to/somewhere">
Options
AllowOverride None
Order Deny,Allow
Allow
Deny
<Directory>
二者都匹配或二者都無匹配項時,則以後者爲準;否則,則以匹配到的爲準;
Allow from
Deny from
IP, Network Address
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8)配置日誌功能
/var/log/httpd/
access.log: 訪問日誌,其需要記錄的內容需要自定義
error.log: 錯誤日誌
訪問日誌:
CustomLog "/path/to/access_log_file" Format_Name
LogFormat Format_String Format_Name
%h: 客戶端地址
%l: 遠程登錄名,通常爲-
%u: 認證時的遠程用戶名,沒有認證時爲-
%t: 收到請求時的時間;
%r: 請求報文的起始行;
%>s: 響應狀態碼;
%b: 響應報文的長度,單位爲字節
%{Header_Name}i: 記錄指定請求報文首部的內容(value);
詳情請參考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
錯誤日誌:
ErrorLog
9)路徑別名
Alias /alias/ "/path/to/somewhere"
意味着訪問http://Server_IP/alias/時,其頁面文件來自於/path/to/somewhere這個位置;
10)設定默認字符集
AddDefaultCharset
11)基於用戶的訪問控制
虛擬用戶:
文件:/etc/httpd/conf/.htpasswd
SQL數據庫:
dbm:
ldap
認證類型(auth):
basic: 基本認證,帳號和密碼明文發送;
digest:摘要認證,hash編程之後發送;
認證提供者(authentication provider):帳號和密碼的存放位置
authn
授權機制(authorization):根據什麼進行授權
(1) 編輯配置文件,爲需要認證的目錄配置認證機制
<Directory "/www/htdocs/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area"
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
(2) 使用htpasswd命令生成認證庫
htpasswd
-c: 創建文件,創建第一個用戶時使用
-m: 密碼基於MD5編碼存儲
(3) 如果要基於組進行認證
<Directory "/www/htdocs/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area"
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GroupName
</Directory>
組文件:
組名: 用戶1 用戶2 用戶3
12)虛擬主機
一個物理服務器提供多個站點; 使用虛擬主機得先取消中心主機
Web: Socket(IP, port)
基於不同的IP實現不同的虛擬主機
變化IP
基於不同的port實現不同的虛擬主機
變化port
基於不同的FQDN實現不同的虛擬主機
變化ServerName的值
NameVirtualHost *:80
<virtualhost IP:port>
ServerName
DocumentRoot ""
<Directory "">
Options
</Directory>
ServerAlias
ServerAdmin
</virtualhost>
虛擬主機的單獨配置:
用戶認證
訪問日誌
錯誤日誌
別名
腳本別名
13)服務器status頁面
內生的status信息,且此信息可以通過web預以顯示
配置文件系統路徑訪問屬性
<Directory [~] "">
</Directory>
<File [~] "">
</File>
配置URL訪問屬性
<Location [~] "">
</Location>
<LocationMatch "">
</LocationMatch>
如果某要配置其屬性的URL能映射到某具體文件系統路徑,建議使用<Directory>;
處理器:是當文件被調用時,Apache內部表示形式;一般每種文件類型都有其隱式處理器;
顯式的定義使用的處理器 SetHandler
<Location /URL>
SetHandler server-status
</Location>
定義訪問控制機制
基於IP控制
基於用戶控制
示例:
<Location /server-status>
SetHandler server-status
AuthType Basic
AuthName "Server Status"
AuthUserFile "/etc/httpd/conf/.htpasswd"
Require valid-user
Order deny,allow
Allow from all
</Location>