1. 程式人生 > >linux學習43-HTTP服務和APACHE2

linux學習43-HTTP服務和APACHE2

HTTP服務和APACHE2

知識點

  • 請求報文響應報文
  • 錯誤碼
  • 請求重定向
  • 編譯安裝
  • 實現https
  • curl工具

1. http協議

  • http協議版本
    http/0.9, http/1.0, http/1.1(較多), http/2.0(將來)

  • http協議無狀態

    1. stateless 無狀態
      伺服器無法持續追蹤訪問者來源
    2. 解決http協議無狀態方法
      1. cookie:客戶端存放
      2. session:服務端存放
        多伺服器session解決方案
        1. 在排程器中記錄cookie的id,始終將其分配到第一次訪問的伺服器
        2. 讓伺服器之間複製session資訊,每臺伺服器都存放所有伺服器的session
        3. 搭專用的session伺服器(用到redis),需要實現主從,提高容錯
  • 協議檢視或分析的工具
    tcpdump,wireshark,tshark

  • http事務一次訪問的過程

    1. 請求:request

      1. HTTP請求報文圖示
        在這裡插入圖片描述
      2. request報文語法格式
        <method> <request-URL> <version>
        <
        headers> <entity-body>
    2. 響應:response

      1. HTTP響應報文圖示
        在這裡插入圖片描述
      2. response報文語法格式:
        <version> <status> <reason-phrase>
        <headers>
        
        <entity-body>
        
    3. 引數說明

      1. method (獲取伺服器支援的動作curl -i -x OPTIONS
        請求方法,標明客戶端希望伺服器對資源執行的動作GET、HEAD、POST等
        1. GET:從伺服器獲取一個資源
        2. HEAD:只從伺服器獲取文件的響應首部,相當於
        3. POST:向伺服器輸入資料,通常會再由閘道器程式繼續處理
        4. PUT:將請求的主體部分儲存在伺服器中,如上傳檔案
        5. DELETE:請求刪除伺服器上指定的文件
        6. TRACE:追蹤請求到達伺服器中間經過的代理伺服器
        7. OPTIONS:請求伺服器返回對指定資源支援使用的請求方法
      2. version
        http協議版本:HTTP/<major>.<minor>
      3. status:
        三位數字,如200,301, 302, 404, 502; 標記請求處理過程中發生的情況
      4. reason-phrase
        狀態碼所標記的狀態的簡要描述
      5. headers
        每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟一個冒號,而後跟一個可選空格,接著是一個值
      6. entity-body
        請求時附加的資料或響應時附加的資料
  • http協議狀態碼(status)分類

    1. 1xx:100-101 資訊提示
    2. 2xx:200-206 成功
      1. 200
        成功,請求資料通過響應報文的entity-body部分發送;OK
    3. 3xx:300-305 重定向
      1. 301
        請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently
      2. 302
        響應報文Location指明資源臨時新位置 Moved Temporarily
      3. 304
        客戶端發出了條件式請求,但伺服器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;客戶端上有快取,直接從快取返回結果;Not Modified
    4. 4xx:400-415 錯誤類資訊,客戶端錯誤
      1. 401
        需要輸入賬號和密碼認證方能訪問資源;Unauthorized
      2. 403
        請求被網站禁止,不是防火牆禁止訪問;Forbidden
      3. 404
        伺服器無法找到客戶端請求的資源;Not Found
    5. 5xx:500-505 錯誤類資訊,伺服器端錯誤
      1. 500
        伺服器內部錯誤;Internal Server Error
      2. 502
        代理伺服器從後端伺服器收到了一條偽響應,如無法連線到閘道器;Bad Gateway
      3. 503
        服務不可用,臨時伺服器維護或過載,伺服器無法處理請求
      4. 504
        閘道器超時 Gateway Time-out
  • HTTP 首部欄位(headers)
    首部欄位同時存在於請求和響應報文內,並涵蓋 HTTP 報文相關的內容資訊。使用首部欄位是為了給客服端和伺服器端提供報文主體大小、所使用的語言、認證資訊等內容

    1. 首部欄位結構
      HTTP 首部欄位是由首部欄位名和欄位值構成的,中間用冒號“:”分隔,欄位值對應單個 HTTP 首部欄位可以有多個值
      報文首部中出現了兩個或以上具有相同首部欄位名的首部欄位時,在規範內尚未明確,根據瀏覽器內部處理邏輯的不同,優先處理的順序可能不同,結果可能並不一致
    2. 首部的分類
      1. 通用首部
        請求報文和響應報文兩方都會使用的首部

        首部欄位 描述
        Date 報文的建立時間
        Connection 連線狀態,如keep-alive, close
        Via 顯示報文經過的中間節點(代理,閘道器),用於排除,檢視哪個快取伺服器不能訪問
        Cache-Control 控制快取,如快取時長
        MIME-Version 傳送端使用的MIME版本
        Warning 錯誤通知
      2. 請求首部
        從客戶端向伺服器端傳送請求報文時使用的首部。補充了請求的附加內容、客戶端資訊、請求內容相關優先順序等資訊

        首部欄位 描述
        Accept 通知伺服器自己可接受的媒體型別
        Accept-Charset 客戶端可接受的字符集
        Accept-Encoding 客戶端可接受編碼格式,如gzip
        Accept-Language 客戶端可接受的語言
        Client-IP 請求的客戶端IP
        Host 請求的伺服器名稱和埠號
        Referer 跳轉至當前URI的前一個URL
        User-Agent 客戶端代理,瀏覽器版本

        條件式請求首部

        首部欄位 描述
        Expect 允許客戶端列出某請求所要求的伺服器行為
        If-Modified-Since 自從指定的時間之後,請求的資源是否發生過修改
        If-Unmodified-Since 與上面相反
        If-None-Match 本地快取中儲存的文件的ETag標籤是否與伺服器文件的Etag不匹配
        If-Match 與上面相反

        安全請求首部

        首部欄位 描述
        Authorization 向伺服器傳送認證資訊,如賬號和密碼
        Cookie 客戶端向伺服器傳送cookie
        Cookie2 用於說明請求端支援的cookie版本

        代理請求首部

        首部欄位 描述
        Proxy-Authorization 向代理伺服器認證
      3. 響應首部
        從伺服器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容資訊
        資訊性

        首部欄位 描述
        Age 從最初建立開始,響應持續時長
        Server 伺服器程式軟體名稱和版本

        協商首部:某資源有多種表示方法時使用

        首部欄位 描述
        Accept-Ranges 伺服器可接受的請求範圍型別
        Vary 伺服器檢視的其它首部列表

        安全響應首部:

        首部欄位 描述
        Set-Cookie 向客戶端設定cookie
        Set-Cookie2 以上面相似
        WWW-Authenticate 來自伺服器對客戶端的質詢列表
      4. 實體首部
        針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的的資訊

        首部欄位 描述
        Allow 列出對此資源實體可使用的請求方法
        Location 告訴客戶端真正的實體位於何處
        Content-Encoding 對主體執行的編碼
        Content-Language 理解主體時最適合的語言
        Content-Length 主體的長度
        Content-Location 實體真正所處位置
        Content-Type 主體的物件型別,如text

        快取相關:

        首部欄位 描述
        ETag 實體的擴充套件標籤
        Expires 實體的過期時間
        Last-Modified 最後一次修改的時間
      5. 擴充套件首部

  • HTTP 無狀態及解決方案 Cookie
    協議自身不對請求和響應之間的通訊狀態進行儲存。也就是說在 HTTP 這個級別,協議對於傳送過的請求或響應都不做持久化處理。這是為了更快地處理大量事務,確保協議的可伸縮性,而特意把 HTTP 協議設計成如此簡單的。可是隨著 Web 的不斷髮展,很多業務都需要對通訊狀態進行儲存。於是引入了 Cookie 技術。

    1. Cookie 技術
      使用 Cookie 的狀態管理Cookie 技術通過在請求和響應報文中寫入 Cookie 資訊來控制客戶端的狀態。Cookie 會根據從伺服器端傳送的響應報文內的一個叫做 Set-Cookie 的首部欄位資訊,通知客戶端儲存Cookie。
      當下次客戶端再往該伺服器傳送請求時,客戶端會自動在請求報文中加入 Cookie 值後傳送出去。伺服器端發現客戶端傳送過來的 Cookie 後,會去檢查究竟是從哪一個客戶端發來的連線請求,然後對比伺服器上的記錄,最後得到之前的狀態資訊
      1. cookie過期時間
        1. 會話cookie
          生命期在瀏覽器會話期間,關閉瀏覽器此cookie就會消失,一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。
        2. 永續性cookie
          若設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間,儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享
      2. 安全性
        1. 隱患
          在Web應用中,Cookie常用來標記使用者或授權會話。因此,如果Web應用的Cookie被竊取,可能導致授權使用者的會話受到攻擊,例如跨站請求偽造(CSRF)

          跨站請求偽造(CSRF)
          如在不安全聊天室或論壇上的一張圖片,它實際上是一個給你銀行伺服器傳送提現的
          當你開啟含有了這張圖片的HTML頁面時,如果你之前已經登入了你的銀行帳號並且Cookie仍然有效(還沒有其它驗證步驟),你銀行裡的錢很可能會被自動轉走。

        2. 應對方法
          1. 對使用者輸入進行過濾阻止XSS
          2. 任何敏感操作都需要確認
          3. 用於敏感資訊的cookie只能擁有較短的生命期
      3. Set-Cookie首部欄位
        1. 示例
          Set-Cookie: status=enable; expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;
          
        2. 鍵值描述
          1. NAME=VALUE
            賦予 Cookie 的名稱和其值,此為必需項
          2. expires=DATE
            Cookie 的有效期,若不明確指定則預設為瀏覽器關閉前為止
          3. path=PATH
            將伺服器上的檔案目錄作為Cookie的適用物件,若不指定則預設為文件所在的檔案目錄
          4. domain=域名
            作為 Cookie 適用物件的域名,若不指定則預設為建立 Cookie的伺服器的域名
          5. Secure
            Cookie只應通過被HTTPS協議加密過的請求傳送給服務端,因為Cookie有其固有的不安全性,敏感資訊也不應該通過Cookie傳輸
          6. HttpOnly
            加以限制使 Cookie 不能被 JavaScript 指令碼訪問
        3. cookie實現過程示例
          安裝php軟體,提供httpd動態頁面處理
          [[email protected] conf]$yum install php
          
          編寫一個cookie
          [[email protected] html]$vim /var/www/html/setcookie.php
          <?php                          <==php語句塊關鍵字
          setcookie('title','cto');      <==setcookie為系統函式,用於設定cookie的鍵值對
          setcookie('name','wang',time()+3600*12);   <==time()為系統函式,表示當前時間,+3600*12表示有效期有12小時
          ?>
          
          將瀏覽器中的cookie清空,以chrome為例,設定→高階設定→內容設定→cookie→檢視所有cookie和網站資料,在網頁訪問http://localhost/setcookie.php
          http://192.168.50.107/setcookie.php	
          
          在網頁設定中檢視所有cookie和網站資料,會有如下介面,就是setcookie.php設定的cookie值
          在這裡插入圖片描述
    2. 伺服器端session
      伺服器端記錄使用者狀態的機制,使用者與伺服器建立連線的同時,伺服器會自動為其分配一個SessionId,此ID以cookie的鍵值形式傳送給使用者(key為JSSIONID,value為ID)
      session用於儲存使用者會話所需的屬性及配置資訊,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去
    3. cookie和session區別
      1. cookie是存放在客戶端,session存放在伺服器
      2. cookie通常有大小限制(常見4k)以及數量限制(部分瀏覽器為20個),session大小和硬體有關,通常沒有規定大小

2. curl工具和elinks工具

  • 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伺服器等,功能十分強大

    1. 語法格式
      curl [options] [URL…]
    2. 常用選項
      1. -A/--user-agent <string>:設定使用者代理髮送給伺服器
        1. 正常訪問網站,會在日誌檔案中記錄使用的瀏覽器
        [[email protected]  ~]$curl http://192.168.50.107
        在日誌中顯示的資訊為
        "curl/7.19.7 (x86_64-redhat-linux-gnu)"
        2. 增加-A,指定瀏覽器為IE100
        [[email protected]  ~]$curl -A 'IE100' http://192.168.50.107
        在日誌中顯示的資訊為
        "IE100"
        	```
        
      2. -e/--referer <URL>:來源網址,偽造跳轉網站
        1. 在訪問時增加-e,會偽造指定的跳轉地址
        [[email protected]  ~]$curl -A 'IE100'  -e 'www.baidu.com' http://192.168.50.107
        2. 在訪問日誌檔案referer行就會新增www.baidu.com
        "www.baidu.com" "IE100"
        
      3. --cacert <file>: CA證書 (SSL)
      4. -k/--insecure :允許忽略證書進行 SSL 連線
      5. --compressed: 要求返回是壓縮的格式,需要伺服器端支援壓縮
      6. -H/--header <line>:自定義首部資訊傳遞給伺服器
        指定主機頭HOST:www.a.com,實際訪問的為www.c.com
        [[email protected]  ~]$curl -H "host: www.c.com"  www.a.com
        
      7. -i:顯示頁面內容,包括報文首部資訊
      8. -I/--head: 只顯示響應報文首部資訊
      9. -D/--dump-header <file>:將url的header資訊存放在指定檔案中
      10. --basic: 使用HTTP基本認證
      11. -u/--user <user[:password]>:設定伺服器的使用者和密碼
      12. -L:如果有3xx響應碼,重新發請求到新位置
        1. '當訪問網站被跳轉時,使用curl正常訪問只會返回網站被跳轉資訊'
        [[email protected]  ~]$curl www.taobao.com
        <p>The requested resource resides temporarily under a different URI.</p>
        2. '加上-L會顯示跳轉後的頁面'
        [[email protected]  ~]$curl -L  www.taobao.com
        
      13. -O: 使用URL中預設的檔名儲存檔案到本地
      14. -o <file>:將網路檔案儲存為指定的檔案中,不可以下載二進位制檔案,可能會出錯
      15. --limit-rate <rate>: 設定傳輸速度
      16. -0/--http1.0: 指定使用HTTP 1.0
      17. -v/--verbose: 更詳細
      18. -C:選項可對檔案使用斷點續傳功能
      19. -c/--cookie-jar <file name>: 將url中cookie存放在指定檔案中
      20. -x/--proxy <proxyhost[:port]>:指定代理伺服器地址
      21. -X/--request <command>: 向伺服器傳送指定請求方法
        [[email protected]  ~]$curl -I -X OPTIONS 192.168.50.107
        Allow: GET,HEAD,POST,OPTIONS,TRACE
        
      22. -U/--proxy-user <user:password>: 代理伺服器使用者和密碼
      23. -T: 選項可將指定的本地檔案上傳到FTP伺服器上
      24. --data/-d:方式指定使用POST方式傳遞資料
      25. -b name=data: 從伺服器響應set-cookie得到值,返回給伺服器
  • elinks工具

    1. 安裝服務包
      yum -y install elinks
      
    2. 語法格式
      elinks [OPTION]… [URL]…
    3. 引數
      1. -dump:非互動式模式,將URL的內容輸出至標準輸出
      2. -source:列印原始碼

3. mod_deflate模組

mod_deflate模組提供DEFLATE輸出過濾器,執行在通過網路傳送到客戶端之前壓縮來自伺服器的輸出

  • 適用場景:

    1. 節約頻寬,額外消耗CPU;同時,可能有些較老瀏覽器不支援
    2. 壓縮適於壓縮的資源,例如文字檔案
  • 可以壓縮常見的基於文字的內容型別

    AddOutputFilterByType DEFLATE |text/html |text/plain |text/xml |text/css |text/javascript| application/javascript|
    
  • 檢視模組是否已載入

    [[email protected] html]$httpd -M |grep  deflate
     deflate_module (shared)   <==載入狀態
    
  • 載入模組配置方法
    LoadModule deflate_module modules/mod_deflate.so

  • 將壓縮限制為特定的MIME型別,使用AddOutputFilterByType指令

    <Directory "/your-server-root/manual">    <==授權目錄
    AddOutputFilterByType DEFLATE text/html   <==限定需要壓縮的型別
    </Directory>
    
  • 壓縮級別Level of compression (Highest 9 - Lowest 1)
    DeflateCompressionLevel 9

  • 排除特定舊版本的瀏覽器,不支援壓縮

    1. Netscape 4.x 只壓縮text/html
      BrowserMatch  ^Mozilla/4  gzip-only-text/html
      
    2. Netscape 4.06-08三個版本 不壓縮
      BrowserMatch ^Mozilla/4\.0[678] no-gzip
      
    3. Internet Explorer標識本身為“Mozilla / 4”,但實際上是能夠處理請求的壓縮。如果使用者代理首部匹配字串“MSIE”(“B”為單詞邊界”),就關閉之前定義的限制
      BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
      
  • 示例:將text/html格式的檔案輸出時壓縮壓縮,配置如下

    SetOutputFilter DEFLATE                        
    # Restrict compression to these MIME types  
    AddOutputFilterByType DEFLATE text/html     <==支援壓縮的格式,可以自定義選擇
    

4. 加密訪問https(http over ssl)

Apache一個IP地址只支援一次加密,虛擬主機FQDN方式只能加密一個

  • SSL會話的簡化過程

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

    1. 配置httpd支援使用ssl,及使用的證書,需要安裝mod_ssl,使httpd支援加密模組
      [[email protected] ~]$yum -y install mod_ssl
      
    2. 搭建私有CA(在生產中是需要向權威機構申請證書的)
      1. 在預搭建CA主機A上申請私鑰,必須放在 private/下,必須叫cakey.pem,因為有配置檔案定義,所以要按規範寫
        進入CA目錄
        [[email protected] ~]$cd /etc/pki/CA
        [[email protected] CA]$(umask 077;openssl genrsa -out private/cakey.pem 2048)
        
      2. 自簽名證書,生成的證書必須放在當前/etc/pki/CA目錄
        [[email protected] CA]$openssl req -new -x509 -key private/cakey.pem  -out cacert.pem
        
      3. 建立頒發系列號
        [[email protected] CA]$touch index.txt
        [[email protected] CA]$echo 01 > serial
        
    3. http伺服器B申請證書
      1. 在B主機上生成私鑰,然後生成證書申請
        生成證書申請檔案
        [[email protected] ssl]$openssl req -new -key httpd.key -out httpd.csr
        
      2. 將檔案拷貝到CA伺服器
        [[email protected] ssl]$scp httpd.csr 192.168.50.115:/etc/pki/CA/
        
      3. CA伺服器為B簽名,簽名後將證書傳送給B
        1. '為申請證書B簽名'
        [[email protected] CA]$openssl ca -in httpd.csr -out certs/httpd.crt
        2. '將客戶端證書和CA證書一起傳送給客戶端'
        [[email protected] CA]$scp  cacert.pem  certs/httpd.crt 	192.168.50.107:/etc/httpd/conf.d/ssl
        
    4. http伺服器拿到證書後,實現https配置
      1. 客戶端修改mod_ssl配置檔案,重啟服務
        [[email protected] ~]$vim /etc/httpd/conf.d/ssl.conf
        #   Server Certificate:
        SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt      <==修改為申請的證書存放路徑
        #   Server Private Key:
        SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key   <==修改為生成的私鑰路徑
        #   Certificate Authority (CA):
        SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem    <==去掉註釋,修改CA證書存放路徑
        
      2. 重啟服務
        [[email protected] conf.d]$systemctl restart httpd
        
  • 測試基於https訪問相應的主機

    1. 語法格式
      openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
    2. 示例
      1. 通過CA證書測試目標地址證書資訊
        [[email protected] CA]$openssl s_client  -connect 192.168.50.107:443  -CAfile cacert.pem
        
      2. 使用curl通過CA證書測試目標地址,cacert.pem為CA證書
        [[email protected] CA]$curl --cacert cacert.pem    https://www.moli.com
        
  • 安裝mod_ssl 時系統會通過指令碼,生成預設的私鑰和證書檔案

    檢視生成預設私鑰和證書的指令碼
    [[email protected] conf]$rpm -q --scripts mod_ssl
    

5. http重定向https

將http請求轉發至https的URL,https帶來的問題是併發處理能力降低

  • 在介紹內容前,先將http和https的網頁做成不同的樣式

    1. 新建一個目錄,放https主頁檔案
      1. '在/var/www/下建立ssl目錄放https的頁面檔案'
      [[email protected] www]$mkdir  /var/www/ssl
      2. '在ssl下建立一個頁面檔案index.html'
      [email protected] www]$echo /var/www/ssl/index.html > /var/www/ssl/index.html
      
    2. 修改mod_ssl配置檔案
      [[email protected] ssl]$vim /etc/httpd/conf.d/ssl.conf 
      #DocumentRoot "/var/www/html"  <==https預設的訪問頁面路徑,可以修改		
      DocumentRoot "/var/www/ssl"    <==新建一行以上項,修改為我們定義的https頁面檔案目錄
      
  • 實現重定向

    1. 配置命令
      Redirect [status] URL-path URL
    2. 引數
      status狀態:
      1. Permanent
        Returns a permanent redirect status (301) indicating that the resource has moved permanently
      2. Temp
        Returns a temporary redirect status (302). This is the default
      3. 示例:
        Redirect temp / https://192.168.50.107/
  • 實現跳轉HTTPS示例

    1. 在http配置檔案中加入跳轉命令配置
      [[email protected] ~]$vim /etc/httpd/conf.d/text.conf
      Redirect temp /  https://192.168.50.107     <==跳轉配置,只要訪問伺服器根目錄,自動跳轉到https上
      
    2. 這樣配置後,跳轉到https後,會出現儲存提示ERR_TOO_MANY_REDIRECTS,因為訪問根就會跳轉,所以跳轉到https後,又一次訪問192.168.50.107的根目錄,再次跳轉,解決此問題配置為如下內容
      1. '修改配置檔案'
      [[email protected] ~]$vim /etc/httpd/conf.d/text.conf
      RewriteEngine on                         <==啟動RewriteEngine引擎
      rewritecond   %{SERVER_PORT}  !^443      <==設定跳轉條件,介面號非443才跳轉
      RewriteRule  ^(/.*)$  https://%{HTTP_HOST}$1 [redirect=302]  <==跳轉到哪裡
      3. 重新啟動服務
      [[email protected] conf.d]$systemctl restart httpd
      
      成功跳轉到https後可以進行加密訪問,但前面的跳轉過程仍然是不加密的,有被中間人攻擊的危險,解決此問題採用的方法為HSTS
  • HSTS:HTTP Strict Transport Security

    1. 作用
      HSTS可以用來抵禦SSL剝離攻擊,只要瀏覽器曾經與伺服器建立過一次安全連線,之後瀏覽器會強制使用HTTPS,即使連結被換成了HTTP

      SSL剝離的實施方法是阻止瀏覽器與伺服器建立HTTPS連線。它的前提是使用者很少直接在位址列輸入https://,使用者總是通過點選連結或3xx重定向,從HTTP頁面進入HTTPS頁面。所以攻擊者可以在使用者訪問HTTP頁面時替換所有https://開頭的連結為http://,達到阻止HTTPS的目的

    2. HSTS實現過程
      當客戶端通過HTTPS向伺服器XXX發出請求時,在伺服器返回的超文字傳輸協議響應頭中包含Strict-Transport-Security欄位(非加密傳輸時設定的HSTS欄位無效)
      在STS欄位中定義的時間內,客戶端瀏覽器只要向伺服器XXX發起請求,瀏覽器會在內部做3XX重定向跳轉到HTTPS,而無需任何網路過程,
    3. 不足之處
      使用者首次訪問某網站是不受HSTS保護的,這是因為首次訪問時,瀏覽器還未收到HSTS,所以仍有可能通過明文HTTP來訪問
    4. 解決方案為HSTS preload list(HSTS預列表)
      1. HSTS preload list
        此列表將世界上目前有的https網站都收錄起來,載入到瀏覽器中,方便使用者第一次訪問網站時直接加密訪問,是Chrome瀏覽器中的HSTS預載入列表,在該列表中的網站,使用Chrome瀏覽器訪問時,會自動轉換成HTTPS,Firefox、Safari、Edge瀏覽器也會採用這個列表
      2. 將HSTS資訊加入到域名系統記錄中
        需要保證DNS的安全性,也就是需要部署域名系統安全擴充套件。截至2014年這一方案沒有大規模部署

6. httpd自帶的工具程式和壓力測試工具

  • httpd自帶工具
    1. htpasswd
      basic認證基於檔案實現時,用到的賬號密碼檔案生成工具
    2. apachectl
      httpd自帶的服務控制指令碼,支援start和stop
      [[email protected] ~]$apachectl stop
      [[email protected] ~]$apachectl start
      
    3. rotatelogs
      日誌滾動工具,當系統檔案過大時讓其生成一個新的檔案,可以確保日誌的完整性
      access.log -->
      access.log, access.1.log -->
      access.log, acccess.1.log, access.2.log
  • httpd的壓力測試工具
    1. 常見測試工具
      ab, webbench, http_load,seige,Jmeter (開源),Loadrunner (商業),tcpcopy(網易,複製生產環境中的真實請求,並將之儲存)
    2. ab工具介紹:來自httpd-tools包,不可以在線上做壓測,在測試環境就測好了
      正常壓測過程中,開啟一個網頁不能超過3秒,測試結果的支援併發數按80%取
      跨併發測試,每種壓測至少要測3次以上,取平均值
      ab測試只有參考價值,沒有實際意義,因為只請求了一個URL
      一個伺服器如果對靜態資源只能承載10000個,那麼對於動態資源可能要少於1000
      1. 語法格式
        ab [OPTIONS] URL
      2. 常用引數
        -n:總請求數
        -c:模擬的並行數,每一個併發對應一個客戶端,一個客戶端就需要一個套接字,一個套接字對應一個檔案,一個檔案對應一個檔案描述符,而linux預設一個程式開啟的檔案上限為1024個
        -k:以持久連線模式測試
      3. 示例,測試條件超出系統範圍解決方法
        [[email protected] ~]$ab -c 1000 -n 1500 http://192.168.50.115/
        socket: Too many open files (24)
        
        解決辦法,修改系統檔案設定值
        1. '檢視系統當前檔案管理設定值'
        [[email protected] ~]$ulimit -a   <==查詢所有
        [[email protected] ~]$ulimit -n   <==查詢單項
        2. '調整值大小'
        [[email protected] ~]$ulimit -n 2000
        
      4. 示例,壓測輸出資訊
[[email protected] conf.d]$ab -c 50 -n 100 http://192.168.50.107/

...省略
Server Software:        Apache/2.4.6     <==伺服器程式版本號
Server Hostname:        192.168.50.107   <==請求的主機名稱
Server Port:            80    			 <==伺服器對應埠

Document Path:          /    			 <==壓測時的URL
Document Length:        5 bytes    		 <==URL對應相應內容的長度

Concurrency Level:      50      		 <==併發數
Time taken for tests:   0.023 seconds    <==整體測試時間
Complete requests:      100       		 <==整體完成相應請求數
Failed requests:        0			     <==錯誤的請求數	
Write errors:           0		    	 <==相應錯誤數
Total transferred:      27400 bytes      <==整體位元組數
HTML transferred:       500 bytes		          <==HTML佔了多少內容,上面那個是帶首部的總體大小
Requests per second:    4359.58 [#/sec] (mean)    <==每秒處理請求數
Time per request:       11.469 [ms] (mean)    	  <==平均每組請求所有時間
Time per request:       0.229 [ms] (mean, across all concurrent requests)     <==每個請求平均用時
Transfer rate:          1166.53 [Kbytes/sec] received    <==傳輸速率

Connection Times (ms)
              min   mean[+/-sd] median   max
			最少用時   平均值      中間值   最慢用時
Connect:        0     1   1.0      2       3
連線建立
Processing:     1     7   2.4      8      10
處理請求
Waiting:        1     7   2.5      8      10
等待將請求報文傳送給客戶端接收完成
Total:          4     8   1.8      9      12
整體完成
Percentage of the requests served within a certain time (ms)
  50%      9
  66%      9
  75%     10
  80%     10
  90%     10
  95%     11
  98%     11
  99%     12
 100%     12 (longest request)

7. httpd-2.4較2.2的改變

  • 新增特性
    1. MPM支援執行為DSO機制;以模組形式按需載入
    2. event MPM生產環境可用
    3. 非同步讀寫機制
    4. 支援每模組及每目錄的單獨日誌級別定義
    5. 每請求相關的專用配置
    6. 增強版的表示式分析式
    7. 毫秒級持久連線時長定義
    8. 基於FQDN的虛擬主機不需要NameVirutalHost指令
    9. 新指令,AllowOverrideList
    10. 支援使用者自定義變數
    11. 更低的記憶體消耗
  • 修改了一些配置機制
    不再支援使用Order, Deny, Allow來做基於IP的訪問控制
    1. 新模組
      1. mod_proxy_fcgi
        支援FastCGI Protocol
      2. mod_remoteip
        用反向代理的IP地址代替遠端客戶機的IP
      3. mod_ratelimit
        提供頻寬控制
    2. 基於IP的訪問控制:
      1. 無明確授權的目錄,預設拒絕
      2. 允許所有主機訪問:Require all granted
      3. 拒絕所有主機訪問:Require all denied
      4. 控制特定的IP訪問:
        1. 先授權指定來源的IP訪問:Require ip IPADDR
        2. 再拒絕特定的IP訪問:Require not ip IPADDR
      5. 控制特定的主機訪問:
        1. 授權特定主機訪問:Require host HOSTNAME
        2. 拒絕 HOSTNAME:Require not host HOSTNAME
        3. 特定主機:FQDN
        4. 指定域名下的所有主機:domin.tld
    3. 虛擬主機
      基於FQDN的虛擬主機不再需要NameVirutalHost指令
      <VirtualHost *:80>
      ServerName www.b.net
      DocumentRoot "/apps/b.net/htdocs"
      <Directory "/apps/b.net/htdocs">
      Options None
      AllowOverride None
      Require all granted
      </Directory>
      </VirtualHost>
      
      注意:任意目錄下的頁面只有顯式授權才能被訪問
    4. KeepAlive on
      毫秒級持久連線時長定義
      KeepAliveTimeout #ms
      MaxKeepAliveRequests 100

8. Sendfile機制

  • 不用 sendfile 的傳統網路傳輸過程(需要經歷4次I/O過程)
    1. 過程
      1. 網路I\O連線過程,通過網絡卡接收請求存放在網絡卡buffer,接收完成後傳送給核心,暫存在核心buffer當中
      2. 核心解封裝後找到監聽埠,轉發給程序
      3. 程序分析使用者請求後,要通過核心讀取磁碟拿到網頁檔案,也就是磁碟I/O過程
      4. 核心讀取磁碟檔案,需要將資料載入到核心的記憶體空間,載入完成後再發送個使用者空間的程序(此過程很慢,程序將大量時間耗在等待)
      5. 應用程式程序處理資料,新增頭部資訊,形成新的迴應報文,傳送給核心,在通過網絡卡傳回給使用者
    2. 4次I/O
      硬碟 >> kernel buffer >> user buffer >> kernel socket buffer >> 協議棧
      一般網路應用通過讀硬碟資料,寫資料到 socket 來完成網路傳輸,底層執行過程:
      1. 系統呼叫 read() 產生一個上下文切換:從 user mode 切換到 kernel mode,然後 DMA 執行拷貝,把檔案資料從硬碟讀到一個 kernel buffer 裡。
      2. 資料從 kernel buffer 拷貝到 user buffer,然後系統呼叫 read() 返回,這時又產生一個上下文切換:從kernel mode 切換到 user mode
      3. 系統呼叫 write() 產生一個上下文切換:從 user mode 切換到 kernel mode,然後把步驟2讀到 user buffer 的資料拷貝到 kernel buffer(資料第2次拷貝到 kernel buffer),不過這次是個不同的 kernel buffer,這個 buffer和 socket 相關聯。
      4. 系統呼叫 write() 返回,產生一個上下文切換:從 kernel mode 切換到 user mode(第4次切換),然後DMA從 kernel buffer 拷貝資料到協議棧(第4次拷貝)
  • Sendfile機制
    在kernel 2.0+ 版本中,系統呼叫 sendfile() 就是用來簡化上面步驟提升效能的。sendfile() 不但能減少切換次數而且還能減少拷貝次數
    用 sendfile() 來進行網路傳輸的過程:sendfile(socket, file, len)
    硬碟 >> kernel buffer (快速拷貝到kernel socket buffer) >> 協議棧
    1. 系統呼叫 sendfile() 通過 DMA 把硬碟資料拷貝到 kernel buffer,然後資料被 kernel 直接拷貝到另外一個與 socket 相關的 kernel buffer。這裡沒有 user mode 和 kernel mode 之間的切換,在 kernel 中直接完成了從一個 buffer 到另一個 buffer 的拷貝
    2. DMA 把資料從 kernel buffer 直接拷貝給協議棧,沒有切換,也不需要資料從 user mode 拷貝到 kernel mode,因為資料就在 kernel 裡
  • 不支援Sendfile的場景
    伺服器上的資料是通過其他伺服器獲取的,也就是說使用者訪問的資料不在本機磁碟中

反向代理功能

編譯安裝httpd-2.4

  • 安裝httpd-2.4需要的原始碼

    1. httpd-2.4原始碼:httpd-2.4.34.tar.bz2
    2. arp可移植執行庫原始碼:apr-1.6.3.tar.gz、apr-util-1.6.1.tar.gz
  • 安裝前準備開發包:

    1. 開發環境包組:Development Tools,Server
    2. 依賴包:pcre-devel openssl-devel expat-devel
  • APR(Apache portable Run-time libraries,Apache可移植執行庫)

    1. 作用
      主要為上層的應用程式提供一個可以跨越多作業系統平臺使用的底層支援介面庫
    2. 為何開發
      在早期的Apache版本中,應用程式本身必須能夠處理各種具體作業系統平臺的細節,並針對不同的平臺呼叫不同的處理函式
      隨著Apache的進一步開發,Apache組織決定將這些通用的函式獨立出來並發展成為一個新的專案。這樣,APR的開發就從Apache中獨立出來,Apache僅僅是使用 APR而已。目前APR主要還是由Apache使用,由於APR的較好的移植性,因此一些需要進行移植的C程式也開始使用APR,開源專案比如用於伺服器壓力測試的Flood loader tester,該專案不僅僅適用於Apache
    3. 參考
      http://httpd.apache.org/test/flood
  • 編譯安裝httpd-2.4方法

    1. 方法一,將核心與介面分別編譯
      1. 編譯安裝apr-1.4+
        1. 進入apr解壓目錄:cd apr-1.6.2
        2. 編譯:./configure --prefix=/app/apr
        3. 構造並安裝:make && make install
      2. 編譯安裝apr-util-1.4+
        1. 進入apr-util解壓目錄:cd …/apr-util-1.6.0
        2. 編譯:./configure --prefix=/app/apr-util --with-apr=/app/apr/
        3. 構造並安裝make -j 2 && make install
      3. 編譯安裝httpd-2.4
        1. 進入httpd解壓目錄:cd …/httpd-2.4.27
        2. 編譯:./configure --prefix=/app/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/app/apr/ --with-apr-util=/app/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
        3. 構造並安裝:make -j 4 && make install
    2. 方法二,放在一起編譯
      1. 安裝開發包組
        [[em