1. 程式人生 > 實用技巧 >詳解HTTP協議與服務

詳解HTTP協議與服務

**************************************************

一、Http協議簡介

二、Http協議特點

三、Http版本介紹

四、Http之URL(統一資源定位符)

五、HTTP請求報文與響應報文

**************************************************




一、Http協議簡介

HTTP協議是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連線方式,HTTP1.1版本中給出一種持續連線的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。


201752346.png


HTTP在TCP協議中的位置,如下圖所示:

175937361.jpg

二、Http協議特點

  • 支援客戶/伺服器模式(C/S模式)

  • 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。


  • 靈活: HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。

  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。

  • 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。


三、Http版本介紹

HTTP目前有三個版本:HTTP0.9、HTTP1.0、HTTP1.1。

  • HTTP0.9是最早的版本 ,它僅能響應文字

  • HTTP1.0開始引用MIME(多功能多用途網際網路郵件擴充套件)技術,smtp傳送郵件的時候攜帶非文字資料,引用儲存連線技術(keep——alive),引用快取機制;

  • HTTP1.1更多的請求方法,更精細的快取控制(條件式儲存方式),持久連線(persistent connection),目前被廣泛的使用。

HTTP1.0與HTTP1.1對比:

在HTTP1.0,單一TCP連線內僅執行一個“客戶端傳送請求—伺服器傳送應答”週期,之後釋放TCP連線。在HTTP1.1優化支援持續活躍連線:客戶端連續多次傳送請求、接收應答;批量多請求時,同一TCP連線在活躍(Keep-Live)間期內複用,避免重複TCP初始握手活動,減少網路符合和響應週期。


四、Http之URL(統一資源定位符)

URL 的一般形式是:

<URL的訪問方式>://<主機>:<埠>/<abs_path>

URL的訪問方式有:

1.ftp —— 檔案傳送協議 FTP

2.http —— 超文字傳送協議HTTP

3.https —— 用安全套接字層傳送的超文字傳輸協議

4.file —— 當地電腦或網上分享的檔案


host表示合法的Internet主機域名或者IP地址;port指定一個埠號,為空則使用預設埠80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那麼當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
eg:
輸入:www.google.com.hk

瀏覽器自動轉換成:http://www.google.com.hk/


五、HTTP請求報文與響應報文

Http請求報文

一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行請求資料4個部分組成,下圖給出了請求報文的一般格式:

210706667.jpg


1.請求頭

請求行由請求方法欄位、URL欄位和HTTP協議版本欄位3個欄位組成,它們用空格分隔。例如,

GET /index.html HTTP/1.1。

HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

1)、GET

最常見的一種請求方式,當客戶端要從伺服器中讀取文件時,當點選網頁上的連結或者通過在瀏覽器的位址列輸入網址來瀏覽網頁的,使用的都是GET方式。GET方法要求伺服器將URL定位的資源放在響應報文的資料部分,回送給客戶端。使用GET方法時,請求引數和對應的值附加在URL後面,利用一個問號(“?”)代表URL的結尾與請求引數的開始,傳遞引數長度受限制

客戶端請求

[[email protected] ~]# telnet www.google.com.hk 80
Trying 74.125.128.199...
Connected to www.google.com.hk.
Escape character is '^]'.
GET / HTTP/1.1
HOST:www.google.com.hk

(末尾有一個空行。第一行指定方法、資源路徑、協議版本;第二行是在1.1版裡必帶的一個header作用指定主機)

伺服器響應:

HTTP/1.1 200 OK
Date: Thu, 22 Aug 2013 14:06:47 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Big5
Set-Cookie: PREF=ID=191d6c8d0bb04095:FF=0:NW=1:TM=1377180407:LM=1377180407:S=u8OwwZ_w0a5YzJLT; expires=Sat, 22-Aug-2015 14:06:47 GMT; path=/; domain=.google.com.hk
Set-Cookie: NID=67=Jb4v4isJQXT_4WKdwNqVJfT2nJwzArUy_lHzpCYbs5hTAKyFj6-EUAS3Tk5E5r-axhTXuvwGDKP0JZ5DEM8ReCJ3OhTREoJwioqfDWBMrNlg99jGQBBwBa9BZqbeSwKd; expires=Fri, 21-Feb-2014 14:06:47 GMT; path=/; domain=.google.com.hk; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Transfer-Encoding: chunked


2).POST

