http協議的簡單介紹

http協議:Hyper-Text Transfer Protocol,超文本傳輸協議; //HTML:Hyper-Text Marked Language,超文本標記語言;----靜態網頁 超文本:帶有超連接的文本
http發展史:伯納斯·李{1994年,伯納斯李在MIT網絡中心成立萬維網中心,表明互聯網誕生,伯納斯李被稱爲萬維網之父;}
http/0.9:只有get或put方法;http的原型版本;
http/1.0(1998年);
引入郵件中的MIME機制:Mutipurpose Internet Mail Extension,多用途互聯網郵件擴展; //http有了下載功能
Cache(緩存):提升數據傳輸的速率;{CDN:內容分發網絡}
Method:GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,OPTIONS
GET:請求獲取指定的資源;
PUT:向指定的位置上傳資源的最新版本;
POST:用於表單認證,在資源以後附加相關數據;
DELETE:請求服務器刪除被明確標識的資源;
HEAD:與GET方法相同,都是向服務器申請獲取資源,但HEAD方法僅向服務器請求響應信息的首部元信息;
TRACE:請求服務器回送所收到的請求信息;用於測試或者故障診斷;
CONNECT:保留,留待未來使用;
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項以及請求資源可使用的方法;
http/1.1(本世紀初):
強化了緩存功能;
持續鏈接機制:keeplive,也稱持久鏈接,長鏈接;
http/2.0(2015年5月)
IETF(互聯網工程任務組)結合谷歌公司開發的SPDY(speedy)插件(用來加速http傳輸速度和處理高併發)發佈http/2.0 php

http協議的特色:
    1.典型的應用層協議;
    2.在傳輸層是TCP來承載的,端口號是80/TCP;
        TCP協議的特性:
            1.面向鏈接:
                創建鏈接(三次握手),維持鏈接穩定,拆除鏈接(四次揮手)
                數據序列化傳輸;
            2.將數據分段打包,併爲每段提供CRC校驗和(循環冗餘校驗),從而保證數據的完整性;
            3.確認機制:
            4.經過流量控制來最大利用網絡資源:(利用滑動窗口來控制流量) 
            5.擁塞機制:慢啓動算法+擁塞避免算法;快重傳算法+快恢復算法;

http協議的工做模式:request/response模式(請求/響應 模式);
    一次完整的http事務:請求<-->響應;
    一次完整的http通訊,包括一次請求及對應於這次請求的響應;
    通訊的目的是得到服務器上的web資源,一次http請求,只能得到一次web資源;
        web資源:html文檔;圖片(jpg/jpeg(壓縮,成像不清晰,佔用空間小),gif,png(沒有通過壓縮處理的圖片,佔用空間大,可是成像質量比較高));MP3/4;PHP腳本/js腳本/css樣式表;...
            web資源的分類:
                靜態資源:服務器會根據客戶端的請求直接將資源原封不動的響應傳輸給客戶端的資源;{資源包括:html文檔;圖片(;MP3/4;PHP腳本/js腳本/css樣式表;...}
                動態資源:一般是有某種編程語言編寫的程序文件,在服務器上通過某種特定方式執行以後生成相應的html頁面,服務器將程序運行生成的html頁面響應給客戶端的資源;
                    服務器端動態資源:PHP腳本,JSP腳本,.NET程序(Linux上不支持編譯),python腳本,ruby腳本,C/C++程序
                    客戶端動態資源(存儲在服務器端,原封不動的傳遞到客戶端,在客戶端運行一遍生成一個頁面);JavaScript腳本,Servlet,ActiveX
    併發響應模型: 
        單進程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:統一資源標識符;
    web上的各類資源均可以使用URI進行統一的惟一的標識;定位資源存在的位置;
    URI包括三個部分:
        1.資源的命名機制;
        2.存放資源的主機名稱;
        3.資源自身的名稱;
 URL:統一資源定位符;   
    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]
 資源的路徑映射:
    chroot機制:
        如:將真正根文件系統上的路徑假裝成根文件系統,這個假裝的根文件系統叫作web服務的路徑
            映射web根目錄的指令爲:DocumentRoot /var/www/html(此路徑爲真正根文件系統的路徑)--->web服務的資源路徑(用戶在客戶端訪問的路徑)

        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(Oracle),Websphere(IBM),Jboss,Glassfish
        PHP:php,php-fpm
        Python:python
        Ruby:ruby

