馬哥HTTP筆記

http: hyper text transfer protocol, 80/tcp
html: 編程語言,超文本標記語言;

    <html>
        <head>
            <title>TITLE</title>
        </head>
        <body>
            <h1></h1>
                <p> blabla... <a href="http://www.magedu.com/logo.jpg"> blabal </a> </p> 
            <h2></h2>
        </body>
    </html>

    CSS: Cascading Style Sheet
    js: javascript

    MIME: Multipurpose Internet Mail Extesion   多用途互聯網郵件拓展

    工作機制:
        http請求:http request
        http響應:http response

    Web資源:web resource
        靜態文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
        動態文件:.php, .jsp, 

        媒體:
            媒體類型(MIME類型):major/minor
                text/html
                text/plain
                image/jpeg
                image/gif

    URI:每個Web服務器資源都有一個名字,服務器資源名被稱爲URI(統一資源標識符)
    URI有倆種形式:
        URL(通過描述資源的位置來標識位置的)
        URN(通過名字來標識資源)

    URL:(統一資源定位符),URL描述了一臺特定服務器上某資源的特定位置。
        Scheme(方案,協議類型)://Server:Port(服務器因特網地址)/path/to/resource(Web服務器上的某資源)
            爲了嚮應用程序提供它們所需要的輸入參數,以便正確的與服務器交互,URL中有一個參數組件,名值對列表,由“;”將其與URL
            的其餘部分分隔開來。如ftp://prep.ai.mit.edu/pub/gnu;type=d

    絕對URL:包含有訪問資源所需的全部信息
    相對URL:URL的一種便攜縮略記法,

    http協議版本:
        HTTP/0.9:原型版本,功能簡陋
        HTTP/1.0:第一個廣泛使用的版本,支持MIME
        HTTP/1.1: 增強了緩存功能
        spdy(Google 研發)
        HTTP/2.0:

        rfc

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

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

    (3) 處理請求:對請求報文http首部進行解析,並獲取請求的資源及請求方法等相關信息

        元數據:請求報文首部
            <method> <URL> <VERSION>
            Host: www.magedu.com   請求的主機名稱
            Connection:

    (4) 訪問資源:獲取請求報文中請求的資源

        web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源;這些資源放置於本地文件系統某路徑下,此路徑通常稱爲DocRoot

        /var/www/html/
            images/1.jpg

        http://www.magedu.com/images/1.jpg

        web服務器資源路徑映射方式:
            (a) docroot
            (b) alias
            (c) 虛擬主機docroot
            (d) 用戶家目錄docroot

    (5) 構建響應報文

        資源的MIME類型:
            顯式分類
            魔法分類
            協商分類

        URL重定向:
            web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑;

    (6) 發送響應報文

    (7) 記錄日誌

http支持幾種不同的請求命令,稱爲http方法(http method)
    http method:(每條http請求都包含一個http方法,這個方法告訴服務器要執行什麼操作)
       常見method:
        GET:從服務器獲取一個資源;
            HEAD:只從服務器獲取文檔的響應首部;
            POST:向服務器發送要處理的數據;
            PUT:將請求的主體部分存儲在服務器上;
            DELETE:請求刪除服務器上指定的文檔;
            TRACE:追蹤請求到達服務器中間經過的代理服務器;
            OPTIONS:請求服務器返回對指定資源支持使用的請求方法;

            POST用於向服務器發送數據,PUT用於向服務器上的資源(例如文件)中存儲數據。

    http狀態碼:(每個http響應報文返回時都會攜帶一個狀態碼)
            status(狀態碼):
            1xx:100-101, 信息提示;
            2xx:200-206, 成功
            3xx:300-305, 重定向
            4xx:400-415, 錯誤類信息,客戶端錯誤
            5xx:500-505, 錯誤類信息,服務器端錯誤

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

Web的結構組件
代理
位於客戶端和服務器之間的http中間實體
緩存
http的倉庫,使常用的頁面副本離客戶更近
網關
連接其他應用程序的特殊web服務器
隧道
對http通信報文進行盲轉發的特殊代理
Agent代理
發起自動http請求的半智能web客戶端

http報文
起始行(shart line)
首部(header)
主體(body)(可選)

請求報文的格式
    <method> <request-URL> <version>
    <headers>

    <entity-body>

響應報文的格式
    <version> <status> <reason-phrase>
    <headers>

    <entity-body>
報文組成簡要描述:
    <method> 方法
    <request-URL> 請求URL
    <version> 報文所使用的http版本 格式爲HTTP/<major>.<minor>
        <major>主要版本號
        <minor>次要版本號

    <status-code>狀態碼
    <reason-phrase>原因短語
    <header>首部
        通用首部
        請求首部
        響應首部
        實體首部
        拓展首部
    <entity-body> 實體的主體部分

HTTP允許客戶端和最終的源服務器之間存在一串HTTP中間實體(代理、高速緩存等)
可以從客戶端開始,逐跳的將HTTP報文經過這些中間設備,轉發到遠端服務器上去。

TCP連接
TCP的數據是通過IP數據報(IP分組)的小數據塊來發送的。
每個IP分組中都包括:
一個IP分組首部
一個TCP段首部
一個TCP數據塊

 在任意時刻計算機都可以有幾條TCP連接處於打開狀態,TCP是通過端口號來保持連接的正確運行的。
    TCP連接是通過4個值來識別的:
    <源IP地址,源端口號,目的IP地址,目的端口號>
    這4個值一起唯一定義了一條連接。不同的TCP連接擁有不同的地址組件值。
