詳解HTTP協議與服務

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

一、Http協議簡介

二、Http協議特點

三、Http版本介紹

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

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

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




一、Http協議簡介

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



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

二、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個部分組成,下圖給出了請求報文的一般格式:


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的結尾與請求參數的開始,傳遞參數長度受限制

客戶端請求

[root@localhost ~]# 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: 服務器找不到網關服務器




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

一、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主配置文件的常用選項

  [root@localhost 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 允許所有

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

例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、查看與修改默認工作模式

重啓httpd服務。。。

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


3、站點別名設置

  • HTTP服務器設置

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

  • 客戶端驗證


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


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

1)、建立CA服務器(用戶頒發證書)

  • 生成CA的私鑰

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


  • 爲CA生成自簽證書

  • 建立序列號文件和數據庫文件  

1
2
3
[root@localhost CA]# touch serial index.txt
[root@localhost CA]# echo 01> serial
[root@localhost CA]#

至此CA創建完成,我們就可以爲客戶端頒發證書了


2)、客戶端配置

  • 生成私鑰

[root@stu10 ~]# (umask 077; openssl genrsa -out /key/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.........................................................................................+++
..+++
e is 65537 (0x10001)
[root@stu10 ~]#


  •  製作一個證書籤署請求:



  • CA 簽署證書


3)、 安裝ssl模塊

[root@stu10 htdoc]# yum install mod_ssl -y
[root@stu10 htdoc]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem
[root@stu10 htdoc]#


4)、服務器配置


[root@stu10 CA]# htpasswd -c -m /key/.htpass user1 #設置user1爲虛擬用戶
New password:                                #設置密碼
Re-type new password:                        #再次輸入密碼
Adding password for user user1
[root@stu10 htdoc]# vim /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>        #定義虛擬主機
DocumentRoot "/var/www/html"       #網站目錄
ServerName www.xiaodong.com:443    #定義主機名
<Directory "/var/www/html">
    Options None
    AllowOverride AuthConfig       #設置用戶認證
    AuthName "Only for employees." #認證名稱
    AuthType Basic                 #認證類型爲Basic
    AuthUserFile /key/.htpass      #指定用戶文件  
    Require valid-user             #指定虛擬用戶         
</Directory>
SSLCertificateFile /key/httpd.crt  #指定HTTP服務器證書文件
SSLCertificateKeyFile /key/httpd.key #指定HTTP服務器私鑰文件
[root@stu10 htdoc]# service httpd restart  #重啓服務


5)、客戶端驗證:

客戶端下載CA證書(/etc/pki/CA/cacert.pem ),並修改cacert.pem擴展名爲.crt ;安裝證書並訪問驗證




CA的創建過程如有疑惑可以訪問http://xiaodong88.blog.51cto.com/1492564/1275878

本博客至此結束,望廣大博友多提寶貴意見!!!謝謝


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