httpd軟件詳解

Web Service
傳輸層:提供進程地址
Port Number:
tcp:傳輸控制協議,面向鏈接的協議:通訊錢須要創建虛擬鏈路,結束後拆除鏈路
0-65535
udp:User Datagram Protocol,無鏈接的協議
0-65535
IANA:
0-1023:特權端口,這些端口永久分配給固定的應用使用,22/tcp(ssh),80/tcp(http),443/tcp(https)
1024-41951:亦爲註冊端口,但要求並非特別嚴格,分配給程序註冊的某應用使用,11211/tcp,11211/udp(memcache),3306/tcp(mysql)
41952+:客戶端程序隨機使用的端口:動態端口或私有端口,其範圍的定義: /proc/sys/net/ipv4/ip_local_port_rangejavascript

Socket:IPC的一種實現,運行位於不一樣主機(甚至同一主機)上不一樣進程之間進行通訊:數據交換,Socket API
    SOCK_STREAM:tcp套接字
    SOCK_DGRAM:UDP套接字
    SOCK_RAW:裸套接字

Socket Domain(根據其所使用的地址)
    AF_INET:Address Family,ipv4
    AF_INET:Address Family,ipv6
    AF_UNIX:同一主機不一樣進程之間通訊時使用

    每類套接字都至少提供了兩種socket;流,數據報
        流:可靠地傳遞、面向鏈接、無邊界
        數據包:不可靠地傳遞、有邊界、無鏈接

套接字相關的系統調用:
    socket():建立一個套接字
    bind():綁定
    listen():監聽
    accept():接收請求
    connect():請求鏈接創建
    write():發送
    read():接收數據
        send(),recv(),sendto(),recvfrom()

IPV4:
    分類:
        A:1-127
        B:128-191
        C:192-223
        D:224-239
        E:240-254
    私有地址:
        A:10.0.0.0/8
        B:127.16.0.0/16-172.31.0.0/16
        C:192.168.0.0/24-192.168.255.0/24

TCP協議的特性:
    創建鏈接:三次握手
    將數據打包成端:校驗和(CRC-32)
    確認、重傳以及超時;
    排序、邏輯序號
    流量控制、滑動窗口算法
    擁塞控制:慢啓動和擁塞避免算法