TCP連接是雙向的,TCP連接的每一端口都有一個輸入隊列和一個輸出隊列,用於數據的讀或寫。放入一端輸出隊列中的數據會出現在另一端的輸入隊列中。

TCP的完全關閉和半關閉
    應用程序可以關閉TCP輸入和輸出信道中的任意一個,或者將倆者都關閉了。
    套接字調用close()會將TCP連接的輸入和輸出信道都關閉。這被稱作"完全關閉",
    還可以調用shutdown()單獨關閉輸入或輸出信道。

提高http連接性能的方法:
並行連接
通過多條TCP連接發起併發的http請求
持久連接
重用TCP連接,以消除連接及關閉時延

          持久連接有倆種類型:
            比較老的http/1.0+ "keep-alive"連接
            現代的http/1.1 "persistent"連接

          實現HTTP/1.0 keep-alive 連接的客戶端可以通過包含Connection:Keep-Alive 首部請求將一條連接保持在打開狀態。
          如果服務器願意爲下一條請求將連接保持在打開狀態,就在響應報文中包含相同的首部。
          如果響應中沒有Connection:Keep-Alive 首部,客戶端就認爲服務器不支持keep-alive
          會在發回響應報文之後關閉連接。

          Keep Alive 選項:
            keep-alive 首部只是請求將連接保持在活躍狀態。發出keep-alive請求之後,客戶端和
            服務器並不一定會同意進行keep-alive會話。它們可以在任意時刻關閉空閒的keep-alive連接,並
            可限制keep-alive連接所處理事務的數量。

            可以用keep-alive通用首部中指定的,由逗號分隔的選項來調節keep-alive的行爲。
              keep-alive響應首部可用的選項:
                timeout:估計了服務器希望將連接保持在活躍狀態的時間。
                max:估計了服務器希望爲多少個事務保持此連接的活躍狀態。

                範例:Connection:Keep-Alive
                Keep-Alive:max=5,timeout=120

 http處理請求的連接方式:
    保持連接(長連接):keep-alive
    非保持連接(短連接)

http服務器程序(只能處理靜態程序):
    httpd (apache)
    nginx 
    lighttpd(德國人研發)

應用程序服務器(可解析動態程序):
        IIS
        tomcat, jetty, jboss(RedHat,重新封裝的tomcat), resin
        webshpere(IBM,用於解析jsp), weblogic(Oracle公司產品,用於解析jsp), oc4j

    www.netcraft.com

    httpd的安裝配置和使用:
    httpd: apache
        a  patchy server = apache
        ASF: apache software foundation

    httpd的特性:
        事先創建進程
        按需維持適當的進程
        高度模塊化:core + modules
                支持運行時配置,支持單獨編譯模塊
        DSO: Dynamic Shared Object 動態共享對象
        MPM:Multipath Processing Modules (多路處理模塊)
            prefork:多進程模型,每個進程響應一個請求;
                一個主進程:負責生成n個子進程及回收子進程,主進程也負責創建套接字,負責接收請求,並將其派發給某子進程進行處理;
                子進程:子進程也稱爲工作進程,每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達;最大不會超過1024個;
            worker:多進程多線程模型,每個線程響應一個請求;
                一個主進程:生成多個子進程,主進程也負責創建套接字,負責接收請求,並將其派發給某子進程進行處理,每個子進程負責生個多個線程,每個線程響應一個請求;
                    m子進程,n線程:m*n                    
            event:事件驅動模型,多進程模型,每個進程響應n個請求;
                一個主進程:負責生成子進程,負責創建套接字,負責接收請求,並將其派發給某子進程進行處理
                子進程:基於事件驅動機制直接響應多個請求

                    m*n

                httpd-2.2: event爲測試使用
                httpd-2.4:event可生產使用

    httpd的功能特性:
       apache主機的分類:
            中心主機
            虛擬主機

            虛擬主機和中心主機一般不能同時使用
        虛擬主機:服務於多個不同的站點
            IP:不同虛擬主機IP不同,端口相同
            Port:IP地址可以是同一個,但端口不同
            FQDN(實際應用最多):
                IP相同,端口相同,FQDN不同
                需要在配置文件中使用特殊指令指定啓用基於FQDN的虛擬主機:

        CGI:(通用網關接口,讓web服務器能跟額外的應用程序通信的一種機制,是Web服務器和Web應用程序之間數據交換的一種協議)
       (httpd或web服務器並不處理任何動態內容,而是通過某種協議調用額外的的其他程序來運行程序並將結果返回)

           FastCGI:同CGI,是一種通信協議,但比CGI在效率上做了一些優化。同樣,SCGI協議與FastCGI類似。
           PHP-CGI:是PHP(Web Application)對Web Server提供的CGI協議的接口程序。

           PHP—FPM:是PHP(Web Application)對Web Server提供的FastCGI協議的接口程序,額外還提供了相對智能一些任務管理。

        反向代理
            Apache允許將遠程文檔納入本地服務器的網絡空間中,因爲Web服務器扮演一個代理服務器的角色(從遠程服務器取得文檔並返回給客戶)
            ,所以這種機制被稱爲反向代理,不同於標準代理的是,在客戶看來,他請求的文檔似乎原本就位於這個反向代理服務器上。

        負載均衡
        路徑別名
        支持https協議(mod_ssl模塊)
        豐富的用戶認證機制
            支持基於IP或主機名的ACL
            支持每目錄的訪問控制
            支持URL重寫
            ...

        支持第三方模塊

    安裝httpd:
        rpm包
        源碼編譯安裝

    httpd受Selinux控制

