天天看點

Web服務(一)http基礎詳解

一、HTTP基本定義

超文本傳輸協定(英文:HyperText Transfer Protocol,縮寫:HTTP)設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。通過HTTP或者HTTPS協定請求的資源由統一資源辨別符(Uniform Resource Identifiers,URI)來辨別。目前有三個版本:http/0.9;http/1.0;/http/1.1。目前http/1.0和1.1被廣泛應用。

http/0.9:僅用于傳輸HTML文檔;

http/1.0:支援多媒體資料的處理;支援keep-live(持久連接配接);有緩存功能;

http/1.1:支援更多的請求方法和更精細的緩存控制;持久連接配接;

二、HTTP請求的過程

http事務的過程為:一次請求和與其對應的響應。

http請求:request

1

2

3

4

5

<code>格式</code>

<code>&lt;</code><code>method</code><code>&gt; &lt;</code><code>request-URL</code><code>&gt; &lt;</code><code>version</code><code>&gt;</code>

<code>&lt;</code><code>headers</code><code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </code> 

<code>&lt;</code><code>entity-body</code><code>&gt;</code>

http響應:response

<code>&lt;</code><code>version</code><code>&gt; &lt;</code><code>status</code><code>&gt; &lt;</code><code>reason-phrase</code><code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 </code> 

method

請求方法;希望伺服器端執行的動作;如GET、POST、HEAD等

request-URL

請求的資源;可以是相對路徑(相對主機位置);也可以是完整的URL

version

協定版本;格式:http/&lt;major&gt;.&lt;minor&gt;

headers

http首部資訊

status

狀态碼

reason-phrase

原因短語;數字狀态易讀資訊

entity-body

主體部分

一次完整的請求過程:

<a href="http://s3.51cto.com/wyfs02/M02/22/D3/wKiom1MpBFzQGFLtAAEKfjWGkUY756.jpg" target="_blank"></a>

由于http是一種無狀态(stateless)協定;是以無法記錄每一次請求者的身份;并且每一次請求結束後立即斷開。是以每一次請求都要先經過DNS解析、三次握手和四次斷開;是以相當耗費CPU的時鐘周期,浪費資源。通用提供效率有兩種方法:

1、并行請求:同時發起多個請求和傳回多個響應(第一次請求隻能是一個資源);

2、持久連接配接:三次握手請求後不斷開;用戶端可以繼續請求;缺陷是持久連接配接會導緻占用資源;

   斷開方式:兩種方式無論哪個先達到上限都執行斷開

       逾時:在連接配接後規定一個持久連接配接的時間限定

       請求資源最大數:允許連接配接後最多請求多少個資源

三、HTTP請求方法和響應狀态碼等資訊

http請求的方法有:GET、HEAD、POST、DELETE、PUT、OPTIONS、TRACE...;前五種方法較為常用。

GET

請求擷取一個資源;而需要伺服器發送

HEAD

請求一個資源,但是不需要伺服器發送資源而僅傳回響應的首部資訊

POST

送出表單;支援HTML表單送出;表單中有使用者填入的資料;這些資料會發送到伺服器端;由伺服器存儲至某位置

PUT

向伺服器寫入文檔;例如釋出系統

DELETE

請求删除URL指向的資源

OPTIONS

探測伺服器端對某資源所支援的請求方法

TRACE

跟蹤請求資源傳輸所經過防火牆、代理或網關等

CONNECT

HTTP/1.1協定中預留給能夠将連接配接改為管道方式的代理伺服器

擴充方法

LOCK、MKCOL、COPY、MOVE...

http響應中的status狀态碼分為五種:

1xx:資訊性狀态碼

2xx:成功狀态碼

   200:OK

   201:created

3xx:重定向狀态碼

   301:Moved Permanentl;在響應封包中使用首部"Location:URL";指定資源現在所在的位置

   302:Fonud(臨時重定向);在響應封包中使用首部"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;伺服器此時無法提供服務;但是将來可能可用

web服務的輸入/輸出結構:

1、單線程I/O結構:單個線程響應單個請求

2、多線程I/O結構:多個線程響應各對應的請求

3、複用的I/O結構:單個線程響應多個請求

4、複用的多線程I/O結構:多個線程;單個線程響應多個請求

四、web服務httpd軟體介紹

linux下http的軟體有很多;例如apache:httpd和nginx,這裡以httpd為介紹

httpd屬性:高度子產品化;可以動态裝解除安裝子產品。主要是core和modules組合模式的。還支援MPM(Multipath Processing Module):多道處理子產品。它不是一個子產品;而是對一種特性的稱謂。