http:hyper text transfer protocol
    html:編程語言,超文本標記語言
    <html>
        <head>
            <title>
                TITLE
            </titlet>
        </head>
        <body>
            <h1></h1>
                <p>test..<a href="http://www.sjie.com/logo.jpg">sjie</a></p>
            <h2></h2>
        </body>
    </html>

    CSS:層疊樣式表(cascading Style Sheet)
    JS:JavaScript
    MIME:Multipurpose Internet Mail Extesion

    工做機制:
        http請求
        http響應
    
    web資源:web resource
        靜態文件:.jpg .gif .html .txt .css .js .mp3 .avi
        動態文件:.php .jsp

        媒體:
            媒體類型(MIME類型):major/minor
                text/html
                text/plain
                image/jepg
                image/gif
    URI:Uniform Resource Identifier
        URL:uniform Resource Locator,用來描述某服務器某特定資源的位置
            Scheme://Server:Port/path/to/resource
                http://www.sjie.com/images/logo.jpg
        URN:Uniform Resource Naming

    Http協議版本:
        HTTP/0.9:原型版本
        HTTP/1.0: 第一個普遍使用的版本,支持MIME
        HTTP/1.1:加強了緩存功能
        spdy:Google研發的
        HTTP/2.0:

    一次完整的HTTP請求:
        (1)創建或處理請求:接收請求或拒絕請求
        (2)接收請求:
            接收來自於網絡的請求報文中對某資源的一次請求的過程

            併發訪問響應模式(web I/O):
                單進程I/O結構:啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應
                多進程I/O結構:並行啓動多個進程,每一個進程響應一個請求
                複用I/O結構:一個進程響應n個請求:
                    多線程模型:一個進程生成N個線程,每一個線程響應一個用戶請求
                    事件驅動:event-driver
                複用的多進程I/O結構:啓動多個進程,每一個進程響應N個請求

        (3)處理請求:對請求報文進行解析,並獲取請求的資源及請求方法等相關信息
            元數據:請求報文首部
                <method> <URL> <VERSION>
                Host:www.sjie.com  請求的主機名稱
                Connection:

        (4)訪問資源:獲取報文中請求的資源
            web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源,這些資源放置於本地文件系統某路徑下,此路徑一般稱爲DocRoot
            web服務器資源路徑映射方式:
                (a) docroot
                (b) alias
                (c) 虛擬主機docroot
                (d) 用戶家目錄docroot

        (5)構建響應報文:
            資源的MIME類型:
                顯式分類
                魔法分類
                協商分類
            URL重定向:
                web構建的響應併發客戶端請求的資源,而是資源另一個訪問路徑
        (6)發送響應報文

        (7)記錄日誌

    HTTP服務器程序:
        httpd(apache)
        nginx
        lighttpd

        應用程序服務器:
            IIS
            tomcat,jetty,jboss,resin
            webshpere,weblogic,oc4j

    HTTPD的安裝配置和使用
        httpd:apache

        httpd的特性:
            高度模塊化:core + modules
            DSO:Dynamic Shared Object
            MPM:Multipath Processing Modules
                perfork:多進程模型,每一個進程響應一個請求:
                    一個主進程,負責生產n個子進程,子進程也稱爲工做進程,每一個子進程處理一個用戶請求,即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達,最大不會超過1024個

                worker:多線程模式(多進程生成的,一個進程生成多個線程),一個線程響應一個請求
                event:事件驅動模型,一個線程響應多個請求

        HTTPD安裝:
            安裝方式:
                rpm
                編譯
            程序環境:
                配置文件:
                    /etc/httpd/conf/httpd.conf
                    /etc/httpd/conf.d/*.conf
                服務腳本:
                    /etc/rc.d/init.d/httpd
                    配置文件:/etc/sysconfig/http
                主程序文件:
                    /usr/sbin/httpd
                    /usr/sbin/httpd.event
                    /usr/sbin/httpd.worker
                日誌文件目錄:
                    /var/log/httpd
                        access_log:訪問日誌
                        error_log:錯誤日誌
                站點文檔目錄:
                    /var/www/html
                模塊文件路徑:
                    /usr/lib64/httpd/modules
                配置文件的組成:
                    grep "Section" /etc/httpd/conf/httpd.conf
                    ##Section 1: Global Environment
                    ##Section 2: 'Main' server configuration
                    ##Section 3: Virtual Hosts
                    配置格式: directive value
                        directive:不區分字符大小寫
                        value:爲路徑時,取決於文件系統
            經常使用配置:
                1,修改監聽的IP和Port
                    Listen [IP:]PORT
                    省略IP表示監聽本機全部IP;Listen可重複出現屢次
                2,持久鏈接
                    Persistent Connection:鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其餘的請求完成
                        若是斷開?
                            數量限制:100
                            時間限制:可配置
                        反作用:對併發訪問量較大的服務器,持久鏈接功能會使用有些請求得不到響應
                        折中:使用較短的持久鏈接時間
                            httpd-2.4 支持毫秒級持久時間
                    非持久鏈接

                    KeepAlive On|Off
                    MaxKeepAliveRequests
                    KeepAliveTimeout 
                 3,MPM
                    Multipath Process Module:多信道處理模塊
                        prefork,worker,event
                    httpd-2.2不支持同時編譯多個模塊,因此只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不一樣MPM機制的支持,默認爲prefork
                    httpd -l : 查看編譯的模塊
                    更換httpd啓動程序
                        修改/etc/sysconfig/httpd中的HTTPD=
                    prefork的配置
                        <IfModule prefork.c>
                        StartServers       8
                        MinSpareServers    5
                        MaxSpareServers   20
                        ServerLimit      256
                        MaxClients       256
                        MaxRequestsPerChild  4000
                        </IfModule>
                    worker的配置
                        <IfModule worker.c>
                        StartServers         4
                        MaxClients         300
                        MinSpareThreads     25
                        MaxSpareThreads     75
                        ThreadsPerChild     25
                        MaxRequestsPerChild  0
                        </IfModule>
                4,DSO
                    配置指令實現模塊加載
                        LoadModule <mod_name> <mod_path>

                        模塊路徑可以使用相對地址
                            相對於ServerRoot指向的路徑而言:
                                /etc/httpd/module
                5,定義'Main' server的文檔頁面路徑
                    DocumentRoot

                    文檔路徑映射:
                        DocumentRoot指向的路徑爲URL路徑的起始位置:
                            DocumentRoot "/var/www/html"
                                test/index.html -->http://HOST:PORT/test/index.html
                6,站點訪問控制
                    可基於兩種類型的路徑指明對哪些資源進行訪問控制
                        文件系統路徑:
                            <Directory ""></Directory>
                            <File ""></File>
                            <FileMatch ""></FileMatch>
                        URL路徑:
                            <Location ""></Location>
                    訪問控制機制
                        基於來源IP:
                        基於帳號:
                7,Directory中基於來源地址實現訪問控制
                    (1)Options
                        全部可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
                            Indexes:索引;
                            FollowSymlinks:容許跟蹤符號連接文件
                    (2)基於來源地址的訪問控制機制
                        Order:檢查次序
                        Allow from
                        Deny from

                        來源地址:
                            IP
                            NetAddr:
                                172.16
                                172.16.0.0
                                172.16.0.0/16
                                172.16.0.0/255.255.0.0
                8,定義默認主頁面
                    DirectoryIndex index.html index.html.var
                9,日誌設定
                    錯誤日誌:
                        ErrorLog logs/error.log
                        LogLevel warn
                            級別:debug info notice warn error crit alert emerg
                        CustomLog logs/access_log combined
                        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
                            %h:客戶端IP地址;
                            %l:Remote logname(from identd,if supplied) -表示爲空;
                            %u:Remote user (from auth) -表示爲空;
                            %t:服務器收到請求的時間;
                            %r:請求報文的首行信息(method url version);
                            %>s:響應狀態碼
                            %b:響應報文的大小,單位是字節,不包括響應報文的首部
                            %{Referer}i:請求報文當中的"referer"首部的值,當前資源的訪問人口,即從哪一個頁面中的超連接跳轉而來;
                            %{User-Agent}i:請求報文當中"User-Agent"首部的值:即發出請求用到的應用程序
                10,路徑別名
                    Alias /URL/ "/PATH/TO/SOMEDIR/"
                        Alias /bbs/ "/forum/htdocs"
                            http://www.sjie.com/bbs/index.html
                                --> /forum/htdocs/bbs/
                11,設定默認字符集
                    AddDefaultCharset UTF-8

                12,基於用戶的訪問控制

                    認證質詢:
                        WWW-Authenticate:響應碼是401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼
                    認證:
                        Authentization:客戶端用戶填入帳號和密碼後再次發送請求報文,認證經過,則服務器發送響應的資源
                            認證類型:
                                basic:明文
                                digest:消息摘要
                        安全域:須要用戶認證後方能訪問的路徑:
                            應該經過名稱對其進行標識,並用戶告知用戶認證的緣由
                        用戶帳號和密碼存儲於何處
                            虛擬帳號:僅用於訪問某服務時用到的認證標識
                            存儲:
                                文本文件
                                SQL數據庫
                                ldap
                                nis
                        basic認證:
                            (1)定義安全域
                                <Directory "">
                                    Options None
                                    AllowOverride None
                                    AuthType Basic
                                    AuthName "STRING"
                                    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                                    Require user username1 username2  #容許文件中的全部用戶 Require valid-user
                                </Directory>
                            (2)提供帳號和密碼存儲(文本文件)
                                使用htpasswd命令進行管理
                                    htpasswd [options] passwordfile username
                                        -c:自動建立passwordfile,所以僅在建立第一個用戶時使用
                                        -m:使用MD5加密用戶密碼文件
                                        -s:sha1加密用戶密碼
                                        -D:刪除指定用戶
                            (3)實現基於組認證
                                <Directory "">
                                    Options None
                                    AllowOverride None
                                    AuthType Basic
                                    AuthName "STRING"
                                    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                                    AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
                                    Require group GROUP1 GROUP2
                                </Directory>
                                 須要用戶帳號文件和組文件:
                                    組文件:每一行定義一個組
                                        GROUP_NAME:user1 user2 user3 ...

                13,虛擬主機
                    有三種實現方案:
                        基於IP:
                            爲每一個虛擬主機只是一個IP地址;
                        基於port:
                            爲每一個虛擬主機準備至少一個專用port;實踐中不多使用;
                        基於hostname:
                            爲每一個虛擬主機準備只是一個專用的hostname;

                    注意:通常虛擬主機莫與中心主機混用,要使用虛擬主機,先禁用中心主機:
                        禁用中心主機:註釋DocumentRoot
                    每一個虛擬主機都有專用配置:
                        <VirtualHost "IP:PORT">
                            ServerName
                            DocumentRoot ""
                        </VirtualHost>

                            SeverAlias:虛擬主機的別名
                            ErrorLog
                            CustomLog
                            <Directory>
                            </Directory>

                        基於IP地址的虛擬主機:
                            <VirtualHost 192.168.1.1:80>
                                ServerName web1.sjie.com
                                DocumentRoot "/vhosts/web1/htdocs"
                            </VirtualHost>
                            <VirtualHost 192.168.1.2:80>
                                ServerName web2.sjie.com
                                DocumentRoot "/vhosts/web2/htdocs"
                            </VirtualHost>
                        基於端口的虛擬主機:
                            <VirtualHost 192.168.1.1:80>
                                ServerName web1.sjie.com
                                DocumentRoot "/vhosts/web1/htdocs"
                            </VirtualHost>
                            <VirtualHost 192.168.1.1:8080>
                                ServerName web2.sjie.com
                                DocumentRoot "/vhosts/web2/htdocs"
                            </VirtualHost>
                        基於主機名的虛擬主機:
                            <VirtualHost 192.168.1.1:80>
                                ServerName web1.sjie.com
                                DocumentRoot "/vhosts/web1/htdocs"
                            </VirtualHost>
                            <VirtualHost 192.168.1.1:80>
                                ServerName web2.sjie.com
                                DocumentRoot "/vhosts/web2/htdocs"
                            </VirtualHost>

                14,內置的status頁面
                    <Location /server-status>
                        SetHandler server-status
                        Order deny,allow
                        Deny from all
                        Allow from 192.168.1.1
                    </Location>

                15,使用mod_deflate模塊壓縮頁面優化傳輸速度
                    適用場景:
                        (1) 節約帶寬,額外消耗CPU,同事有些老的瀏覽器不支持
                        (2) 壓縮適於壓縮的資源,例如文件

                    SetOutputFilter DEFLATE
                    #壓縮的資源類型
                    AddOutputFilterByType DEFLATE text/plain
                    AddOutputFilterByType DEFLATE text/html
                    AddOutputFilterByType DEFLATE application/xhtml+xml
                    AddOutputFilterByType DEFLATE text/xml
                    AddOutputFilterByType DEFLATE application/xml
                    AddOutputFilterByType DEFLATE application/x-javascript
                    AddOutputFilterByType DEFLATE text/javascript
                    AddOutputFilterByType DEFLATE text/css
                    DeflateCompressionLevel 9
                    BrowserMatch  ^Mozilla/4 gzip-only-text/html
                    BrowserMatch  ^Mozilla/4\.0[678] no-gzip
                    BrowserMatch  \bMSI[E] !no-gzip !gzip-only-text/html

                16,https

                    http over ssl = https 443/tcp
                    ssl:v3
                    tls:v1

                    ssl會話簡化:
                        (1)客戶端發送可供選擇的加密方式,並向服務器請求證書
                        (2)服務器端發送整數以及選定的加密方式給客戶端
                        (3)客戶端取得整數並進行證書驗證
                             若是信任給其發證書的CA
                             (a)驗證證書來源的合法性:用CA的公鑰解密證書上數字簽名
                             (b)驗證證書的內容的合法性
                             (c)檢查證書的有效期限
                             (d)檢查整數是否被吊銷
                             (e)證書中擁有者的名字,與訪問的目標主機要一致
                        (4)客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換
                        (5)服務用此密鑰加密用戶請求的資源,響應給客戶端
                        注意:SSL會話是基於IP地址建立,因此單IP僅可使用一個HTTPS擬主機

                    配置httpd支持https
                        (1)爲服務器申請數字證書
                            測試:經過私有CA發證書
                                建立私有CA
                                在服務器建立證書籤署請求
                                CA簽證
                        (2) yum install -y mod_ssl
                            配置文件:/etc/httpd/conf.d/ssl.conf
                            DocumentRoot
                            ServerName
                            SSLCertificateFile
                            SSLCertificateKeyFile
                17,httpd自帶的工具程序
                    
                    htpasswd:basic認證基於文件實現時,用到的帳號密碼文件生成工具
                    apachectl:httpd 自帶的服務控制腳本,支持start,stop
                    apxs:由httpd-devel包提供,擴展httpd使用第三方模塊的工具
                    rotatelogs:日誌滾動工具
                    suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行
                    ab:Apache Benchmark
                        ab [options] URL
                            -n:總的請求數
                            -c:模擬的併發數
                            -k:以持久鏈接模式測試


        Http協議和HTTPD的配置

            URL:Uniform Resource Locator
                URL方案:scheme
                服務器地址:ip:port
                資源路徑:

                基本語法:
                    <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
                        params:參數
                            http://www.sjie.com/bbs/hello;gender=f
                        query:查詢
                            http://www.sjie.com/bbs/item.php?username=tom&title=abc
                        frag:錨定
                            http://www.sjie.com/doc/install/index.html#rpm

            HTTP協議:
                HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0

                HTTP協議,stateless
                    服務器沒法持續追蹤訪問者來源
                        cookie,session

                    報文語法格式:
                        request報文
                            <method><request-url><version>
                            <headers>
                            <entity-body>

                        response報文:
                            <vsersion><status><reason-phrase>
                            <headers>
                            <entitiy-body>


                        method:請求方法,標明客戶端但願服務器對資源執行的動做
                            GET,HEAD,POST
                        version:
                            HTTP/<major>.<minor>
                        status:
                            三位數字,如200,301,302,404,502;標記請求處理過程當中發生的狀況
                        reason-phrase:
                            狀態碼所標記的狀態的簡要描述
                        headers:
                            每一個請求或響應報文可包含任意個首部,每一個首部都有首部名稱,後面跟一個冒號,然後跟上一個可選空格,接着就是一個指
                        entity-body:請求時附加的數據或響應時附加的數據

                    method方法:
                        GET:從服務器獲取一個資源
                        HEAD:只從服務器獲取文檔的響應首部
                        POST:向服務器發送要處理的數據
                        PUT:將請求的主體部分存儲在服務器上
                        DELETE:請求刪除服務器的某個文檔
                        TRACE:追蹤請求到達服務器中間通過的代理服務器
                        OPTIONS:請求服務器返回對指定資源支持使用的請求方法

                        協議查看或分析工具:
                            tcpdump,tshark,wireshark

                    status(狀態碼)
                        1xx 100-101  信息提示
                        2xx 200-206  成功
                        3xx 300-305  重定向
                        4xx 400-415  錯誤類信息,客戶端錯誤
                        5xx 500-505  錯誤類信息,服務器端錯誤

                        經常使用狀態碼:
                            200:成功,請求的全部數據經過響應報文的entity-body部分發送
                            301:請求的URL指向的資源以及被刪除,但在響應報文中經過首部Location指明瞭資源如今所處的新位置:Moved Per
                            302:與301類似,但在響應報文中經過Location指明資源如今所處臨時新位置:Found
                            304:客戶端發出了條件式請求,但服務器上的資源未發生改變,則經過響應此響應碼經過客戶端:Not Modified
                            401:須要輸入帳號和密碼認證方能訪問資源:Unauthorized
                            403:請求被禁止:Forbidden
                            404:服務器沒法找到客戶端請求的資源:Not Found
                            500:服務器內部錯誤:Internal Server Error
                            502:代理服務器從後端服務器收到了一條僞響應:Bad Gateway


                    首部分類:
                        通用首部:
                            Date:報文的建立時間
                            Connection:鏈接狀態,如keep-alive,close
                            Via:顯示報文通過的中間節點
                            Cache-Control:控制緩存

                        請求首部:
                            Accept:經過服務器本身可接受的媒體類型
                            Accept-Charset:
                            Accept-Encoding:接受編碼格式,如gzip
                            Accept-Language:接受的語言
                            Client-IP
                            Host:請求的服務器名稱和端口號
                            Referer:包含當前正在請求的資源的上一級資源
                            User-Agent:客戶端代理

                        響應首部:
                            信息性:
                                Age:響應持續時長
                                Server:服務器程序軟件名稱和版本
                            協商首部:
                                Accept-Ranges:服務器可接受的請求範圍類型
                                Vary:服務器查看的其餘首部列表
                            安全響應首部:
                                Set-Cookie:向客戶端設置cookie
                                Set-Cookie2:
                                www-Authenticate:來自服務器的對客戶端的質詢認證表單

                        實體首部:
                            Allow
                            Location
                            Content-Encoding:
                            Content-Language:
                            Content-Length:主體的長度
                            Content-Location:實體的真正所處位置
                            Content-Type:主體的對象類型
                            Etag:實體的擴展標籤
                            Expires:實體的過時時間
                            Last-Modified:最後一次修改的時間
                        擴展首部

        Curl命令用法:
            Curl是基於URL語法在命令行方式下工做的文件傳輸工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELENT,DIVCT,FILE及LDAP等協議。curl支持HTTPS的認證,並HTTP的POST,PUT等方法。

            curl [options] [URL]

                -A/--user-agent <string> 設置用戶代理髮送給服務器
                -basic 使用HTTP基本認證
                --tcp-nodelay 使用TCP_Nodelay認證
                -e/referer <URL> 來源網址
                --cacert <file> CA證書(SSL)
                --compressed 要求返回是壓縮的格式
                -H/--header <line>自定義頭信息傳遞給服務器
                -I/--head 只顯示響應報文的首部信息
                --limit-rate <rate> 設置傳輸速度
                -u/--user <user[:passwd]> 設置服務器的用戶和密碼
                -0/--http1.0 使用HTTP1.0

            elinks [OPTIONS] [URL]
                --dump:不進入交互模式,把文檔輸出到標準輸出
相關文章
相關標籤/搜索