Linux之Web服務(1)HTTP協議
前言
在說到Web服務配置之前,先要了解一下Httpd服務所在的Tcp/Ip分層中的http協議。
http協議爲應用層協議,主要是負責處理超文本傳輸。http是一個客戶端和服務端請求和應答的標準(TCP)。客戶端是終端客戶,服務器端是網站。用戶通過Web瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個服務器上指定端口(默認爲80)的HTTP請求。通過HTTP或者HTTPS協議請求資源由統一資源提示符(Uniform Resourcce Identifiers)及URLs來標識。
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。其內部使用了一些方法和規則來規定主機傳輸超文本時如何進行傳輸,怎麼判斷超文本的類型,傳輸的優先級等等。
HTTP雖然是客戶端或其他程序與Web服務器之間的應用通信協議,但是HTTP本身包含命令和傳輸信息,不僅可以用於Web訪問,也可以同於其他因特網/內聯網應用系統之間的通信,從而實現各類應用層資源超媒體訪問的集成。例如:
平時上網時打開瀏覽器輸入一個地址,比如http://www.badiu.com來訪問對應的web服務器,這時最常見的http傳輸。但是後來出現了更高級的手機app,app的開發者們爲了同時實現開發的高效率和並保證app軟件本身所佔硬盤空間小,在設計軟件前端時並不使用一些基於語言來編寫的窗體或圖形,而是直接使用Html5、Js等前端網頁使用的語言來設計出很多一種可以嵌套在一些操作系統支持的調用接口上的網頁,然後通過調用HTTP對應的協議功能接口來實現。一般這樣的應用稱爲webApp,及基於Web的系統和應用,而在常見的移動端webapp採用響應式網頁設計的大部分技術。當使用手機上網下載並安裝了一個這樣的webapp會發現大小很小,而且響應速度很快,內存也佔用很小,因爲這種app就是一堆html的等前端語言的組合啊,想一下一個文件夾裏存放了一些文本,也不會佔太多空間。
當然Http協議可以解析這些標籤類的文本語言,後端功能的實現也需要一些開發語言如Java、Objective-C等,這些開發語言需要操作這些小網頁,也就是調用了Http在移動端應用層對於的接口。當然HTTP還有其它各方面層次的功能支持,只要有對應的需要的實現接口的媒體即可與其合併並完成建立在Http協議上的各種應用。
Http的實現
開源實現:httpd(apache), niginx, lighttpd
基於C/S:
C(Client):browser,user agenet
chrome,ie,firefox,safarl,opera,..
elinks, curl, wget,.......
S(Server):httpd(apache) nginx lighttpd
通信模型:
請求(request)/響應(response)
一次完整的http請求處理:
1、建立或處理連接請求;
2、接收請求(通過創建多個Socket文件);
3、解析請求,處理請求;
4、加載用戶請求的資源;
5、構建響應報表;
6、發送響應報文;
7、記錄訪問於日誌中;
web資源類型:
URL:統一資源定位符;
scheme://host[:port]/URL
說明:URL的根通常要映射爲文件系統上的某路徑;
DocumentRoot /var/www/html/
/index.html --> /var/www/html/index.html
/admin/index.html --> /var/www/html/admin/index.html
Alias /images/ "/date/imgs/"
/images/logo.jpg --> /data/imgs/logo.jpg
Page:Page View
UV:Unique View (獨立IP預覽)
一次通信實例:
在Kongming20主機上運行wget方法客戶端程序,在ernest-laptop上運行squid代理服務器程序。客戶端通過代理的中轉,獲取Internet上的主機www.badiu.com的首頁文檔index.html,如下圖:
說明:從上圖來看請求數據時從應用層HTTP協議開始調用經過傳輸層,在請求調用的時候是經過很很多方法的。下面來介紹HTTP請求的一些方法。
HTTP事務:請求(request)與響應(response)
request一般包括的數據:
<method><url><version>
HEADERS#描述數據的原數據類型
<body>#html中本身的網頁內容
response一般包含的數據:
<version><status code><reason-phrase>
HEADERS
<body>
補充:其中HEADERS報文頭部顯示的數據格式爲鍵值對,及name:value
HTTP請求request
一般使用瀏覽器打開網頁發送請求時,可以通過快捷鍵F12來查看具體的請求報文信息。
解析:這裏通過訪問百度知道http://jingyan.baidu.com可以在瀏覽器控制檯查看其對應的request報文,這裏顯示了其中的m.js表示網頁裏的一個js腳步文件,並顯示了其來源URL地址,第二行的GET表示爲調用了http請求的GET方法,第三行爲響應狀態碼,最後顯示了NDS解析出來的對應的目標IP地址。
HTTP請求方法
當然HTTP請求的方法(request method)不止GET這一種,request方法:
<method>:GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH
方法說明:
GET:申請獲取資源,而不對服務器產生任何其他影響
HEAD:和GET方法類似,不過僅要求服務器返回頭部信息,而不需要傳輸任何實際內容
POST:客戶端向服務器提交數據的方法。這種方法會影響服務器:服務器可能根據收到的數據動態創建新的資源,也可能更新原有的資源。
PUT:上傳某個資源
DELETE:刪除某個資源
TRACE:要求服務器返回原始 HTTP請求的內容。它可用來查看中間服務器(比如代理服務器)對HTTP請求的影響
OPTIONS:查看服務器對某個特定URL都支持哪些請求方法。也可以把URL設置爲*,從而獲取服務器支持的所有請求方法。
CONNECT:用於某些代理服務器,它們能把請求的連接數轉化爲一個安全隧道
PATCH:對某個資源做部分修改
說明:上面的method中,HEAD、GET、OPTIONS和TRACE被視爲安全的方法,因爲他們只是從服務器獲得資源或信息,而不對服務器進行任何修改。而POST、PUT、DELETE和PATCH則影響服務器上的資源。
HTTP響應(reponse)
HTTP響應首先會根據request調用的方法來返回對應的數據報文。
提示:那麼當然也可以通過linux上的一些命令工具來獲取請求傳輸報文,如:
#使用curl命令來獲取一個http://www2.magedu.com的網站首頁的報文首部
[root@root ~]# curl --head http://www2.magedu.com HTTP/1.1 200 OK #1.1表示HTTP 協議版本號,這裏爲狀態碼200表示成功 Date: Fri, 30 Sep 2016 12:58:36 GMT #數據建立的時間 Server: Apache/2.4.6 (CentOS) #服務器使用的HTTP協議軟件及操作系統 Last-Modified: Tue, 27 Sep 2016 16:20:22 GMT #最後修改的時間 ETag: "11-53d7f9f179beb" #請求標記 Accept-Ranges: bytes #允許大小範圍數值爲bytes Content-Length: 17 #數據內容的長度 Content-Type: text/html; charset=UTF-8 #網頁的類型爲html,字符編碼爲UTF-8
注意:第一行爲狀態行,”HTTP1,1”表示WEB服務器使用的HTTP協議版本,通常客戶端要使用和服務端相同的HTTP協議版本,而”200 OK”表示狀態碼和狀態信息。當然不止這一種狀態碼了。有關不同的request方法,當然response接收也會得到不同的狀態碼。
HTTP常見狀態碼列表介紹:
狀態類型 | 狀態碼和狀態信息 | 含義 |
1xx信息 | 100Continue | 服務收到了客戶端的請求行和頭部信息,告訴客戶端繼續發送數據部分。客戶端通常要先發送Expect:100-continue頭部字段告訴服務器自己還有數據要發送。 |
2xx成功響應 | 200 OK | 請求成功 |
3xx重定向響應 | 301 Moved Permanently | 資源被轉移了,請求將被重定向 |
304 Found | 表示被申請的資源沒有更新,和之前獲得的相同 | |
307 Temporary Redirect | 通知客戶端資源能在其他地方找到。與302不同的是,客戶端可以使用和原始請求相同的請求方法來訪問目標資源。 | |
4xx客戶端錯誤 | 400 Bad Request | 通用客戶端錯誤 |
401 Unauthorized | 請求需要認證信息 | |
403 Forbidden | 訪問被服務器禁止,通常由於客戶端沒有權限訪問該資源 | |
404 Fot Found | 資源沒找到 | |
407 Proxy Authentication | 客戶端需要先獲得代理服務器的認證 | |
5xx服務端錯誤 | 500 Intcrnal Server Error | 通用服務器錯誤 |
503 Server Unavailable | 暫時無法訪問服務器 |