httpd:http daemon(http守護者)
由ASF(Apache軟件基金會)維護,官方站點:httpd.apache.org
應用程序版本:
httpd-1.3:超級穩定,官方已經中止該版本的維護;
httpd-2:
httpd-2.2:CentOS 5/6中默認使用
httpd-2.4:CentOS 7中默認使用
httpd特性:
高度模塊化:Core+Modules
DSO:Dynamic Shared Object,動態共享對象;能夠實現模塊的動態裝載和卸載;css

模塊分爲兩類:
            靜態模塊:static module,編譯源代碼時,直接編譯至核心中的模塊中;若是想要更換靜態模塊,則必須更換核心文件;只有在重啓服務進程以後,才能生效;
            動態模塊:能夠基於DSO方式動態裝載和卸載,改變配置操做後,僅須要重載配置文件便可生效;
                MPM:多道處理模塊;用來設定httpd進程的併發響應模型;
                    prefork:多進程IO模型;
                        1.一個主進程,多個子進程;
                        2.主進程用於管理子進程,建立套接字,接受客戶端請求並將客戶端請求派發給子進程處理;
                        3.子進程處理客戶端請求及構建和發送響應報文;
                        4.一個子進程僅能處理和響應一個客戶端的請求;
                        5.httpd默認的MPM模塊;
                    worker:複用的多進程IO模型(多進程多線程)
                        1.一個主進程,多個子進程;
                        2.主進程用於管理子進程,建立套接字,接受客戶端請求並將客戶端請求派發給子進程處理;
                        3.子進程負責管理其內部的各線程;
                        4.線程負責處理客戶端請求及構建和發送響應報文;
                        5.一個線程僅能處理和響應一個客戶端的請求;
                    event:複用的IO模型(事件驅動的多進程模型)
                        1.一個主進程,多個子進程;
                        2.主進程用於管理子進程,建立套接字,接受客戶端請求並將客戶端請求派發給子進程處理;
                        3.子進程處理客戶端請求及構建和發送響應報文;
                        4.一個子進程能處理和響應多個客戶端的請求;
                    注意:event模型在httpd2.0版以前不支持;在httpd-2.2版本中僅用做測試;只有在httpd2.4中才被定義爲建議使用的模型;在CentOS 6中,經過rpm包僅能安裝httpd-2.2版本,event模型是測試模型,不支持DSO動態裝載和卸載;在CentOS 7中經過rpm包能安裝httpd-2.4版本,event模式爲「production ready」,而且支持DSO動態裝載和卸載;
httpd的功能:
    1.支持CGI(Common Gateway Interface):支持客戶端向執行在Web服務器上的程序請求數據
    2.虛擬主機(virtual host):
        虛擬主機的標識方式:IP + PORT + FQDN (在IP和端口號相同的狀況下,只要FQDN不一樣就是不一樣的客戶端)
    3.反向代理:Reverse Proxy (服務器接受客戶端請求,自身將客戶端請求修改成本身的IP地址標識後發送給後臺服務器並將後臺服務器返回的數據資源返回給客戶端)
    4.負載均衡集羣:基於流量;基於業務;基於請求
    5.路徑名稱的別名的設置
    6.身份驗證:basic,digest
    7.支持豐富的第三方模塊;

安裝httpd:
    rpm包:本地光盤yum源;
    編譯源代碼(大規模部署安裝時不推薦採用編譯源代碼的方式安裝httpd):
        在須要定製新功能時;
        在爲了安全去除帶有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模型;
            /u sr/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服務
                    service httpd start (CentOS 6)
                    systemctl start httpd (CentOS 7)
                5.監測服務啓動是否正常:
                    ss -tnl | grep httpd
                    ps aux | grep httpd
                    service httpd status (CentOS 6)
                    systemctl status httpd.service (CentOS 7)
相關文章
相關標籤/搜索