回顧:
MPM:
prefork:多進程模型,一個進程響應一個請求;
worker:多線程模型(多進程生成,一個進程生成多個線程),一個線程響應一個請求;
event:事件驅動模型,一個線程響應多個請求;

併發服務器響應請求:
    單進程I/O模型;
    多進程I/O模型;
    複用的I/O模型;
        多線程模型
        事件驅動
    利用的多進程I/O模型;

httpd(2)

CentOS 6: 2.2
CentOS 7: 2.4

安裝方式:
    rpm
    編譯

CentOS 6:

    程序環境
        配置文件:
            /etc/httpd/conf/httpd.conf
            /etc/httpd/conf.d/*.conf
        服務腳本:
            /etc/rc.d/init.d/httpd
            腳本配置文件:/etc/sysconfig/httpd
        主程序文件:
            /usr/sbin/httpd  (MPM:prefork)
                httpd服務啓動後,會有多個進程
                root 屬主/組的 爲master進程,專門用來創建及銷燬空閒進程。
                apache進程 屬主/組的 爲工作進程,負責真正處理用戶請求。

                /etc/httpd:工作根目錄,相當於程序安裝目錄
            /usr/sbin/httpd.event
            /usr/sbin/httpd.worker
        日誌文件目錄:
            /etc/httpd/logs---> /var/log/httpd
                access_log: 訪問日誌
                error_log:錯誤日誌
        站點文檔目錄:
            /var/www/
                     html
                     cgi-bin

        模塊文件路徑:
            /etc/httpd/modules---->/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: 爲路徑時,是否區分字符大小寫,取決於文件系統;

        httpd -t 命令可檢查配置文件語法是否正確

     使用配置段(容器)限定指令的作用域:
        主配置文件中的指令對整個服務器都有效。如果只想改變一部分的設置,你可以把指令嵌入到<Directory>、<DirectoryMatch>
        <FileMatch>、<Location>、<LocationMatch>配置段(容器)中,這樣就可以限制指令作用域爲文件系統中的某些位置或特定的URL。

        <IfDefine>、<IfModule>、<IfVersion>僅在啓動和重新啓動中起作用

        <Directory>和<Files>指令與其相應的正則表達式版本(<DirectoryMatch>,<FileMatch>)一起作用於文件系統的特定部分
        <Directory>配置段中的指令作用於指定的文件系統目錄極其所有子目錄。
        <Files>配置段中的指令作用於特定的文件名,而無論這個文件存在於哪個目錄。

        <Location>指令與其對應的正則表達式版本<LocationMatch>一起作用於網絡空間的特定部分。

        Apache具備同時支持多個站點的能力,稱爲虛擬主機,<VirtualHost>配置段中的指令僅對該段中的特定站點(虛擬主機)有效。
        雖然大多數指令可以包含在任意的配置段中,但是某些指令僅在某些特定的範圍內採用意義。比如,控制進程建立的指令僅在
        服務器範圍內有效。

        LoadRunner :知名企業級壓力測試工具

        URL路徑跟WEB服務器本地文件系統路徑不是一回事,URL是相對於DocumentRoot的路徑而言的

    只能在特定配置段(容器)中使用的指令:

            AllowOverride指令只能出現在<Directory>中
            Options中FollowSymlinks和SymLinksIfOwnerMatch只能出現在<Directory>或.htaccess文件中
            Options不能用於<Files>和<FilesMatch>

    常用配置:
        1、修改監聽的IP和Port  (/etc/httpd/conf/httpd.conf)
            Listen [IP:]PORT

             #Listen指令並不實現虛擬主機,它只是告訴主服務器去監聽那些地址和端口。
             如果沒有<VirtualHost>指令,服務器將對所有請求一視同仁;但是如果有<VirtualHost>指令
             則服務器會對不同的地址或端口作出不同的響應。要實現虛擬主機,首先必須告訴服務器需要
             監聽哪些地址和端口,然後爲每個特定的地址和端口建立一個<VirtualHost>段來執行特定的響應。
             如果將<VirtualHost>段設置爲服務器沒有監聽地址和端口則此段無效。

            省略ip表示監聽本機所有IP; Listen可重複出現多次;
            修改監聽的地址和端口 只有重啓進程方可生效

        2、持久連接
            Persistent Connection:TCP連接建立後,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成;
                如何斷開?
                    數量限制:100
                    時間限制:可配置
                副作用:對併發訪問量較大的服務器,持久連接功能會使用有些請求得不到響應;
                折衷:使用較短的持久連接時間;
                    httpd-2.4 支持毫秒級持久時間;

            KeepAlive On|Off
            MaxKeepAliveRequests #最大的請求資源數量
            KeepAliveTimeout #超時時間(單位秒)

            測試:
                telnet HOST PORT
                GET /URL HTTP/1.1
                Host: HOSTNAME or IP

        3、MPM
            Multipath Process Module:多道處理模塊
                prefork (一個請求用一個進程響應) 
                worker   (一個請求用一個線程響應,啓動多個進程,每個進程生成多個線程)
                event    (一個進程處理多個請求)

            httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不同MPM機制的支持;確認方法:
                # ps aux  | grep httpd

            默認爲/usr/sbin/httpd, 其使用prefork
                查看模塊列表:
                    查看靜態編譯的模塊
                        # httpd -l
                        Compiled in modules:
                          core.c
                          prefork.c
                          http_core.c
                          mod_so.c
                    查看靜態編譯及動態裝載的模塊
                        # httpd -M

            更換使用的httpd程序,已支持其他MPM機制:
                /etc/sysconfig/httpd
                    HTTPD=/usr/sbin/httpd.{worker,event}

                重啓服務生效;

            prefork的配置:
                <IfModule prefork.c>
                StartServers       8
                MinSpareServers    5
                MaxSpareServers   20
                ServerLimit      256
                MaxClients       256
                MaxRequestsPerChild  4000
                </IfModule>     

            #StartServers httpd進程啓動時啓動多少空閒進程
            #MinSpareServers httpd最小空閒進程數
            #MaxSpareServers httpd最大空閒進程數
            #ServerLimit 最大在線進程數量
            #MaxClients 最大併發響應進程數量
            #MaxRequestsPerChild 每個進程最多可以處理多少請求,0表示不做限定

            worker的配置:
                <IfModule worker.c>
                StartServers         4
                MaxClients         300
                MinSpareThreads     25
                MaxSpareThreads     75
                ThreadsPerChild     25
                MaxRequestsPerChild  0
                </IfModule>

                #ThreadsPerChild 一個進程最多生成多少個線程

            PV, UV
                PV: Page View 頁面訪問
                UV: User View 用戶瀏覽量
                    獨立IP量;

                300*86400=40W+

        4、DSO
            通過配置指令實現模塊加載
                LoadModule <mod_name> <mod_path>

                模塊路徑可使用相對地址
                    相對於ServerRoot(/etc/httpd)指向的路徑而言;
                        /etc/httpd/modules/

        5、定義'Main' server的文檔頁面路徑
            DocumentRoot

            文檔路徑映射:
                DocumentRoot指向的路徑爲URL路徑的起始位置;
                    DocumentRoot "/var/www/html"
                        test/index.html --> http://HOST:PORT/test/index.html

        6、站點訪問控制
            可基於兩種類型的機制指明對哪些資源進行訪問控制
                文件系統路徑:
                    <Directory ""> </Direcotry>
                    <File ""> </File>  #針對單個文件進行控制
                    <FileMatch ""> </FileMatch> #針對某類文件進行控制
                URL路徑:
                    <Location ""> </Location>
                    ...

            訪問控制機制:
                基於來源地址;
                基於賬號;

        7、Directory中“基於來源地址”實現訪問控制

            (1) Options 後跟一個或多個以空白字符分隔的選項列表
                所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
                              None, All
                    None:不支持任何選項
                    Indexes: 索引(指定的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶);
                             (慎用,非常危險,除非做下載服務器使用)
                    FollowSymlinks:允許跟蹤符號鏈接文件;(慎用,非常危險)
                    Includes:允許執行服務端包含(SSI)(慎用,非常危險)
                    ExecCGI :允許運行CGI腳本

            (2) AllowOverride(允許覆蓋)
                與訪問控制相關的那些指令可以放在.htaccess文件文件(每個目錄下都可以有一個)中
                .htaccess 將會降低網站訪問性能

                # AllowOverride None  表示不允許覆蓋  , AllowOverride authconfig 表示允許

            (3) 基於來源地址的訪問控制機制
                Order:定義生效次序,寫在後面的表示默認法則
                    Order allow,deny  白名單
                    Order deny,allow  黑名單
                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、定義默認主頁面
            DirecotryIndex index.html index.html.var

        9、日誌設定
           日誌類型:訪問日誌和錯誤日誌

            錯誤日誌:
            使用ErrorLog logs/error_log 命令指定

                LogLevel:(日誌級別)

                    debug, info, notice, warn, error, crit, alert, emerg
                    錯誤級別,低------>高

            訪問日誌:

                使用CustomLog logs/access_log來指定訪問日誌

                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; may be bogus if return status (%s) is 401);遠程用戶,非爲登錄訪問時,爲一個"-"
                    %t:Time the request was received (standard english format),服務器收到請求的時間;
                    %r:First line of request,請求報文的首行信息(method url version);記錄了此次請求的"方法",URL以及協議版本。
                    %>s: 響應狀態碼;
                    %b: 響應報文的大小,單位是字節,不包括響應報文首部;
                    %{Referer}i:請求報文當中"referer"首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;
                    %{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的應用程序;

                詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

        10、路徑別名

            DocumentRoot "/www/htocs"
                http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
                    --> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

            格式:
            Alias /URL/ "/PATH/TO/SOMEDIR/" 

                Alias /download/ "/rpms/pub/"
                    http://www.magedu.com/download/bash-4.4.2-3.e16.x86_64.rpm  
                        --> /rpms/pub/bash-4.4.2-3.e16.x86_64.rpm   

        11、設定默認字符集
            AddDefaultCharset UTF-8

            GBK, GB2312, GB18030

        12、基於用戶的訪問控制

            認證質詢:
                WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶提供賬號和密碼;

            認證:
                Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過,則服務器發送響應的資源;

                認證類型:
                    basic:明文
                    digest:消息摘要(需瀏覽器支持)

            安全域:需要用戶認證後方能訪問的路徑;
                應該通過名稱對其進行標識,並用於告知用戶認證的原因;

            用戶的賬號和密碼存儲於何處?
                虛擬賬號:僅用於訪問某服務時用到的認證標識;

                存儲:
                    文本文件
                    SQL數據庫
                    ldap目錄存儲
                    nis

            basic認證:
                (1) 定義安全域
                    <Directory "">
                        Options None
                        AllowOverride AuthConfig  
                        AuthType Basic          #用戶認證類型
                        AuthName "STRING"       #指定使用認證的域,此域會出現在給用戶的密碼提問對話框中,其次也幫助客戶端程序確定應該發送哪個密碼
                        AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"    #指定用戶認證文件
                        Require user username1 username2 ...              #限定可以登錄的用戶
                    </Directory>

                        允許賬號文件中的所有用戶登錄訪問:
                            Require valid-user

                (2) 提供賬號和密碼存儲(文本文件)
                    使用htpasswd命令進行管理
                        htpasswd [options] passwordfile username
                            -c: 自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;
                            -m: md5加密用戶密碼;
                            -s: sha1加密用戶密碼;
                            -D: 刪除指定用戶

                            範例:
                                [root@localhost conf]# htpasswd -m /etc/httpd/conf/.htpasswd tom
                                New password: 輸入密碼
                                Re-type new password: 再輸一回
                                Updating password for user tom

                (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>    

                    基於組賬號進行認證要提供:用戶賬號文件和組文件;

                        組文件:每一行定義一個組
                            GRP_NAME:user1 user2 user3 ...

                    示例:
                        <Directory "/www/htdocs/admin">
                            Options None
                            AllowOverride None
                            AuthType Basic
                            AuthName "Administator private"
                            AuthUserFile "/etc/httpd/conf.d/.htpasswd"         
                            AuthGroupFile "/etc/httpd/conf.d/.htgroup"
                            Require group webadmin
                        </Directory>

        13、虛擬主機
            使用虛擬主機得先取消中心主機,註釋中心主機的的DocumentRoot即可。

            httpd -S 命令會輸出解析配置文件的詳細描述,仔細檢查IP地址和主機名會有助於糾正配置錯誤。

            建議在/etc/httpd/conf.d/下創建單獨的虛擬主機配置文件

            有三種實現方案:
                基於ip:
                    爲每個虛擬主機準備至少一個ip地址;
                基於port:
                    爲每個虛擬主機準備至少一個專用port;實踐中很少使用;
                基於hostname:
                    爲每個虛擬主機準備至少一個專用hostname;
                    Apache2.2 需要通過NameVirtualHost指令指定

                可混合使用上述三種方式中任意方式;

            注意:一般虛擬主機莫與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;
                禁用中心主機:註釋DocumentRoot

            每個虛擬主機都有專用配置:
                <VirtualHost "IP:PORT">
                    SeverName
                    DocumentRoot ""
                </VirtualHost>

                    ServerAlias: 虛擬主機的別名;
                    ErrorLog
                    CustomLog
                    <Directory "">
                    </Directory>

            示例1:基於ip
                <VirtualHost 172.16.100.6:80>
                    ServerName web1.magedu.com
                    DocumentRoot "/vhosts/web1/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.7:80>
                    ServerName web2.magedu.com
                    DocumentRoot "/vhosts/web2/htdocs"
                </VirtualHost>

            示例2:基於port
                Listen 8080
                <VirtualHost 172.16.100.7:80>
                    ServerName web2.magedu.com
                    DocumentRoot "/vhosts/web2/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.7:8080>
                    ServerName web3.magedu.com
                    DocumentRoot "/vhosts/web3/htdocs"
                </VirtualHost>

            示例3:基於hostname
                建議在/etc/httpd/conf.d/下使用單獨的虛擬主機配置文件配置

                NameVirtualHost 172.16.100.6:80 #爲一個基於域名的虛擬主機指定一個IP地址(和端口)

                注意:NameVirtualHost指令的參數和VirtualHost指令的參數必須完全匹配
                <VirtualHost 172.16.100.6:80>
                    ServerName web1.magedu.com
                    DocumentRoot "/vhosts/web1/htdocs"

                    <Directory "/vhosts/web1/htdocs">
                    </Directory>
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName web2.magedu.com    #
                    DocumentRoot "/vhosts/web2/htdocs"
                    <Directory "/vhosts/web2/htdocs">
                        目錄屬性及權限
                    </Directory>
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName web3.magedu.com
                    DocumentRoot "/vhosts/web3/htdocs"
                    CustomLog /var/log/httpd/magedu.com/web1_access_log combined 
                    <Directory "/vhosts/web3/htdocs">

                    </Directory>
                </VirtualHost>

                範例:
                  在/etc/httpd/conf/httpd.conf 中註釋中心主機的的DocumentRoot
                  創建/etc/httpd/conf.d/Virtualhost.conf
                  配置以下內容
                    NameVirtualHost 10.49.128.88:80

                    <VirtualHost 10.49.128.88:80>        
                        ServerName web1.magedu.com
                        DocumentRoot "/vhost/web1/htdocs"
                        CustomLog /var/log/httpd/magedu.com/web1_access_log combined
                        ErrorLog /var/log/httpd/magedu.com/web1_err_log
                        LogLevel warn

                    </VirtualHost>

                    <VirtualHost 10.49.128.88:80>
                       ServerName web2.magedu.com
                       DocumentRoot "/vhost/web2/htdocs"
                       CustomLog /var/log/httpd/magedu.com/web2_access_log combined
                       ErrorLog /var/log/httpd/magedu.com/web2_err_log
                       LogLevel warn

                    </VirtualHost>

                    <VirtualHost 10.49.128.88:80>
                      ServerName web3.magedu.com
                      DocumentRoot "/vhost/web3/htdocs"
                      CustomLog /var/log/httpd/magedu.com/web3_access_log combined
                      ErrorLog /var/log/httpd/magedu.com/web3_err_log
                      LogLevel warn

                    </VirtualHost>      

        14、內置的status頁面

           得確保模塊加載項中,有以下內容:
            LoadModule status_module modules/mod_status.so

            <Location /server-status>
                SetHandler server-status  #SetHandler xxx 強制將所有匹配的文件通過xxx指定的處理器處理

                Order deny,allow
                Deny from all
                Allow from 172.16
            </Location> 

            實現:基於賬號實現訪問控制

回顧:
httpd的配置:
Listen [IP:]PORT
KeepAlived {ON|Off}
MPM:
prefork, worker, event
DSO:
LoadModule
httpd -M
DocumentRoot
<Directory>
Options Indexes FollowSymLinks
Order
Allow from
Deny from
</Directory>
<Location>

    DirectoryIndex
    ErrorLog
    CustomLog
    LogFormat
        %{Referer}i: 引用Referer首部的值;
    Alias /URL/ "/path/to/somedir/"
    基於用戶訪問控制:
        認證方式:basic, digest
            AuthType Basic
            AuthName ""
            AuthUserFile 
            AuthGroupFile
            Require user
            Require group
            Require valid-user

        .htpasswd:
            htpasswd
    虛擬主機:IP, Port, FQDN

http協議和httpd的配置

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

    http://www.magedu.com:80/bbs/index.php, 
    https://

    基本語法:
        <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
            params: 參數
                http://www.magedu.com/bbs/hello;gender=f
            query:條件
                http://www.magedu.com/bbs/item.php?username=tom&title=abc
            frag:片段
                https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86

    相對URL
    絕對URL

http協議:
    http/0.9, http/1.0, http/1.1, http/2.0

    http協議:stateless 無狀態協議
        服務器無法持續追蹤訪問者來源
            cookie, session

    http事務:
        請求:request 
        響應:response

        報文語法格式:
            request報文
                <method> <request-URL> <version>
                <headers>

                <entity-body>

            response報文
                <version> <status> <reason-phrase>
                <headers>

                <entity-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部分發送;OK
                301: 請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently(永久重定向)
                302: 與301相似,但在響應報文中通過Location指明資源現在所處臨時新位置; Found (臨時重定向)
                304: 客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modifile(沒有發生修改)
                401: 需要輸入賬號和密碼認證方能訪問資源;Unauthorized
                403: 請求被禁止;Forbidden
                404: 服務器無法找到客戶端請求的資源;Not Found
                500: 服務器內部錯誤;Internal Server Error
                502: 代理服務器從後端服務器收到了一條僞響應;Bad Gateway

        headers:
            格式:
                Name: Value

                Cache-Control:public, max-age=600
                Connection:keep-alive
                Content-Type:image/png
                Date:Tue, 28 Apr 2015 01:43:54 GMT
                ETag:"5af34e-ce6-504ea605b2e40"
                Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT

                Accept:image/webp,*/*;q=0.8
                Accept-Encoding:gzip, deflate, sdch
                Accept-Language:zh-CN,zh;q=0.8
                Cache-Control:max-age=0
                Connection:keep-alive
                Host:access.redhat.com
                If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
                If-None-Match:"5af34e-ce6-504ea605b2e40"
                Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
                User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36

            首部的分類:
                通用首部
                請求首部
                響應首部
                實體首部
                擴展首部

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

                請求首部:
                    Accept:通過服務器自己可接受的媒體類型;
                    Accept-Charset:接收的字符集
                    Accept-Encoding:接受編碼格式,如gzip
                    Accept-Language:接受的語言

                    Client-IP: 
                    Host: 請求的服務器名稱和端口號
                    Referer:包含當前正在請求的資源的上一級資源;
                    User-Agent:客戶端代理

                    條件式請求首部:
                        Expect:
                        If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改;
                        If-Unmodified-Since:自從指定的時間之後,請求的資源是否沒有發生過修改
                        If-None-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag不匹配;
                        If-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag匹配;

                    安全請求首部:
                        Authorization:向服務器發送認證信息,如賬號和密碼;
                        Cookie: 客戶端向服務器發送cookie
                        Cookie2:

                    代理請求首部:
                        Proxy-Authorization: 向代理服務器認證

                響應首部:
                    信息性:
                        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:最後一次修改的時間