MPM對應web服務并行結構的子產品:

prefock:預fock;一個程序一個請求。

   在請求時web服務本身不響應該請求;而是自身fock一個子程序來響應程序;而fock是需要時間來生成子程序的;是以在請求來時,預先fock一些程序來等待請求予以響應;并保持一定的空閑子程序等待其他請求。

worker:一個程序多個線程;一個線程一個請求。

   由多個程序生成多個線程;每個線程對應一個請求;如果多個請求在一個程序下請求同一個資源;可以進行資源共享。但是是由于單個線程進行響應請求;需要被排程切換;切換過程還是比較浪費資源。在性能上與prefock是差不多的。

event:一個程序響應對個請求

   基于event-driven(事件驅動);單線程響應多個請求。對應web并行結構中的複用的多線程I/O結構。

httpd版本:

httpd-1.3; httpd-2.0; httpd-2.2; httpd-2.4;四個版本。目前官網上2.0-2.4都處于維護狀态。

httpd的部分重要功能特性:

路徑别名:alias

使用者認證:authentication

虛拟主機:virtual host

反向代理:

   負載均衡:

使用者站點:

CGI:Common Gateway Interface

五、安裝httpd

可以先檢視下系統内是否安裝

<code>[Linux]</code><code>#rpm -qa httpd</code>

<code>httpd</code><code>-</code><code>2.2</code><code>.</code><code>15</code><code>-</code><code>29.el6</code><code>.centos.x86_64</code>

<code>#顯示已安裝2.2.15版本</code>

如系統内沒有安裝可以配置好yum源後安裝

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code>[Linux]</code><code>#yum -y install httpd</code>

<code>                                                                                                                                                                      </code> 

<code>#安裝完成後可以檢視下安裝詳情和具體的目錄</code>

<code>[Linux]</code><code>#rpm -ql httpd</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code><code>/</code><code>README</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code><code>/</code><code>welcome.conf</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code><code>/</code><code>httpd.conf</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code><code>/</code><code>magic</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>logs</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>modules</code>

<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>run</code>

<code>/</code><code>etc</code><code>/</code><code>logrotate.d</code><code>/</code><code>httpd</code>

<code>/</code><code>etc</code><code>/</code><code>rc.d</code><code>/</code><code>init.d</code><code>/</code><code>htcacheclean</code>

<code>/</code><code>etc</code><code>/</code><code>rc.d</code><code>/</code><code>init.d</code><code>/</code><code>httpd</code>

<code>/</code><code>etc</code><code>/</code><code>sysconfig</code><code>/</code><code>htcacheclean</code>

<code>/</code><code>etc</code><code>/</code><code>sysconfig</code><code>/</code><code>httpd</code>

<code>/</code><code>usr</code><code>/</code><code>lib64</code><code>/</code><code>httpd</code>

<code>                                                                                                                                                                </code> 

<code>                                                                                                                                                            </code> 

<code>#安裝完成後即可啟動</code>

<code>[Linux]</code><code>#service httpd start</code>

<code>Starting httpd:                                            [  OK  ]</code>

<code>[Linux]</code><code>#ps aux | grep httpd</code>

<code>root      </code><code>3422</code>  <code>0.0</code>  <code>0.7</code> <code>184284</code>  <code>3844</code> <code>?        Ss   </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3425</code>  <code>0.0</code>  <code>0.6</code> <code>184420</code>  <code>3052</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3426</code>  <code>0.0</code>  <code>0.6</code> <code>184420</code>  <code>3144</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3427</code>  <code>0.0</code>  <code>0.6</code> <code>184420</code>  <code>3052</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3428</code>  <code>0.0</code>  <code>0.6</code> <code>184420</code>  <code>3068</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3429</code>  <code>0.0</code>  <code>0.6</code> <code>184420</code>  <code>3068</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3430</code>  <code>0.0</code>  <code>0.4</code> <code>184284</code>  <code>2440</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3431</code>  <code>0.0</code>  <code>0.4</code> <code>184284</code>  <code>2440</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

<code>apache    </code><code>3432</code>  <code>0.0</code>  <code>0.4</code> <code>184284</code>  <code>2440</code> <code>?        S    </code><code>16</code><code>:</code><code>20</code>   <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>

啟動成功後在浏覽器輸入對應的IP位址

<a href="http://s3.51cto.com/wyfs02/M01/22/DA/wKioL1MpVpWT2K-7AAE-7aByyP0561.jpg" target="_blank"></a>

本文轉自Mr_陳 51CTO部落格,原文連結:http://blog.51cto.com/chenpipi/1379763,如需轉載請自行聯系原作者

繼續閱讀