一、http協定
1、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請求:request
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)持久連接配接(保持連接配接):三次握手連接配接後不斷開,直到最後一個請求結束後,再一次一次性斷開。
但這樣,持久連接配接也會有缺陷了,如果一個使用者接進來以後,連接配接時間過長,這勢必會造成資源被占用,是以也要有解決方法:
①:設定逾時時長
②:限制最大資源請求
4)HTTP狀态碼:
1xx: 資訊性狀态碼
2xx:成功狀态碼
200: OK
201: Created,接受并儲存
3xx:重定向狀态碼
301:Moved Permanently, 永久重定向。在響應封包中使用首部“Location: URL”指定資源現在所處的位置;
302:Found,臨時重定向,本資源有,但暫時不在本地。在響應封包中使用首部“Location: URL”指定臨時資源位置;
304:Not Modified,沒修改這個資源,就可以使用緩存了。條件式請求中使用;
4xx:用戶端類的錯誤 ,例如伺服器端資源不存在
403:Forbidden,請求被伺服器拒絕,原因可能是沒有權限
404:Not Found,伺服器無法找到請求的URL
405:Method Not Allowed,不允許使用此方法請求相應的URL
5xx:伺服器類的錯誤
500:Internal Server Error,伺服器内部錯誤;如伺服器端腳本無權限執行
502:Bad Gateway,代理伺服器從上遊收到了一條僞響應;
503:Service Unavailable,伺服器此時無法提供服務,但将來可能可用;
5)HTTP首部:
(1)通用首部:請求和響應都可以使用的;
Connection:定義C/S之間關于請求/響應的有關選項
對于http/1.0, Connection: keep-alive
Via: 顯示了封包經過的中間節點,意思就是找誰代理的
Cache-Control:緩存控制、緩存訓示,能不能緩存,能緩存多久,在http/1.1中比較長見
Pragma
(2)請求首部:
Client-IP:
下四層的請求都是由核心處理的(核心空間),上面的就是使用者空間了
Host: 請求的主機名和端口号,虛拟主機環境下用于不同的虛拟主機
Referer:指明了請求目前資源的原始資源的URL
User-Agent: 使用者代理,使用什麼工具發出的請求。爬蟲也是一種使用者代理
①、Accept首部:使用者标明客戶自己更傾向于支援的能力
Accept: 指明伺服器能發送的媒體類型(有主類型和子類型)
Accept-Charset: 支援使用的字元集
Accept-Encoding: 支援使用的編碼方式
Accept-Language: 支援使用語言
②、條件請求首部:
Expect:
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:啟動的子程序的個數
MinSpareThreads:最小空閑線程數;
MaxSpareThreads:最大空閑線程數;
ThreadsPerChild:每個子程序可生成的線程數;
MaxRequestsPerChild:每個子程序在生命周期内所能夠服務的最多請求個數,0表示不限定;
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)基于主機的通路控制
Options
AllowOverride None
Order Deny,Allow
Allow
Deny
二者都比對或二者都無比對項時,則以後者為準;否則,則以比對到的為準;
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) 如果要基于組進行認證
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GroupName
組檔案:
組名: 使用者1 使用者2 使用者3
12)虛拟主機
一個實體伺服器提供多個站點; 使用虛拟主機得先取消中心主機
Web: Socket(IP, port)
基于不同的IP實作不同的虛拟主機
變化IP
基于不同的port實作不同的虛拟主機
變化port
基于不同的FQDN實作不同的虛拟主機
變化ServerName的值
NameVirtualHost *:80
<virtualhost IP:port>
ServerName
DocumentRoot ""
<Directory "">
Options
ServerAlias
ServerAdmin
</virtualhost>
虛拟主機的單獨配置:
使用者認證
通路日志
錯誤日志
别名
腳本别名
13)伺服器status頁面
内生的status資訊,且此資訊可以通過web預以顯示
配置檔案系統路徑通路屬性
<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
本文轉自 nmshuishui 51CTO部落格,原文連結:http://blog.51cto.com/nmshuishui/1381559,如需轉載請自行聯系原作者