一、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><</code><code>method</code><code>> <</code><code>request-URL</code><code>> <</code><code>version</code><code>></code>
<code><</code><code>headers</code><code>></code>
<code> </code>
<code><</code><code>entity-body</code><code>></code>
http響應:response
<code><</code><code>version</code><code>> <</code><code>status</code><code>> <</code><code>reason-phrase</code><code>></code>
<code> </code>
method
請求方法;希望伺服器端執行的動作;如GET、POST、HEAD等
request-URL
請求的資源;可以是相對路徑(相對主機位置);也可以是完整的URL
version
協定版本;格式:http/<major>.<minor>
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,如需轉載請自行聯系原作者