使用POST方法可以允許客戶端給伺服器提供資訊較多。POST方法將請求引數封裝在HTTP請求資料中,以名稱/值的形式出現,可以傳輸大量資料,這樣POST方式對傳送的資料大小沒有限制,而且也不會顯示在URL中。

3).HEAD

HEAD就像GET,只不過服務端接受到HEAD請求後只返回響應頭,而不會發送響應內容。當我們只需要檢視某個頁面的狀態的時候,使用HEAD是非常高效的,因為在傳輸的過程中省去了頁面內容。

4).PUT

上傳資源(不安全)

5).DELETE

刪除資源(不安全)

6).OPTIONS

返回請求的資源所支援請求方法的方法(客戶端不知道伺服器所支援的方法,需要伺服器返回所支援的方法)

7).TRACE

追蹤一次資源請求中間所經過的代理伺服器


2.請求頭部

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知伺服器有關於客戶端請求的資訊,典型的請求頭有:

User-Agent:產生請求的瀏覽器型別。

Accept:客戶端可識別的內容型別列表。

Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。

3.空行

最後一個請求頭之後是一個空行,傳送回車符和換行符,通知伺服器以下不再有請求頭。

4.請求資料

請求資料不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求資料相關的最常使用的請求頭是Content-Type和Content-Length。

HTTP響應報文

HTTP響應也由三個部分組成,分別是:狀態行、訊息報頭、響應正文。

如下所示,HTTP響應的格式與請求的格式十分類似:

<status-line>

<headers>

<blank line>

[<response-body>]

正如所見,在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供一個狀態碼來說明所請求的資源情況。

狀態行格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。狀態程式碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

  • 1xx:指示資訊--表示請求已接收,繼續處理。

  • 2xx:成功--表示請求已被成功接收、理解、接受。

  • 3xx:重定向--要完成請求必須進行更進一步的操作。

  • 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現。

  • 5xx:伺服器端錯誤--伺服器未能實現合法的請求。

常見狀態程式碼、狀態描述的說明如下。

  • 200 OK:客戶端請求成功。

  • 301:永久重定向, Location響應首部的值仍為當前URL,因此為隱藏重定向;

  • 302 :臨時重定向,顯式重定向, Location響應首部的值為新的URL

  • 400 Bad Request:客戶端請求有語法錯誤,不能被伺服器所理解。

  • 401 Unauthorized:請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用。

  • 403 Forbidden:伺服器收到請求,但是拒絕提供服務。

  • 404 Not Found:請求資源不存在,舉個例子:輸入了錯誤的URL。

  • 500 Internal Server Error:伺服器發生不可預期的錯誤。

  • 503 Server Unavailable:伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常。

  • 504 Gateway Timeouteg: 伺服器找不到閘道器伺服器



144254793.png


*************************************************

一、Apache簡介

二、Apache版本介紹

三、Apache工作模式

四、Http伺服器的安裝於配置

**************************************************




一、Apache簡介

Web伺服器軟體有Apache,Tomcat,IIS,Nginx 等,由於 Apache是世界使用排名第一的Web伺服器軟體。它可以執行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一,所以我們在這裡詳細介紹Apacehe伺服器軟體


二、Apache版本介紹

  • httpd-1.3 :很穩定但是官方已經不維護了

  • httpd-2.0 :常用版本

  • httpd-2.2 :目前使用最廣的版本

  • httpd-2.4 :最新版本(引用了許多新特性)


三、Apache工作模式

  • Prefork工作模式:

特點:一個程序響應一個客戶端請求,prefork用單獨的子程序來處理不同的請求,程序之間是彼此獨立的,這也使其成為最穩定的MPM之一。

  • Worker工作模式:

特點:主程序產生子程序,一個子程序產生多個執行緒,每個執行緒響應一個請求,各個執行緒獨立的處理請求。

  • Event:(在HTTP-V2.4版本引用了此模式,在V2.2是作為測試模組)

事件驅動模式


四、Apache的安裝於配置

yum installhttpd -y


  • HTTP的相關資訊:

服務指令碼:/etc/rc.d/init.d/httpd

執行目錄:/etc/httpd

配置檔案:/etc/httpd/conf/

主配置檔案:httpd.conf

