Linux之Web服務(1)HTTP協議html
前言前端
在說到Web服務配置以前,先要了解一下Httpd服務所在的Tcp/Ip分層中的http協議。linux
http協議爲應用層協議,主要是負責處理超文本傳輸。http是一個客戶端和服務端請求和應答的標準(TCP)。客戶端是終端客戶,服務器端是網站。用戶經過Web瀏覽器、網絡爬蟲或者其它的工具,客戶端發起一個服務器上指定端口(默認爲80)的HTTP請求。經過HTTP或者HTTPS協議請求資源由統一資源提示符(Uniform Resourcce Identifiers)及URLs來標識。nginx
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。其內部使用了一些方法和規則來規定主機傳輸超文本時如何進行傳輸,怎麼判斷超文本的類型,傳輸的優先級等等。web
HTTP雖然是客戶端或其餘程序與Web服務器之間的應用通訊協議,可是HTTP自己包含命令和傳輸信息,不只能夠用於Web訪問,也能夠同於其餘因特網/內聯網應用系統之間的通訊,從而實現各種應用層資源超媒體訪問的集成。例如:chrome
平時上網時打開瀏覽器輸入一個地址,好比http://www.badiu.com來訪問對應的web服務器,這時最多見的http傳輸。可是後來出現了更高級的手機app,app的開發者們爲了同時實現開發的高效率和並保證app軟件自己所佔硬盤空間小,在設計軟件前端時並不使用一些基於語言來編寫的窗體或圖形,而是直接使用Html5、Js等前端網頁使用的語言來設計出不少一種能夠嵌套在一些操做系統支持的調用接口上的網頁,而後經過調用HTTP對應的協議功能接口來實現。通常這樣的應用稱爲webApp,及基於Web的系統和應用,而在常見的移動端webapp採用響應式網頁設計的大部分技術。當使用手機上網下載並安裝了一個這樣的webapp會發現大小很小,並且響應速度很快,內存也佔用很小,由於這種app就是一堆html的等前端語言的組合啊,想一下一個文件夾裏存放了一些文本,也不會佔太多空間。apache
固然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請求處理:
一、創建或處理鏈接請求;
二、接收請求(經過建立多個Socket文件);
三、解析請求,處理請求;
四、加載用戶請求的資源;
五、構建響應報表;
六、發送響應報文;
七、記錄訪問於日誌中;
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 /p_w_picpaths/ "/date/imgs/"
/p_w_picpaths/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 |
暫時沒法訪問服務器 |