httpd-2.2

    15 curl命令

        curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支持HTTPS認證,並且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理服務器, cookies, 用戶名/密碼認證, 下載文件斷點續傳,上載文件斷點續傳, http代理服務器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理服務器,,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。

        curl [options] [URL...]

        curl的常用選項:

            -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[:password]>設置服務器的用戶和密碼
            -0/--http1.0 使用HTTP 1.0 

        用法:curl [options] [URL...]

        另一個工具:elinks
            elinks [OPTION]... [URL]...
                -dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出; 

    16 使用mod_deflate模塊壓縮頁面優化傳輸速度

        適用場景:
            (1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;
            (2) 壓縮適於壓縮的資源,例如文件文件;

        SetOutputFilter DEFLATE   #設置輸出過濾器,只壓縮符合條件的

        # mod_deflate configuration

        # 將會壓縮的文件類型
        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

        # Level of compression (Highest 9 - Lowest 1)
        DeflateCompressionLevel 9  #指明壓縮級別 

    17、https

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

            https://

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

            注意:SSL會話是基於IP地址創建;所以單IP的主機上,僅可以使用一個https虛擬主機;

        回顧幾個術語:PKI,CA,CRL,X.509 (v1, v2, v3)

        配置httpd支持https:
            (1) 爲服務器申請數字證書;
                測試:通過私建CA發證書
                    (a) 創建私有CA
                    (b) 在服務器創建證書籤署請求
                    (c) CA簽證
            (2) 配置httpd支持使用ssl,及使用的證書;
                # yum -y install mod_ssl

                配置文件:/etc/httpd/conf.d/ssl.conf
                    DocumentRoot
                    ServerName
                    SSLCertificateFile
                    SSLCertificateKeyFile
            (3) 測試基於https訪問相應的主機;
                # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

    18、httpd自帶的工具程序

        htpasswd: basic認證基於文件實現時,用到的賬號密碼文件生成工具;
        apachectl:httpd自帶的服務控制腳本,支持start, stop;
        apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具;
        rotatelogs:日誌滾動工具;
            access.log -->
            access.log, access.1.log
            access.log, access.1.log, access.2.log
        suexec:
            訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行;

        ab: apache benchmark

    19、http壓力測試工具
        ab
        webbench
        http_load

        jmeter
        loadrunner

        tcpcopy:網易開發,複製生產環境中的真實請求,並將之保存下來

        ab [OPTIONS] URL
            -n: 總的請求數
            -c:模擬的併發數
            -k: 以持久連接模式測試

        ulimit -n #: 調整當前用戶所同時打開的文件數;

    20. user/group

        http進程由root用戶啓動,但root用戶不負責處理用戶請求,而是創建子進程後,交由普通用戶負責處理用戶請求

        具體交由那個普通用戶來處理用戶請求,通過配置文件中的 User 用戶名 Group 組名 來指定

        範例:

        User apache
        Group apache

    練習題:
    1、建立httpd服務器,要求:
       提供兩個基於名稱的虛擬主機:
            (a)www1.stuX.com,頁面文件目錄爲/web/vhosts/www1;錯誤日誌爲/var/log/httpd/www1.err,訪問日誌爲/var/log/httpd/www1.access;
            (b)www2.stuX.com,頁面文件目錄爲/web/vhosts/www2;錯誤日誌爲/var/log/httpd/www2.err,訪問日誌爲/var/log/httpd/www2.access;
            (c)爲兩個虛擬主機建立各自的主頁文件index.html,內容分別爲其對應的主機名;
            (d)通過www1.stuX.com/server-status輸出httpd工作狀態相關信息,且只允許提供帳號密碼才能訪問(status:status);

    2、爲上面的第2個虛擬主機提供https服務,使得用戶可以通過https安全的訪問此web站點;
        (1)要求使用證書認證,證書中要求使用的國家(CN)、州(Beijing)、城市(Beijing)和組織(MageEdu);
        (2)設置部門爲Ops,主機名爲www2.stuX.com,郵件爲[email protected]

回顧:httpd協議基礎,httpd的基礎配置

http事務:請求<-->響應
    request:
        <method> <URL> <version>
        <HEADERS>

        <entity>
    response:
        <version> <status> <reason phrase>
        <HEADERS>

        <entity>

請求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...

響應狀態碼:
    1xx: 額外信息
    2xx: 成功類,200
    3xx: 重定向類
    4xx:客戶端錯誤
    5xx:服務器端錯誤

httpd的基本配置:
    curl, https(ssl), ab

http的應用

httpd-2.4:

    新特性:
        (1) MPM支持運行DSO機制;以模塊形式按需加載;
        (2) 支持event MPM;
        (3) 支持異步讀寫;
        (4) 支持每模塊及每個目錄分別使用各自的日誌級別;
        (5) 每請求相關的單獨配置;<If>
        (6) 增強版的表達式分析器;
        (7) 支持毫秒級的keepalive timeout;
        (8) 基於FQDN的虛擬主機不再需要NameVirtualHost指令;
        (9) 支持用戶自定義變量;
        (10) 新指令AllowOverrideList
        (11) 更低的內存消耗

    新模塊:
        (1) mod_proxy_fcgi
        (2) mod_proxy_scgi
        (3) mod_ratelimit
        (4) mod_remoteip   #新的訪問控制機制

    修改了一些配置機制:
        不再支持使用Order, Deny, Allow來做基於IP的訪問控制;

安裝httpd-2.4

    httpd依賴於apr-1.4+, apr-util-1.4+, [apr-icon]
        apr: apache portable runtime

    CentOS 6:
        默認:apr-1.3.9, apr-util-1.3.9 

        編譯安裝步驟:

            1.4+版的apr和apr-util

            前提:
                安裝開發環境,安裝pcre-devel

            (1) apr
                # ./configure --prefix=/usr/local/apr
                # make && make install

            (2) apr-util
                # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
                # make && make install

        編譯安裝:httpd 2.4

            # ./configure --prefix=/usr/local/apache24 --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
            # make && make install

            啓動服務:
                /usr/local/apache24/bin/apachectl start

        編譯安裝後配置:
        1.cd /etc/profile.d/
            創建文件 httpd24.sh
            在httpd24.conf添加以下內容
            export PATH=/usr/local/apache24/bin:$PATH 

        2.
            ln -sv /usr/local/apache24/include /usr/include/httpd

        3.
             httpd 服務腳本(手工修改apache2.2服務腳本產生)(如httpd2.4編譯安裝的化,需手工創建)

            #!/bin/bash

            # Source function library.
            . /etc/rc.d/init.d/functions

            # Start httpd in the C locale by default.
            HTTPD_LANG=${HTTPD_LANG-"C"}

            # This will prevent initlog from swallowing up a pass-phrase prompt if
            # mod_ssl needs a pass-phrase from the user.
            INITLOG_ARGS=""

            # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
            # with the thread-based "worker" MPM; BE WARNED that some modules may not
            # work correctly with a thread-based MPM; notably PHP will refuse to start.

            # Path to the apachectl script, server binary, and short-form for messages.
            apachectl=/usr/local/apache24/bin/apachectl
            httpd=${HTTPD-/usr/local/apache24/bin/httpd}
            prog=httpd
            pidfile=${PIDFILE-/usr/local/apache24/logs/httpd.pid}
            lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
            RETVAL=0
            STOP_TIMEOUT=${STOP_TIMEOUT-10}

            # The semantics of these two functions differ from the way apachectl does
            # things -- attempting to start while running is a failure, and shutdown
            # when not running is also a failure.  So we just do it the way init scripts
            # are expected to behave here.
            start() {
                    echo -n $"Starting $prog: "
                    LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
                    RETVAL=$?
                    echo
                    [ $RETVAL = 0 ] && touch ${lockfile}
                    return $RETVAL
            }

            # When stopping httpd, a delay (of default 10 second) is required
            # before SIGKILLing the httpd parent; this gives enough time for the
            # httpd parent to SIGKILL any errant children.
            stop() {
                status -p ${pidfile} $httpd > /dev/null
                if [[ $? = 0 ]]; then
                    echo -n $"Stopping $prog: "
                    killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
                else
                    echo -n $"Stopping $prog: "
                    success
                fi
                RETVAL=$?
                echo
                [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
            }

            reload() {
                echo -n $"Reloading $prog: "
                if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
                    RETVAL=6
                    echo $"not reloading due to configuration syntax error"
                    failure $"not reloading $httpd due to configuration syntax error"
                else
                    # Force LSB behaviour from killproc
                    LSB=1 killproc -p ${pidfile} $httpd -HUP
                    RETVAL=$?
                    if [ $RETVAL -eq 7 ]; then
                        failure $"httpd shutdown"
                    fi
                fi
                echo
            }

            # See how we were called.
            case "$1" in
              start)
                start
                ;;
              stop)
                stop
                ;;
              status)
                    status -p ${pidfile} $httpd
                RETVAL=$?
                ;;
              restart)
                stop
                start
                ;;
              condrestart|try-restart)
                if status -p ${pidfile} $httpd >&/dev/null; then
                    stop
                    start
                fi
                ;;
              force-reload|reload)
                    reload
                ;;
              graceful|help|configtest|fullstatus)
                $apachectl $@
                RETVAL=$?
                ;;
              *)
                echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
                RETVAL=2
            esac

            exit $RETVAL

    編譯安裝的httpd,切換使用MPM
            編輯/etc/httpd24/httpd.conf 文件
            將#Include /etc/httpd24/extra/httpd-mpm.conf 前的#去掉

            修改LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 這條語句
            根據需要將prefork字段修改爲event或worker

            最後重啓httpd24服務

    CentOS 7:

        配置文件:
            主配置文件:/etc/httpd/conf/httpd.conf
            模塊配置文件:/etc/httpd/conf.modules.d/*.conf
            輔助配置文件:/etc/httpd/conf.d/*.conf

        mpm:以DSO機制提供,配置文件00-mpm.conf

        服務控制:systemctl {start|stop|restart|status|reload} httpd.service

    配置:
            (1) 切換使用MPM
                修改/etc/httpd/conf.modules.d/00-mpm.conf 
                中的:
                每個模式分別有一條配置命令。去掉相應命令前的#即可

                LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
                    NAME: prefork, event, worker

                同時只能使用一種模式

            (2) 修改'Main' server的DocumentRoot

            (3) 基於IP的訪問控制法則
                允許所有主機訪問:Require all granted
                拒絕所有主機訪問:Require all deny

                控制特定IP訪問:
                    Require ip IPADDR:授權指定來源地址的主機訪問
                    Require not ip IPADDR:拒絕指定來源地址的主機訪問

                    IPADDR:
                        IP: 172.16.100.2
                        Network/mask: 172.16.0.0/255.255.0.0
                        Network/Length: 172.16.0.0/16
                        Net: 172.16

                控制特定主機(HOSTNAME)訪問
                    Require host HOSTNAME
                    Require not host HOSTNAME

                    Require local #只允許本機訪問

                    HOSTNAME:
                        FQDN: 特定主機
                        DOMAIN:指定域內的所有主機

                <RequireAll>  #控制針對所有主機的訪問,要包含在特定容器中 (如果僅是一句允許或禁止所有主機訪問則不需要,當額外要加控制機制如那個主機可以訪問那個主機不能訪問時則需要包含在容器中)
                    Require all granted
                    Require not ip 10.252.46.165
                </RequireAll>

            (4) 虛擬主機
                基於IP、Port和FQDN都支持;
                基於FQDN的不再需要NameVirtualHost指令;
                任意目錄下的頁面只有被顯示授權才能被訪問

                虛擬主機配置文件模板:
                /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf

                <VirtualHost _default_:80>
                    定義默認虛擬主機
                </VirtualHost>

                注意:任意目錄下的頁面只有顯式授權才能被訪問

                範例:

                <VirtualHost 10.49.128.96:8001>
                ServerName web1.magedu.com
                DocumentRoot "/vhosts/web1/htdocs"
                CustomLog /var/log/httpd/magedu.com/web1_access_log combined
                ErrorLog /var/log/httpd/magedu.com/web1_err_log
                LogLevel warn

                <Directory "/vhosts/web1/htdocs">
                AllowOverride None
                Require all granted                            #需要顯示授權
                </Directory>

                </VirtualHost>

            (5) ssl
                使用yum install mod_ssl 命令安裝
                安裝後會在/etc/httpd/conf.modules.d/目錄下,生成00-ssl.conf文件(模塊配置文件)
                以及/etc/httpd/conf.d/ssl.conf (ssl主配置文件)
                啓用模塊(00-ssl.conf中配置):
                    LoadModule ssl_module modules/mod_ssl.so
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章