擴充套件配置:/etc/httpd/conf.d/*.conf

網頁檔案目錄(DocumentRoot):/var/www/html


  • 詳解Apache主配置檔案的常用選項

[[email protected] conf.d]# vim /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"#軟體安裝目錄
PidFile run/httpd.pid                   #指定pid檔案
KeepAlive Off                           #關閉永久連線
MaxKeepAliveRequests 100                #最多客戶端連線數
KeepAliveTimeout 15                     #客戶端超時時間
<IfModule prefork.c>                    #prefork模式
StartServers       8                    #開機啟動的程序
MinSpareServers    5                    #最小空閒程序數
MaxSpareServers   20                    #最大空閒程序數
ServerLimit      256                    #單個程序的最大併發量
MaxClients       256                    #單個程序允許連線的客戶端數
MaxRequestsPerChild  4000               #單個程序最大處理請求數
</IfModule>
<IfModule worker.c>                     #work工作模式
StartServers         4                  #開機啟動的程序數
MaxClients         300                  #最大客戶端數
MinSpareThreads     25                  #最小空閒執行緒數
MaxSpareThreads     75                  #最大空閒執行緒數
ThreadsPerChild     25                  #每程序最多產生多少執行緒
MaxRequestsPerChild  0                  #每個子程序在其生存期內允許伺服的最大請求數量
</IfModule>
Listen 80                               #監聽埠
User apache                             #以apache使用者身份執行
Group apache                            #以apache組的身份執行
DocumentRoot "/website"#指定網站的站點(此處修改為/website)
<Directory /website>                    #定義站點的許可權
Options none         
AllowOverride None
Order allow,deny
Allow from all
</Directory>
DirectoryIndex  index.html index.html.var
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b"common   #定義日子格式
LogFormat "%{Referer}i -> %U"referer
LogFormat "%{User-agent}i"agent
CustomLog logs/access_logcombined
ServerSignature On
Alias /icons/"/var/www/icons/"#定義別名
<Directory "/var/www/icons">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule mod_dav_fs.c>
DAVLockDB /var/lib/dav/lockdb
</IfModule>
ScriptAlias /cgi-bin/"/var/www/cgi-bin/"#定義CGI別名
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

註釋:

第4行:開啟永久連線功能以後,下面兩行才能生效

第43行:伺服器使用alias可以隱藏站點,以提高網站的安全性

第29行:定義站點的訪問許可權

第7-14行:設定perfork工作模式的屬性,此處可以更具站點需要進行調優

第15-23行:設定worker工作模式的屬性,此處可以更具站點需要進行調優

第22行:將MaxRequestsPerChild設定成非零值有兩個好處:

可以防止(偶然的)記憶體洩漏無限進行,從而耗盡記憶體。

給程序一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動程序的數量。

1、網站訪問目錄的許可權設定

<Directory "/var/www/html">              #預設網站存放目錄
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

註釋:

第2行:Options:

Indexes: 索引檔案(一般不是下載站點建議關閉此功能)

FollowSynLinks: 是否跟隨軟連結檔案

ExecCGI:是否允許執行CGI指令碼;

None:關閉所有功能

All:開啟所有功能

第3行: AllowOverride None 是否允許覆蓋

第4行: Orader allow,deny 先拒絕後允許

第5行:Allow from all 允許所有

通過以上對許可權的說明,不知道你是否已經理解,下面我們舉例說明一下。。j_0002.gif

例1.

僅拒絕172.16.0.0/16端的主機訪問/var/www/html

<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Deny  from 172.16.0.0/16
</Directory>

例2.

拒絕172.16.1.1的主機訪問,允許172.16.0.0/16網端的主機訪問。

<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 172.16.1.1
Allow from  172.16.0.0/16
</Directory>


2、檢視與修改預設工作模式

141349474.png

163313779.png

重啟httpd服務。。。

此時httpd已經切換到worker模式,但是worker模式不一定比prefork模式效能要強。穩定性相對要略一些。此時啟用與不啟用依據環境而定。正如適合自己的才是最好的。。


3、站點別名設定

  • HTTP伺服器設定

182148442.png

注意xiaodong這個目錄不需要建立

  • 客戶端驗證

182508914.png

182513716.png


設定別名可以有效隱藏站點目錄,可以提高安全性。


4、基於SSL的虛擬主機配置

1)、建立CA伺服器(使用者頒發證書)

  • 生成CA的私鑰

[[email protected] CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..................+++
............................................................................................................................................................................................................+++
e is 65537 (0x10001)


  • 為CA生成自簽證書

200553525.png

  • 建立序列號檔案和資料庫檔案

123[[email protected] CA]# touch serial index.txt[[email protected] CA]# echo 01> serial[[email protected] CA]#