天天看點

httpd系列之一:httpd協定及其功能介紹

一、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,如需轉載請自行聯系原作者

繼續閱讀