HTTP
http:伯納斯·李
http/0.9:Method:GET,PUT;原型版本
http/1.0:
MIME:Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展;
Cache:緩存;CDN
Method:GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,OPTIONS;
GET:請求獲取指定的資源;
PUT:向指定的位置上傳資源的最新版本;
POST:用於實現表單認證,在資源之後附加相關數據;
DELETE:請求服務器刪除被明確標識的資源;
HEAD:與GET方法相同,都是向服務器申請獲取資源,但HEAD方法僅向服務器請求響應消息的首部元信息;
TRACE:請求服務器回送收到的請求信息;用於測試或者故障診斷;
CONNECT:保留,留待將來使用;
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項以及請求資源可以使用的方法;
http/1.1:
強化了緩存功能;
持續連接機制:keepalive,也稱持久連接,長連接;
http/2.0--IETF(2015年5月)
http協議的特點:
應用層協議
80/TCP
TCP協議的特性:
面向連接:
建立連接(三次握手),維持連接穩定,拆除連接(四次揮手)
數據序列化傳輸;
將數據分段打包,併爲每段提供CRC校驗和;
確認機制;
流量控制:滑動窗口;
擁塞控制:慢啓動算法+擁塞避免算法;快重傳算法+快恢復算法;
http協議:
Hyper-Text Transfer Protocol,超文本傳輸協議;
HTML:Hyper-Text Marked Language,超文本標記語言;
主要的標記框架:
<html>
<head>
<title>qhdlink web site</title>
<meta >
</head>
<body>
<a> ... </a>
<p> ... </p>
<br>
<hr>
<form> ... </form>
<table>
<th> ... </th>
<tr> ... </tr>
<td> ... </td>
</table>
</body>
</html>
http協議的工作模式:request/response模式;
一次完整的http事務:請求<-->響應;
一次完整的http通信,包括一次請求及對應於此次請求的響應;
web資源:
一個html文檔;
一張圖片(jpg/jpeg,gif,png)
一個MP3片段
一個mpeg/mp4片段
一個PHP腳本
一個js腳本
一個css樣式表
...
一次http請求,只能請求一個web資源;
併發響應模型:
單進程IO模型:僅有一個進程用於處理和響應客戶端請求,每次只能處理和響應一個客戶端,串行響應模型;
多進程IO模型:同時啓動多個進程,每個進程只能處理和響應一個客戶端請求;
複用的IO模型:每個進程可以同時處理並響應多個客戶端的請求;
多線程的IO模型:每個進程可以生成多個線程,每個線程可以響應一個用戶請求;
事件驅動的IO模型:每個進程直接處理並響應多個客戶端的請求;其中採用事件通知機制;
複用的多進程IO模型:啓動M個進程,且每個進程可以生成N個線程,每個線程可以處理並響應一個客戶端的請求;M*N個客戶端;
複用的事件驅動的IO模型:啓動M個進程,每個進程都是基於事件驅動的方式直接處理並響應多個客戶端的請求;
web服務器的一次完整的http請求的處理過程:
1.建立TCP連接
2.接收請求:將客戶端發送來的報文經過通信子網的解封之後,將其放置於用戶空間中相應的應用程序所在的內存空間中;
3.分析處理請求:通過讀取報文的http協議首部和body部分,獲取客戶端請求的資源的具體信息;
4.訪問資源:通過特定的IO方式從磁盤等IO設備上加載客戶端請求的資源;
5.構建響應報文:將加載的資源使用特定協議予以封裝;
6.發送響應報文:
7.記錄日誌信息:
URI:Uniform Resource Indentifier,統一資源標識符;
Web上可以的各種資源,如:HTML文檔,圖片,視頻或音頻片段,應用程序,壓縮包,腳本等,都可以使用URI進行統一的唯一的標識;
URI一般包含三個部分:
1.資源的命名機制;
2.存放資源的主機名稱;
3.資源自身名稱;
URL:Uniform Resource Locator,統一資源定位符;
URL是互聯網上用來描述web資源的定位方式的一組具有特定格式的字符串;
URL一般有三個部分:
1.協議:資源的提供方式或訪問方式;
可用的協議:https,http,ftp,ssh,mailto,gopher,...
2.主機標識:可以使用主機的FQDN,也可以使用IP地址;
3.資源存放的路徑:相對於主機的存放路徑;使用某種特定方式實現的映射路徑,用於標識資源的具體位置;此路徑是從根開始出發並標識的路徑,根是web服務的根,而並不是文件系統 的根;
URL通用標準格式:
[scheme://][Username:Password@]Server[:port][/PATH/TO/RESOURCE][?PARAMETERS=VALUE&&...][#FLAG]
web資源的分類:
靜態資源:
服務器會根據客戶端的請求直接將資源原封不動的響應給客戶端的資源;
html文檔
圖片
視頻片段,音頻片段
純文本
css
...
動態資源:
通常是由某種編程語言編寫的程序文件,在服務器上經過某種特定方式執行之後生成相應的html頁面,服務器將程序運行生成的html頁面響應給客戶端的資源;
服務器端動態資源:
php腳本
jsp程序
.NET程序
python腳本
ruby腳本
C/C++程序
客戶端動態資源:
javascript腳本
Servlet
ActiveX
資源的路徑映射:
chroot機制:
如:
/var/www/html/a.html (根文件系統上的路徑)
/var/www/html/ ----> / (web服務的路徑)
DocumentRoot /var/www/html/ (映射web根目錄的指令)
http://server/a.html
web服務器的資源路徑的映射方式:
1.DocumentRoot
2.Alias
3.VirtualHost DocumentRoot
4.用戶的docroot
...
http協議請求處理的連接方式:
非持續連接:短連接
在建立好的一個TCP連接上,僅能傳送一個http請報文以及一個與之匹配的響應報文;
適用場合:用於請求單個大資源的響應報文的傳送;
持續連接:持久連接,長連接,keepalive;
可以允許客戶端在一個TCP連接上發送不止一次的http請求報文,每一個資源響應報文都可以基於同一個TCP連接響應給客戶端;
適用場合:用於多個小資源請求或從反向代理服務器向後端服務器請求的場景;可以避免後端服務器使用過多的進程來處理和響應客戶端請求,在很大的程度上可以節省服務器的資 源開銷;
注意:到底選擇使用哪類連接方式,由提供資源的服務器決定;
http協議的開源實現:
實現靜態資源請求的處理和響應:
httpd(Apache)
nginx(Engine X)
Tengine
lighttpd
實現動態資源請求的處理和響應:應用程序服務器;
JSP:
Tomcat
Weblogic
Websphere
Jboss
Glassfish
PHP:
php
php-fpm
Python:
python
.NET:
IIS
A Patchy Server,一個充滿了補丁的服務器;Apache
ASF:Apache Software Foundation,Apache軟件基金會;‘
httpd的官方服務站點:httpd.apache.org
httpd應用程序的版本:
httpd-1.3:超級穩定,官方已經停止該版本的後續維護;
httpd-2:
httpd-2.2:CentOS 5/6
httpd-2.4:CentOS 7
httpd的特性:
高度模塊化:Core + Modules
DSO:Dynamic Shared Object,動態共享對象;可以實現模塊的動態裝載和卸載;
模塊分爲兩類:
靜態模塊:static module,編譯源代碼時,直接編譯至核心中的模塊;如果想要更換靜態模塊,則必須要換核心文件;所有只有在重啓服務進程之後,才能生效;
動態模塊:可以基於DSO方式動態裝載和卸載,改變配置操作後,僅需要重載配置文件即可生效;
MPM:Multipath Processing Modules,多道處理模塊;用來設定httpd進程的併發響應模型;
prefork:多進程IO模型;
1.一個主進程,多個子進程;
2.主進程用於管理子進程,創建套接字,接收客戶端請求,並將客戶端請求派發給子進程處理;
3.子進程負責處理客戶端請求及構建和發送響應報文;
4.一個子進程僅能處理和響應一個客戶端的請求;
5.httpd默認的MPM模塊;
worker:複用的多進程IO模型(多進程多線程)
1.一個主進程,多個子進程;
2.主進程用於管理子進程,創建套接字,接收客戶端請求,並將客戶端請求派發給子進程處理;
3.子進程負責管理其內部的各線程;
4.線程負責處理客戶端請求及構建和發送響應報文;
5.一個線程僅能處理和響應一個客戶端的請求;
event:複用的IO模型(事件驅動的多進程模型)
1.一個主進程,多個子進程;
2.主進程用於管理子進程,創建套接字,接收客戶端請求,並將客戶端請求派發給子進程處理;
3.子進程負責處理客戶端請求及構建和發送響應報文;
4.一個子進程可以處理和響應多個客戶端的請求;
注意:event模型在httpd-2.0之前不支持;在httpd-2.2版本中僅用作測試;只有在httpd-2.4中才被定義爲建議使用的模型;
在CentOS 6中,通過rpm包僅能安裝httpd-2.2版本,event模型是測試模型,不支持DSO動態裝載和卸載;
在CentOS 7中,通過rpm包能安裝httpd-2.4版本,event模式爲"production ready",並且支持DSO動態裝載和卸載;
httpd的功能:
支持CGI(Common Gateway Interface);
虛擬主機:Virtual Host
虛擬主機的標識方式:
IP + PORT + FQDN
反向代理:Reverse Proxy
負載均衡集羣:
基於流量,bytraffic
基於業務,bybusiness
基於請求,byrequest
路徑名稱的別名的設置
身份驗證:
basic
digest
支持豐富的第三方模塊;
安裝httpd:
rpm包:本地光盤yum源;
編譯源代碼:
定製新功能;
爲了安全去除帶有bug或者明顯漏洞後面的模塊;
注意:大規模部署應用時,不推薦使用編譯安裝的方式;
CentOS 6:
程序構成:
httpd:主程序包
httpd-tools:工具包
httpd-manual:離線幫助文檔
程序環境:
/etc/httpd/conf/httpd.conf:httpd主配置文件;
/etc/httpd/conf.d/*.conf:片段配置文件;
/etc/rc.d/init.d/httpd:httpd服務的啓動腳本;
/etc/rc.d/init.d/httpd start|stop|reload|restart
servcie httpd start|stop|reload|restart
/etc/sysconfig/httpd:/etc/rc.d/init.d/httpd的配置文件;
/usr/lib64/httpd/modules:動態模塊的存放路徑;
/etc/httpd/modules --> /usr/lib64/httpd/modules
/etc/httpd/conf/magic:實現MIME功能的配置文件;
/var/log/httpd:httpd存放日誌文件的路徑;包括訪問日誌和錯誤日誌;
/etc/httpd/logs --> /var/log/httpd
/var/run/httpd:存放httpd主進程PID的文件;
/etc/httpd/run --> /var/run/httpd
/var/www/html:默認的web站點的文檔根目錄的映射路徑;
可執行程序文件:
/usr/sbin/httpd:啓動MPM的prefork模型的核心程序文件;
/usr/sbin/httpd.event:啓動event模型;
/usr/sbin/httpd.worker:啓動worker模型;
/usr/sbin/apachectl:服務控制命令,用於啓動或停止服務的命令;
CentOS 7:
httpd-2.4
程序構成:
httpd:主程序包
httpd-tools:工具包
httpd-manual:離線幫助文檔
程序環境:
/etc/httpd/conf/httpd.conf:httpd主配置文件;
/etc/httpd/conf.d/*.conf:片段配置文件;
/usr/lib/systemd/system/httpd.service:啓動服務時使用的Unit File;
systemctl start|stop|restart|reload httpd.service
/etc/sysconfig/httpd:/etc/rc.d/init.d/httpd的配置文件;
/usr/lib64/httpd/modules:動態模塊的存放路徑;
/etc/httpd/modules --> /usr/lib64/httpd/modules
/etc/httpd/conf/magic:實現MIME功能的配置文件;
/var/log/httpd:httpd存放日誌文件的路徑;包括訪問日誌和錯誤日誌;
/etc/httpd/logs --> /var/log/httpd
/var/run/httpd:存放httpd主進程PID的文件;
/etc/httpd/run --> /var/run/httpd
/var/www/html:默認的web站點的文檔根目錄的映射路徑;
可執行程序文件:
/usr/sbin/httpd:
在httpd-2.4版本中,MPM支持DSO機制,每個MPM模型都有一個對應的模塊;
/usr/lib64/httpd/modules/mod_mpm_prefork.so
/usr/lib64/httpd/modules/mod_mpm_worker.so
/usr/lib64/httpd/modules/mod_mpm_event.so
/usr/sbin/apachectl:服務控制命令,用於啓動或停止服務的命令;
設置httpd服務開機自動啓動:
CentOS 6:
~]# chkconfig httpd on
CentOS 7:
~]# systemctl enable httpd.service
一個簡單的web站點的配置實例:
1.安裝httpd:
yum install -y httpd httpd-manual
2.確保SElinux和iptables防火牆不會干擾httpd服務的提供:
SElinux配置:
~]# getenforce
Enforcing
~]# setenforce 0
防火牆:
~]# iptables -vnL
CentOS 6:
~]# service iptables stop
~]# chkconfig iptables off
~]# iptables -F
CentOS 7:
~]# systemctl disable firewalld.service
~]# systemctl stop firewalld.service
~]# iptables -F
3.添加一個html文檔:/var/www/html/index.html
4.啓動httpd服務
5.監測服務啓動是否正常:
ss -tnl | grep httpd
ps aux | grep httpd
service httpd status (CentOS 6)
systemctl status httpd.service (CentOS 7)
例:
測試: