Linux之http協議及apache

http協議及Apache服務

http協議

什么是http?

http全稱為超文件傳輸協議(Hyper text transfer protocol),其是一個應用層協議,基于tcp的80端口,一般使用ASCII編碼傳輸。http協議是無狀態的(stateless),即服務器無法追蹤訪問者來源. 其可以使用cokie機制來追蹤同一個用戶.

Cookie的追蹤用戶的原理

第一次方訪問服務時,服務器發送一個cookie的小數據(隨機數,用來標識客戶端身份), 客戶端會將其保存下來,隨后 , 訪問同一個站點時,會把應用于此站點的cookie提交給服務器,從而服務器就能識別客戶端身份.

  • 胖Cookie的實現原理
    將用戶會話及狀態信息都保存至客戶端本地,在請求數據時,將狀態信息回傳至服務器
  • 瘦cookie + session的實現原理
    將用戶的狀態信息都保存至服務器端,并與相應客戶端的cookie令牌相對應,請求數據的時候,只是需向告訴服務器自己的cookie信息.

什么是超文本?

使用html(Hyper text mark language)編程語言編寫,被稱為文本標記語言。大致格式如下:

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1></h1>
        <h2></h2>
            <p>正文<a href="www.magedu.com/download.html">正文</a></p>
        <h2></h2>
    </body>
</html>

http協議版本

  • http 0.9 : 原型版本,功能簡單,只添加了GET的方法
  • http 1.0 :增加cache,MIME,Method,長連接等功能
    • MIME : multipurpose internet mail extesion(多用途郵件傳輸擴展協議,實現文本傳輸能添加非文本數據等附加),其原理為,將非文件數據在傳輸前重新編碼為文件格式再傳輸,接收方能夠用相反的方式將其重新還原的格式,同時能夠調用相應的程序打開此文件
    • 常見的method : 客戶端請求數據的方法:
      • GET : 從服務器獲取一個資源,通常不包含主體(entiy-body), 其為安全的方法
      • POST : 向服務器發送服務器要處理的數據,通常包含主體(entiy-body),通常向服務器發送HTML的表單數據.
      • HEAD: 只從服務器獲取文檔的響應首部,不包含entiy-body,其為安全的方法.
      • PUT : 將請求的主體部分直接存儲在服務器上, 包含entiy-body,如果上傳的文檔已經存在,就用這個主體替代它.
      • DELETE : 請求刪除服務器上指定URL的文檔,通常服務器不會返回刪除成功或是失敗的消息通知.,不包含主體.
      • TRACE : 追蹤請求到達服務器中間經過的代理服務器,由服務器發回一個trace響應,通常不包含主體
      • OPTIONS : 請求獲得可以在服務器上執行那些方法,或者對某些特殊資源支持那些方法,通常不包含主體
    • 擴展方法:
      • lock : 允許用戶鎖定資源,可以在編輯某個資源的時候將其鎖定,以防止別人同時對其進行修改
      • mkcol : 允許用戶創建資源
      • copy : 便于在服務器上復制資源
      • move : 在服務器上移動資源
  • http 1.1 : 其增加了緩存功能,是目前被廣泛使用的標準
  • http 2.0 : 借用Google開放的html協議標準spdy,改進的版本

http的工作模式

  • http請求報文(http request):格式如下:

      <method><request-URL><version> #獲取方法 請求的資源 http協議版本
      <headers> #http協議首部
                #空白行
      <entity-body> #報文主體
                #空白行
    
  • http響應報文(http response)

      <version><status><reason-phrase> #http版本 狀態碼 
      <headers>  #響應報文首部
                  #空白行
      <entity-body>
                  #空白行
    
報文示例:
  • 請求報文
      GET / HTTP/1.1 
      Host:www.zhenping.me
      Connection:keep-aliv #連接方式為長連接
                            #空白行
    
  • 響應報文
      HTTP/1.1 200 OK
      X-powered-By:PHP/5.2.17 # 說明是一個PHP動態網頁
      Vary : Accept-Encodeing,cookie,User-Agent
      Cache-Control:max-age=3,must-revalidate
      Content-Encoding:gzip :網頁壓縮技術
      Content-Length:6931 :網頁長度
                          #空白行
    
手動模擬一個http請求會話:
telnet 172.16.36.60 80
Trying 172.16.36.60...
Connected to www.a.com.
Escape character is '^]'.
GET /index.html HTTP/1.1   #輸入獲取方法 請求的url 使用的協議
host:www.a.com              #指定主機
                            #兩次回車
HTTP/1.1 200 OK
Date: Tue, 12 Jan 2016 04:29:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 11 Jan 2016 11:41:51 GMT
ETag: "e000f-13-5290d6c437a91"
Accept-Ranges: bytes
Content-Length: 19
Connection: close
Content-Type: text/html; charset=UTF-8

<h1>www.a.com</h1>
Connection closed by foreign host.          
http的狀態碼:
  • 1XX : 純信息(100-101)
    • 100 : continue,說明收到了請求的初始部分,請客戶端繼續
    • 101 : switching protocols,說明服務器正在根據客戶端的指定,將協議切換成update首部所列的協議
  • 2XX : 成功類的狀態信息(200-206)
    • 200 : OK,請求沒有問題,實體的主體部分包含了所請求的資源
  • 3XX : 重定向類的信息(300-305)
    • 301 : 永久重定向
    • 302 : 臨時重定向
    • 304 : 內容沒有發生改變,使用緩存(客戶端發出了條件式請求,但服務器上的資源未發生改變,則通過)
  • 4XX : 客戶端錯誤類的信息(400-415)
    • 400 : 用于告知客戶端發送了一個錯誤的請求
    • 401 : unauthorized,未授權,訪問前需要對用戶認證
    • 403 : forbidden,請求服務器拒絕,服務器不想說明拒絕原因的時候使用
    • 404 : not found, 不存在的文件
    • 405 : Method not allowed , 發起的請求不支持的方法
  • 5XX : 服務器端錯誤類的信息
    • 500 : internal server error,服務器內部錯誤
    • 502 : bad gateway ,無法連接至其父網關
    • 504 : gateway timeout, 服務器連接超時

http報文首部

  • 通用首部
    • Date : 報文的創建時間
    • connection : 連接方式,如keepalive, close.
    • Via : 顯示報文經過的中間節點(via本意為:經由)
    • Cache-control : 控制緩存
    • pragma : 跟緩存相關,為了兼容1.0版本
    • MIME-version : 給出發送端使用的MIME版本
    • trailer : 如果報文采用分塊傳輸編碼方式,就可以用這個首部列出位于報文拖掛部分
    • Transfer-Encoding : 告知接收端為了保證報文可選傳輸,對報文采用的編碼方式
    • Update : 給出發送端可能想要"升級"使用新的版本或協議
  • 請求首部
    • accept : 通知服務器自己可接受的媒體類型
    • Accept-charset : 接收的字符集
    • Accept-Encoding : 接收內容編碼格式(如壓縮格式)
    • Accept-Language : 接收的語言
    • Accept-Length :實體主體數據包含了多少字節數據
    • Accept-type : 實體主體數據是什么類型
    • From : 提供了客戶端用戶的Email地址
    • Client-ip : 客戶端IP地址
    • Host : 請求服務器名稱和端口號
    • Referer : 包含了當前正在請求的資源上一級資源(由那跳轉過來的)
    • User-agent:瀏覽器類型
      • 條件式請求首部
        • Expect : 允許客戶端列出某請求所要求的服務器行為
        • If-modified-since : 請求的數據如果晚于此修改時間,服務器將發回新文件
        • If-unmodified-sinec : 除非在某個指定日期之后資源沒有被修改過, 否則就限制這個請求
        • If-none-match:本地緩存中存儲的文檔中的ETag標簽是否與服務端文檔的ETag不匹配(如果提供的實體標記與當前文檔的實體標記不相符,就獲取文檔)
        • If-Match : 如果實體標記與文檔當前實體標記相匹配,就獲取這份文檔
        • If-range : 允許對文檔的某范圍進行條件請求
        • Range : 如果服務器支持范圍請求,就請求資源的指定范圍
      • 安全請求首部
        • authorization : 向服務器發送認證信息,如帳號密碼
        • Cookie : 客戶端向服務器發送cookie
        • cooki2 : cookie的版本2
      • 代理請求首部
        • proxy-authorization : 向代理服務器認證
        • proxy-connection : 與connection首部相同,但這個首部是在與代理建立連接時使用
        • max-forward : 在通往源服務器的路徑上,將請求轉發給其它代理網關的最大次數---與trace方法一周使用
  • 響應首部
    • 信息性
      • Age: 響應持續時長
      • Server : 服務器程序軟件名稱和版本
      • date : 服務器產生報文的時間
      • Content-length : 實體主體數據包含了多少字節數據
      • Content-type : 實體數據是什么類型
      • Location : 重定向的連接
      • Public : 服務器為其資源支持的請求方法列表
      • Retry-after : 如果資源不可用的話,就在此時間或日期重試
      • Title : 對HTML文檔來說,就是HTML文檔的源端給出標題
      • Warning : 對原因短語中更詳細的一些警告報文
    • 協商首部(某資源有多種表示方法時使用)
      • Accept-Ranges : 服務器可接受的請求范圍類型
      • Vary : 服務器查看的其它首部列表
    • 安全響應
      • set-cookie : 不是真正的安全首部,但隱含有安全功能,可以在客戶端設置一個令牌,以便服務器對客戶端進行標識
      • set-cookie2 : 與set-cookie類似
      • www-authenticate : 來自服務器對客戶端的質詢認證表單
      • Porxy-Authenticate : 來自代理的對客戶端的質詢列表
  • 實體首部
    • Allow : 列出對些實體可使用的請求方法
    • Location : 告訴客戶端真正的實體位于何處,重定向時使用
  • 內容首部
    • Content-base : 解析主體中相對URL時使用的基礎URL
    • Content-Encoding : 內容的編碼格式
    • Content-Language : 理解主體時最適宜使用的自然語言
    • Content-length : 主體的長度或尺寸
    • Content-Location : 實體真正所處位置
    • Content-md5 : 主體的MD5校驗和
    • Content-range : 在整個資源中些實體表示的字節范圍
    • Content-Type : 主體的對象類型
      • 緩存相關
        • ETag : 實體的擴展標簽
        • Expires : 實體的過期時間,實體不再有效,要從原始的源端再次獲取此實體的日期和時間
        • Last-Modified : 最后一次修改時間和日期
  • 擴展首部

什么是keep-alive?

其被稱之為長連接,由于http基于tcp協議通信,每個資源的請求都需要建立一個會話的虛擬通道,如果對于并發大的服務器來講,高頻的TCP會議建立和拆除將消耗更多的系統開銷,故長連接可以實現tcp協議通信建立后,在允許的機制下,進行多個資源請求獲取,當服務端設定的條件達到時,將斷開與客戶端的TCP連接。

keep-alive的控制機制
  • 空閑超時機制(httpd2.2版本以秒為單位,httpd2.4可以以毫秒為單位)

  • 請求次數限制

      注意:在高并發的應用場景中,空閑超時機制將會導致后面用戶的請求進行掛起操作,以導致訪問慢的情況。故時間需要測試而設定,并且對請求次數進行設定,這樣可以避免高并發的情況中,用戶的請求長時間連接,而新的用戶請求一直得不到處理。 空閑超時機制在低并發的應用場景中, 可以加速用戶的訪問請求。
    
實現步驟

client發起請求并與server建立Tcp的連接,進行數據傳輸,當client的資源請求完成后,通知服務端斷開連接,服務端并予ack報文,并不發送fin報文,此時連接將處理半連接狀態,服務器會檢查httpd的keep-alive參數設置的兩個條件:1、如果半連接空閑時間超出keep-alive設定的值,將主動斷開連接 ;2、當客戶端請求的資源次數達到httpd的參數設置,也將會主動斷開連接。

客戶端瀏覽器加速訪問的機制

  • 1、多線程請求,同時打開不同的資源
  • 2、靜態內容進行緩存

web資源的類型:

  • 1、靜態資源
    • 無需服務器做出額外處理,一般內容格式為:
      • jpg,png,gif,html,txt,js,css,mp3,avi等
  • 2、動態資源
    • 服務端需要通過執行程序做出處理,并發送給客戶端程序的運行結果,一般格式為:
      • php,jsp

服務端完整的HTTP請求處理過程

  • 1、建立和處理連接(接收請求或拒絕請求)
  • 2、接收請求:通過網絡讀取HTTP請求報文
  • 3、處理請求:解析請求報文并做出相應的動作
  • 4、訪問資源:訪問請求報文中相應的資源
  • 5、構建響應報文:使用正確的首部生成http響應報文
  • 6、發送響應:向客戶端發送生成的響應報文
  • 7、記錄日志:當已經完成的http事務記錄進日志文件
HTTP的訪問歸類:
  • 1、PV(Page view),頁面的訪問量,其在訪問日志中的URL字段中第二個位置
  • 2、UV(User view),用戶的訪問量,以IP訪問數量來統計,其在訪問日志中的第一個字段

服務端接收請求的模型

1、單進程I/O模型

啟動一個進程處理用戶請求,這意味著,一次只能處理一個請求,多個請求被串形響應

2、多進程I/O模型

每個請求都有一個獨立的進程來響應,并行啟動多個進程,每個進程響應一個請求

3、復用的I/O模型(必須要有多路IO管理機制)
  • 1、多線程模式
    • 一個進程生成N個線程,一個線程處理一個請求,其能生成的線程也是有限定的
  • 2、事件驅動
    • 一個進程直接響應N個請求,不用啟動線程
4、利用的多進程I/O結構

啟動M個進程,每個進程生成N個線程

http服務的實現軟件

  • 1、服務程序
    • httpd
    • nginx
    • lighttpd
    • thttpd
  • 2、應用程序服務器
    • IIS :(windwos .net)
    • tomcat :(apache,JSP,open source)
    • websphere : (IBM,JSP,commodity)
    • weblogic : (Oracle,JSP,commodity)
    • JBoos : (readhat,open source,commidity,核心是tomcat)

httpd服務程序

httpd簡介

httpd是apache基金會(ASF:apache foundation)維護,其官網為httpd.apache.org,其基金會下有眾多的著名軟件。

http的版本
  • httpd 1.3
  • httpd 2.0
  • httpd 2.2 (Centos 6平臺的默認版本,其event模型仍為測試模型)
  • httpd 2.4(Centos 7平臺的默認版本,目前最新穩定版本,對event可用于生產環境中)
httpd的功能特性
  • 1、CGI(Common Gateway Interface)

  • 2、虛擬主機

    • IP
    • PORT
    • FQDN
  • 3、支持反向代理

  • 4、負載均衡

  • 5、路徑別名

  • 6、豐富的用戶認證機制

    • basic :基本身份認證
    • digest : 摘要身份認證
  • 7、支持第三方模塊

  • 8、高度模塊化

  • 9、動態模塊加載(DSO,Dynamic shared object)

  • 10、多路處理模塊(MPM,Multipath processing modules)

    • prefork : 多進程模型,每個進程響應一個請求,特性如下:
      • 工作模型
        • a) 有一個主進程,其負責生成子進程及回收子進程,負責創建套接字,負責接收請求,并將其派發給某子進程處理
        • b) 多個子進程,每個子進程處理一個請求,主進程不負責接收請求
        • c) 會預先生成幾個空置的進程,隨時等待用于響應用戶請求,其預先定義最大空閑和最小空閑
    • worker : 多進程多線程模型,每個線程處理一個用戶請求,特性如下:
      • 工作模型
        • a) 有一個主進程,其負責生成子進程及回收子進程,負責創建套接字,負責接收請求,并將其派發給某子進程處理
        • b) 每個子進程負責生成多個線程,每個線程負責響應用戶請求
    • event : 事件驅動機制,事件驅動模型,多進程模型,每個進程響應多個請求
      • 工作模型
        • a) 有一個主進程,其負責生成子進程及回收子進程,負責創建套接字,負責接收請求,并將其派發給某子進程處理
        • b) 子進程基于事件驅動機制直接響應多個請求
  • 11、支持https協議,由mod_ssl模塊提供

  • 12、支持用戶認證

    • 簡單認證
    • 摘要認證
    • 基于表單認證
  • 13、訪問控制機制

    • 基于IP或主機名的訪問控制
    • 基于每目錄的訪問控制

HTTPD的配置文件

1、httpd-2.2的版本(Centos 6)
  • 配置文件
    • /etc/httpd/conf/httpd.conf
    • /etc/httpd/conf.d/*.conf
  • 服務腳本
    • /etc/rc.d/init.d/httpd
  • 腳本配置文件
    • /etc/sysconfig/httpd
  • 主程序文件
    • /usr/sbin/httpd
    • /usr/sbin/httpd.event
    • /usr/sbin/httpd/worker
  • 日志文件
    • /var/log/httpd/access_log
    • /var/log/httpd/error_log
  • 站點文檔
    • /var/www/html
  • 模塊文件路徑
    • /usr/lib64/httpd/modules
  • 網站文件存放路徑
    • /var/www/html : 靜態網頁存放路徑
    • /var/www/cgi-bin : 動態網頁存放路徑
  • 服務控制和啟動
    • service httpd on|off
    • service {start|stop|restart|status|configtest|reload} httpd
2、httpd-2.4的版本(Centos 7)
  • 配置文件
    • /etc/httpd/conf/httpd.conf
    • /etc/httpd/conf.d/*.conf
    • /etc/httpd/conf.modules.d/*.conf : 模塊相關的配置文件
    • /usr/lib/systemd/system/httpd.service
  • 主程序文件
    • /usr/sbin/httpd : 2.4版本支持MPM的動態切換
  • 日志文件
    • /var/log/httpd/access_log
    • /var/log/httpd/error_log
  • 站點文檔
    • /var/www/html
  • 模塊文件路徑
    • /usr/lib64/httpd/modules
  • 網站文件存放路徑
    • /var/www/html : 靜態網頁存放路徑
    • /var/www/cgi-bin : 動態網頁存放路徑
  • 服務控制
    • systemctl enable | disable httpd.service
    • systemctl {start|stop|restart|status} httpd.service

HTTPD的進程

1、主進程的屬主和屬組

root:root

2、子進程或工作進程

apache:apache

HTTPD主配置文件

主配置文件的選項
  • 1、全局配置段:影響apache的全局配置選項
  • 2、中心主機配置段
  • 3、虛擬主機配置段
主配置文件的格式
  • 指令 + 值
    • 指令:不區分大小寫
    • 值:在為路徑時,是否區分大小寫,取決于文件系統
常用配置選項
  • 1、修改監聽的IP和PORT

    • 格式:Listen [IP:] PORT
      • a) 省略IP表示0.0.0.0

      • b) Listen指令可復現出現多次

          Listen 80
          Listen 8080
          Listen 172.16.0.1:80
        
      • c) 修改監聽的socket,中有重啟服務進程方可有效

  • 2、持久連接功能

    • TCP連接建立后,每個資源獲取完成后,不會斷開連接,而是繼續等待其它資源請求的進行,如何斷開 ?
      • a) 數量限制

      • b) 時間限制

          KeepAlive on | off
          KeepAlive Timeout 15
          MaxKeepAliveRequests 100
          
          
          注意:副作用:對并發訪問量較大的服務器,長連接機制會使得后續某些請求無法得到正常響應。折衷處理:使用較短的持久連接時長,以及較少的請求數量
        
  • 3、MPM
    修改2.2版本中的MPM機制,需要修改/etc/sysconfig/httpd中,啟用HTTPD=/usr/sbin/httpd.worker或者指定其它的MPM模塊,需要重啟服務方可生效。

    • prefork的配置

        <IfModule prefork.c>   
        StartServers        8  #啟動時啟動多少個進程
        MinSpareServer      5   #最少空閑進程
        MaxSpareServers   20    #最大空閑進程
        ServerLimit      256    #最大啟動多少個進程數,可大于maxclients
        MaxClients       256    #最大進程在線數量,不能大于serverlimit
        MaxRequestsPerChild  4000 #表示每個進程最多處理多少個請求,達到數量時由主進程銷毀
        </IfModule>
      
    • worker的配置

        <IfModule worker.c>
        StartServers         4
        MaxClients         300
        MinSpareThreads     25
        MaxSpareThreads     75
        ThreadsPerChild     25
        MaxRequestsPerChild  0  #0表示不啟用
        </IfModule>
      
  • 4、配置指定實現模塊加載

    • 1、定義格式

        LoadModule <mod_name> <mode_path>
      
    • 2、使用相對路徑,是相對于serverroot,默認為/etc/httpd

  • 5、定義中心主機"Main server"的文檔頁面路徑

    • 1、定義格式

        DocumentRoot "/var/www/html"
      
    • 2、文檔路徑映射

      • DocumentRoot指向的路徑為URL路徑的起始位置,相當于站點URL的根路徑
  • 6、站點訪問控制定義方法

    • 1、基于文件系統路徑

        方法一:
        <Directory "/PATH">
        ......
        </Directory>
        
        方法二
        <File "/PATH">
        ......
        </File>
        
        方法二
        <FileMatch "PATTERN">
        .....
        </FileMatch>   #以模式匹配,需要啟動正則表達式引擎,其效率低
      
    • 2、基于URL

        方法一:
        <Location "/">
        ......
        </Location>
        
        方法二:
        <LocationMatch "/">
        ......
        </LocationMatch>
      
  • 7、站點訪問控制設定

    • 1、基于IP方式實現控制

        <Location /server-status>
        SetHandler server-status
        order deny,allow   #定義生效次序
        deny from all
        allow from 172.16.249.148
        </Location>
        
        ##注意:
        來源地址定義格式,可如下方式:
        172.16
        172.16.0.0
        172.16.0.0/16
        172.16.0.0/255.255.255.0
      
    • 2、基于用戶名和密碼方式實現控制

        <Directory "/www/b.com/htdocs">
            Options None            #可以定義多個,使用空格分開,None表示不定義
            AllowOverride None   #是否允許覆蓋,覆蓋面面order或者auth的認證,None表示不定義
            AuthType Basic      #認證類型
            AuthName "Please Enter your username and password."    #認證提示
            AuthUserFile "/etc/httpd/conf/.htpass"            #用戶和密碼存放路徑
            AuthGroupFile "/etc/httpd/conf/.htpass_group"     #用戶組的定義存放路徑
            Require group mygrp     #允許mygrp組中的用戶
                或者只是定義用戶,不定義組
            AuthType Basic      #認證類型
            AuthName "Please Enter your username and password."    #認證提示
            AuthUserFile "/etc/httpd/conf/.htpass"            #用戶和密碼存放路徑
            Require user zhenping    #只允許用戶zhenping登錄,多個用戶可以使用空格隔開
        </Directory>
        
        注意1:如果需要定義的所有用戶都可以訪問,需使用:
            Require valid-user
        
        注意2:認證方式有兩種:
                basic :明文
                digest : 消息摘要認證
        注意3:用戶及密碼的存儲方式
                文本文件
                SQL數據庫
                Ldap目錄服務
        注意4:組文件定義格式
                GROUP_NAME: group1 group2
                
        注意4:用戶名的密碼需要使用htpasswd工具來創建,如下格式:
            
            htpasswd -c -m /etc/httpd/conf/.htpasswd tom
                Options:
                        -c : 自動創建加密文件,一般用于第一次
                        -D : 刪除用戶
                        -m : 以MD5格式加密
                        -s : 以sha格式加密
      
      • Options的各參數說明:

          Index:定義索引,索引是指列出目錄下所有的文件
          None:不支持任何選項
          FollowSymLinks:跟隨符號連接,意味訪問符號連接所指向的文件,會降低服務器的性能
          Includes:允許執行服務器端包含(SSI),此方式不安全
          SymLinksifOwnerMatch:允許執行符號連接,但屬主必須與執行httpd進程的屬主相匹配,不                               開放
          ExecCGI:允許執行CGI腳本
          MultiViews:判斷客戶端使用的語言,并顯示相應語言的網頁,一般比較消耗資源
          ALL:啟用所有選項
        
  • 8、定義站點主頁

    • 1、定義格式

        DocumentRoot "/www/htdocs"
      
    • 2、未定義的錯誤提示

      • 404 Not Found錯誤
      • 顯示目錄下的所有文件
  • 9、定義路徑別名

    • 1、定義格式
      • alias /URL/ "/PATH"

          alias /download/ "/rpms/pub"  #后者為文件系統路徑
        
  • 10、定義默認字符集

    • 1、定義格式

        AddDefaultCharset UTF8
        
        可支持的中文字符集:GBK,GB2312,GB18030
      
  • 11、日志設定

    • 1、錯誤日志的定義格式

        ErroLog logs/error_log
        LogLevel warn
        
        ##日志等級為:
        Debug
        Info
        notice
        Warn
        Error
        Crit
        Alert
        Emerg
      
    • 2、訪問日志的定義格式

        CustomLog logs/access_log combined #combined為日志格式
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
        LogFormat "%h %l %u %t \"%r\" %>s %b" common 
        LogFormat "%{Referer}i -> %U" referer 
        LogFormat "%{User-agent}i" agent
        
        
        #其宏定義的格式:
        %h :客戶端的IP地址
        %l :遠程登陸的用戶名,通常為一個減號“-”
        %u :遠程登陸的用戶(from auth),非登陸訪問時,其為一個減號
        %t :服務器收到請求的時間,standerd english time
        %r :First line of request,表示請求報文的首先,記錄了此次請求的:方法,URL,協議版本
        %>s :響應的狀態碼
        %b :響應報文的大小,單位字節,不包含http請求首部
        %{Referer}i : 請求報文中首部"referer"的值,即從那個頁面中的超連接跳轉至當前頁面
        %{User-Agent}i : 請求報文中首部"User-Agent"的值,即發出請求的應用程序,瀏覽器類型
      
  • 12、虛擬主機(如果需要虛擬主機的方式,需先注釋中心主機的DocumentRoot)

    • 1、實現方式
      • 基于IP

          <VirtualHost 192.168.0.1:80>
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.2:80>
          ......
          </VirtualHost>
        
      • 基于PORT

          <VirtualHost 192.168.0.1:80>
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.1:8080
          ......
          </VirtualHost>
        
      • 基于FQDN

          <VirtualHost 192.168.0.1:80>
          servername www.a.com
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.1:80>
          servername www.b.com
          .....
          </VirtualHost>
          
          注意:如果需要在2.2版本及以下,需要使用NameVirtualHost IP:PORT來先定義,2.4以后版本不需要
        
  • 13、status頁面
    1、啟用

      加載對應的模塊
      LoadModules status_module modules/mod_status.so
      
      啟用server-status容器選項
      <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      Allow from .example.com  
      </Location> 
      
      訪問
      www.a.com/server-status
    
  • 14、域名別名

    • 1、定義格式

        serveralias www.b.com www.a.com  #將www.b.com定義為www.a.com
      
httpd的子命令
  • httpd -l : 查看httpd所支持的MPM類型
  • httpd -t : 測試主配置文件是否有語法錯誤
  • httpd -M : 查看http的加載模塊
    ========
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,socket5代理服務器,通過http代理服務器上傳文件到FTP服務器等,功能十分強大.

  • 用法:
    • curl [options] [URL....]
  • 常用選項
    • -A / --user-agent <string> : 設置用戶代理發送給服務器
    • --base : 使用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 : 使用HTTP1.0
16 apache的用戶及組

指定以哪個用戶的身份運行httpd服務進程

  • user apache
  • group apache
如果需要使用root權限執行操作時,需要使用SUexec命令調用相關操作
17 使用mod_deflate模塊壓縮頁面優化傳輸速度
  • 適用場景
      1. 節約帶寬,額外消耗CPU,同時可能有些老瀏覽器不支持
      1. 壓縮適于壓縮的資源,例如文本文件
####設置一個過濾器,名稱為DEFLATE ,名稱用于后面設置參數引用 
SetOutputFilter DEFLATE 
# mod_deflate configuration
####設置指定那些類型需要壓縮
# Restrict compression to these MIME types
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
####排除老的瀏覽器
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4  gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch  ^Mozilla/4\.0[678]  no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html
18 配置https
  • 配置https的注意事宜

    • yum安裝httpd服務情況:
    需要安裝mod_ssl模塊,其安裝后會在/etc/httpd/conf.d/目錄下生成ssl.conf文件,需要其配置文件中加載相應的模塊文件及配置
    
    • 編譯安裝httpd服務的情況:
    要編譯的時候可以使用 --enable-ssl選項啟用ssl功能,只需要在httpd的配置文件中, 加載相應的ssl模塊及配置相關ssl參數
    
  • SSL會議的簡化過程

    • 客戶端發送可供選擇的加密方式,并向服務器請求證書
    • 服務器端發送證書以及選定的加密方式給客戶端
    • 客戶端取得證書并先進行證書驗證
      • 驗證證書的合法性,用CA的公鑰解密證書上數字簽名
      • 驗證證書的內容合法性:完整性驗證
      • 檢查證書的有效期限
      • 檢查證書是否被吊銷
      • 證書中擁有者的名字,與訪問的目標主機是否一致
    • 客戶端生成臨時會議密碼(對稱密鑰),并使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換
    • 服務器用此密碼加密用戶請求的資源,響應給客戶端
  • https配置實例
yum install httpd -y

CA
cd /etc/pki/CA/
[root@Centos7 CA]# ls
certs  crl  newcerts  private
[root@Centos7 CA]# cd private/
[root@Centos7 private]# (umask 077; openssl genrsa -out cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
.........................................+++
........................+++
e is 65537 (0x10001)
[root@Centos7 private]#

[root@Centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.mageedu.com
Email Address []:admin@mageedu.com
[root@Centos7 CA]# ls
cacert.pem  certs  crl  newcerts  private

[root@Centos7 CA]# touch index.txt serial
[root@Centos7 CA]# echo 01 > serial
[root@Centos7 CA]# ls
cacert.pem  certs  crl  index.txt  newcerts  private  serial


http server
root@Centos7 ~]# cd /etc/httpd/
[root@Centos7 httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run
[root@Centos7 httpd]# mkdir ssl

root@Centos7 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
...+++
.................................................................................+++
e is 65537 (0x10001)

[root@Centos7 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.zhenping.com
Email Address []:admin@zhenping.com

[root@Centos7 ssl]# scp httpd.csr root@172.16.36.71:/tmp


CA Server
[root@Centos7 CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 17 23:42:58 2016 GMT
            Not After : Jan 16 23:42:58 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = CN
            organizationName          = Mageedu
            organizationalUnitName    = Ops
            commonName                = www.zhenping.com
            emailAddress              = admin@zhenping.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                61:7F:29:8A:68:A6:70:C2:F2:0E:49:15:D7:DD:4D:02:BF:EF:92:6A
            X509v3 Authority Key Identifier:
                keyid:18:F8:A6:71:FB:05:F3:0C:D3:56:9C:90:78:F1:4D:B5:0E:EC:51:5F

Certificate is to be certified until Jan 16 23:42:58 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

[root@Centos7 CA]# scp certs/httpd.crt root@172.16.36.70:/etc/httpd/ssl
The authenticity of host '172.16.36.70 (172.16.36.70)' can't be established.
ECDSA key fingerprint is f7:6e:2f:38:57:8e:8c:0b:12:74:cc:af:44:82:88:17.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.36.70' (ECDSA) to the list of known hosts.
root@172.16.36.70's password:
httpd.crt                                                                                                                                       100% 4606     4.5KB/s   00:00


httpd server

vim /etc/httpd/conf.d/ssl.conf
DocumentRoot "/var/www/html"
ServerName www.zhenping.com
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
http的配置實例:
root@Centos6-ser1 ~]# cat /etc/httpd/conf.d/vhost.conf
    LoadModule status_module modules/mod_status.so
    <Location /server-status>
        SetHandler server-status
        order deny,allow
        deny from all
        allow from 172.16.249.148
    </Location>

    namevirtualhost 172.16.36.60:80
    <VirtualHost 172.16.36.60:80>
        servername wwww.a.com
        Documentroot "/www/a.com/htdocs/"
        alias /download "/www/a.com/htdocs/file"
        Errorlog /www/log/a.com/error.log
        LogLevel warn
        Customlog /www/log/a.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/a.com/htdocs/file/">
            Options Indexes
            AllowOverride None
            AuthType Basic
            AuthName "Please enter you username and password...."
            AuthUserFile "/etc/httpd/conf/.htpass"
            Require user zhenping
        </Directory>
    </virtualhost>

    <virtualhost 172.16.36.60:80>
        servername www.b.com
        documentroot "/www/b.com/htdocs"
        Errorlog /www/log/b.com/error.log
        LogLevel warn
        Customlog /www/log/b.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/b.com/htdocs">
            Options None
            AllowOverride None
            AuthType Basic
            AuthName "Please Enter your username and password."
            AuthUserFile "/etc/httpd/conf/.htpass"
            AuthGroupFile "/etc/httpd/conf/.htpass_group"
            Require group mygrp
        </Directory>
    </virtualhost>

    <virtualhost 172.16.36.60:80>
        servername www.c.com
        documentroot "/www/c.com/htdocs"
        ErrorLog /www/log/c.com/error.log
        LogLevel warn
        CustomLog /www/log/c.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/c.com/htdocs">
            Options None
            AllowOverride None
            order deny,allow
            deny from all
            allow from 172.16.249.148
        </Directory>
    </virtualhost>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容