HTTP協議介紹


一.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>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章