漫談HTTP(上)


HTTP協議:

  超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之爲超文本(hypertext),這成爲了HTTP超文本傳輸協議標準架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發佈了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。


HTTP是一個應用層協議,有請求和響應構成,是一個標準的客戶端服務器模型。具有以下特點:

  1. 支持客戶/服務器模式

  2. 簡單快速:

      客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型的不同。由於HTTP協議簡單,是的HTTP服務器的程序規模小,因而通信速度很快

  3. 靈活:

      HTTP允許傳輸任意類型的數據對象。正在傳輸的類型有Content-Type加以標記。

  4. 無連接:

      無連接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。

  5. 無狀態:

       HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前的信息時,它的應答就較快。


HTTP版本:

  http/0.9:作爲HTTP協議的第一個版本。是非常弱的,只定義了最基本的簡單請求和簡單回答。

      http/1.0:新增了cache, MIME{MIME: multipurpose internet mail extensions(多用途的網際郵件擴充協議)}機制,用非持久連接,即在非持久連接下,一個tcp連接只傳輸一個Web對象       

      http/1.1:新增了緩存功能,條件式請求;

    speedy協議: SPDY是Google開發的基於TCP的應用層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。SPDY並不是一種用於替代HTTP的協議,而是對HTTP協議的增強。新協議的功能包括數據流的多路複用、請求優先級以及HTTP報頭壓縮。谷歌表示,引入SPDY協議後,在實驗室測試中頁面加載速度比原先快64%。

      http/2.0:在開放互聯網上HTTP 2.0將只用於https://網址,而 http://網址將繼續使用HTTP/1,目的是在開放互聯網上增加使用加密技術,以提供強有力的保護去遏制主動***。DANE RFC6698允許域名管理員不通過第三方CA自行發行證書。


HTTP協議HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們現在常用的HTTPS,如下圖所示:

wKioL1gDH2vj51BeAAA2ytdk_to046.jpg


http協議的實現:

    開源實現:httpd(apache), nginx, lighttpd, ...


       C/S:

        C(客戶端): browser(瀏覽器), user agent(用戶代理),

            chrome, ie, firefox, safari, opera, ...

            elinks, curl, wget, ...

        S(服務器端):httpd(apache), nginx, lighttpd, ...

通信模型:

        請求/響應

wKiom1gDJRKzD15EAABTj30dmHk803.jpg


一次完整的Http請求處理過程:

一次HTTP操作稱爲一個事務,其工作過程可分爲七步

    (1) 建立或處理連接請求 :接受或拒絕請求

    (2) 接收請求:接受來自於網絡的請求報文中對某資源的一次請求的過程;接收請求的方式通常是併發訪問響應模型(WEB I/O)

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

    (4) 加載用戶請求的資源;

    (5) 構建響應報文,根據用戶請求的資源MIME類型以及URL重定向進行報文響應;

    (6) 發送響應報文;

    (7) 記錄訪問於日誌中;


web資源:

  URL:統一資源定位符(Uniform Resource Locator);是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎麼處理它。

  URI:統一資源標識符(Uniform Resource Identifier);是一類更通用的資源標識符,URL 實際上是它的一個子集。URI 是一個通用的概念,由兩個主要的子集URL 和URN(統一資源名稱 (Uniform Resource Name, URN)) 構成,URL 是通過描述資源的位置來標識資源的,而URN則是通過名字來識別資源的,與它們當前所處位置無關。


URL格式:

比如說,你想要獲取URL http://www.xxxx.com/index-fall.html。

URL 分以下三部分。

 URL 的第一部分(http)是 URL 方案(scheme)。方案可以告知 Web 客戶端怎樣訪問資源。在這個例子中,URL 說明要使用HTTP 協議。

 URL 的第二部分(www.xxxx.com)指的是服務器的位置。這部分告知Web 客戶端資源位於何處。

 URL 的第三部分(/index-fall.html)是資源路徑。路徑說明了請求的是服務器上哪個特定的本地資源。




HTTP請求(HTTP Request)

  所謂的HTTP請求,也就是Web客戶端向Web服務器發送信息,這個信息由如下三部分組成:

    1.請求行

    2.HTTP頭

    3.內容

 請求行寫法是固定的,由三部分組成,第一部分是請求方法,第二部分是請求網址,第三部分是HTTP版本。 如: GET www.xxxx.com HTTP/1.1


請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本,格式如下:

    Method Request-URI HTTP-Version CRLF  

其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了作爲結尾的CRLF外,不允許出現單獨的CR或LF字符)。


<method>(資源傳遞方法):GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ...

    GET:從服務器獲取一個資源;

HEAD:只從服務器獲取文檔的響應首部;

POST:向服務器發送要處理的數據;

PUT:將請求的主體部分存儲在服務器上;

DELETE:請求刪除服務器上指定的文檔;

TRACE:追蹤請求到達服務器中間經過的代理服務器;

OPTIONS: 請求服務器返回對指定資源支持使用的請求方法;

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



HTTP響應(HTTP Response)

    當Web服務器收到HTTP請求後,會根據請求的信息做某些處理(這些處理可能僅僅是靜態的返回頁,或是包含Asp.net,PHP,Jsp等語言進行處理後返回),相應的返回一個HTTP響應。HTTP響應在結構上很類似於HTTP請求,也是由三部分組成,分別爲:

    1.狀態行

    2.HTTP頭

    3.響應正文

 首先來看狀態行,一個典型的HTTP狀態如下:  HTTP/1.1 200 OK

   狀態行格式如下:

    HTTP-Version Status-Code Reason-Phrase CRLF

  其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。

狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:

  • 1xx: 信息提示

  •             2xx: 成功響應

        200:成功,請求的所有數據通過響應報文的entity-body部分發送;ok

  •             3xx: 重定向響應

        301:請求的URL執行的資源已經被刪除,但在響應報文中通過首部location指明瞭資源現在所在的新位置:Moved Permanently

        302:與301相似,但在響應報文中通過location指明資源現在所在的臨時新位置:Found

        304:客戶端發出了條件式請求,但服務器上的資源未曾發生改變,則通過響應狀態碼通知客戶端:Not Modified

  •             4xx: 客戶端錯誤

        401: 需要輸入賬號和密碼認證方能訪問資源

        403:請求被禁止:Forbidden

        404: 服務器無法找到客戶端請求的資源 : Not Found

  •             5xx: 服務端錯誤

         500:服務器內部錯誤 : Internal Server Error

         502:代理服務器從後端服務器收到一條僞響應 : Bad Gateway



事務:request/response

  request

        <method> <url> <version>

        HEADERS

    <body>

     reponse

     <version> <status> <reason-phrase>

     HEADERS

     </body>


    headers:

     Name: Value1, value2, ...

     Name: Value1, value2, ...

     ......


首部分類:

    通用首部、請求首部、響應首部、實體首部、擴展首部


  

  通用首部:

     Connection: {close|keep-alive}

     Date:報文創建的日期時間

     Via:經由,

     Cache-Control:緩存控制;

     Pragma:


  

  請求首部:

     Host:

     Referer:跳轉至當前頁面的上級資源;

     User-Agent:用戶代理;

     Client-IP:


    Accept:可接收的MIME類型;

     Accept-Language:

     Accept-Encoding:gzip, defalte,

     Accept-Charset:

     ...


  響應首部:

     信息性首部:

          Server:

    

     協商類首部:

         Accept-Range:服務器端可接受的請求類型範圍

         Vary:其它首部列表

    

     安全相關的首部:

         WWW-Authenticate:認證質詢

         Set-Cookie:

         Set-Cookie2:

  實體首部

     Content-Encoding

     Content-Language

     Content-Lenth

     Content-Location

     Content-Type

     ...

    

     Allow:允許使用的請求方法;

     Location:

    

     緩存相關:

         Etag:擴展標籤

         Last-Modified:

         Expires:


  擴展首部:

     X-Forwarded-For

     ……

    

     url:Uniform Resource Locator

     scheme://host:port/path

    

     完整格式:

     scheme://[<user>[:<password>]@<host>[:<port>]/<path>;<params>?<query>#frag

         params:參數, ;param1=value1&param2=value2

         query:查詢字符串, ?field1=value1&field2=value2

         frag:頁面錨定,#frag_id, 例如#ch1



httpd:

    httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計爲一個獨立運行的後臺進程,它會建立一個處理請求的子進程或線程的池。


httpd所具有的特性

 高度模塊化設計:core  modules + standard modules  + 3rd party modules

 動態鏈接庫DSO: Dynamic Shared Object(動態共享對象)

 多處理模塊MPM: multipath process modules (多道處理模塊

    prefork:process(進程)多進程模型

        每進程響應一個請求; 一個主進程負責生成n個子進程,子進程也稱爲工作進程,每個子進程處理一個用戶請求,即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達,最大不會超過1024個;

    worker: thread(線程)多線程模型

        每線程響應一個請求;一個主進程生成多個子進程,每個子進程負責生成多個線程,每個線程處理一個請求;如果有M個進程,每個進程有N個線程,則可處理的請求個數爲:M*N

    event: thread(線程)時間驅動模型

        每進程響應N請求;一個主進程,生成M個子進程,每個進程直接負責N個請求;可處理的請求個數爲:M*N   (注:在httpd-2.2版本中event爲測試使用,在httpd-2.4中event可生產使用。)

  


http的功能特性:    

  1. CGI:Common Gateway Interface,通用網關接口;

  2. 虛擬主機:基於IP,PORT,FQDN的虛擬主機。

  3. 反向代理:http, fcgi, wsgi, ajp, ...

  4. 負載均衡;

  5. 路徑別名;

  6. 豐富的用戶認證機制:如basic和digest;

  7. 支持第三方模塊;

 

httpd的安裝:

    httpd的安裝和其他軟件安裝的方式一樣,我們可以通過rpm包或源碼編譯的方式進行安裝,rpm包的方式可以通過便捷的yum命令進行安裝,“yum -y install httpd”即可,通過rpm包安裝的httpd其默認工作目錄(根目錄):/etc/httpd,其中:


程序環境:

  • 主程序文件:

    /usr/sbin/httpd

  •             模塊文件:

    /usr/lib64/httpd/modules/*.so

  •             主配置文件:

    /etc/httpd/conf/httpd.conf

    /etc/httpd/conf.d/*.conf

    /etc/httpd/conf.modules.d/*.conf

  •             站點文檔路徑:

    /var/www/html

  • 日誌文件路徑:

/var/log/httpd/

    access_log:訪問日誌

    error_log:錯誤日誌

    Unit File:

    usr/lib/systemd/system/httpd.service

  •             自帶腳本:

        /usr/sbin/apachectl


配置文件當中的語法格式:

DIRECTIVE  VALUE

 指令    值

    DIRECTIVE: 不區分字符大小寫;例如ServerRoot;

    VALUE:除了文件系統路徑,大多數也不區分字符大小寫;


配置修改完成後:

    (1) 測試語法;

    (2) 讓服務程序重載配置文件:

    centos6 ~]# service httpd reload

    centos7 ~]# systemctl  reload  httpd.service


CentOS7相關命令:

啓動服務(等同於service httpd start)

systemctl start httpd.service

停止服務(等同於service httpd stop)

systemctl stop httpd.service

重啓服務(等同於service httpd restart)

systemctl restart httpd.service

查看服務是否運行(等同於service httpd status)

systemctl status httpd.service

開機自啓動服務(等同於chkconfig httpd on)

systemctl enable httpd.service

開機時禁用服務(等同於chkconfig httpd on)

systemctl disable httpd.service

查看服務是否開機啓動 (等同於chkconfig --list)

systemctl list-units --type=service


httpd-2.4的基本配置:

httpd配置文件httpd.conf中相關的內容及相關說明

1、監聽的地址和端口:

        Listen [ip:]port

        ①IP省略時表示監聽本機上所有可用的IP地址;   

    ②Listen可重複使用多數;默認監聽本地可用的所有地址;

        例:    Listen 172.16.100.11:80

             Listen 172.16.100.11:8080


2、保持連接:

persistent connection:tcp連接建立後,資源獲取完成之後不會斷開連接,而是繼續等待請求其它資源;服務模式是保持連鏈接的,如何斷開?可以從數量和時間連個方面去限制。


定義開關   KeepAlive  On|Off

數量限制  MaxKeepAliveRequests 100

時間限制  KeepAliveTimeout 10


3、MPM:多路處理模塊

    併發請求響應的不同實現,有三種模式(prefork,worker,event)前文已經提到過。

   httpd-2.2不支持同時編譯多個不同的MPM,rpm安裝的httpd-2.2提供了三個文件分別用於實現提供對不同的MPM的支持。確認方法:ps aux| grep httpd 默認爲/usr/sbin/httpd,其爲prefork;

 

查看模塊列表:

    httpd -l:查看靜態編譯的模塊

    httpd -M:查看所有模塊,包塊靜態編譯和DSO模塊

    httpd -t -D DUMP_MODULES :顯示所有加載模塊,同於-M。

更換支持不同的MPM的主程序:

    編輯 /etc/sysconfig/httpd

    啓動變量:HTTPD


4、DSO:配置指令模塊加載

格式:LoadModule <mod_name> <modules/mod_file_name> 



模塊路徑可使用相對路徑:

        相對於ServerRoot指令的值來說;/etc/httpd/

 

5、定義Main Server的文檔頁面路徑


    (1) DocumentRoot:站點文檔根路徑;,文件路徑的映射;

(2) ServerName:服務器名稱

     DocumentRoot指向的路徑爲URL起始地位置

    如:一個文件的絕對路徑爲/var/www/html/images/1.jpg,那麼通過URL訪問時的路徑爲:

        http://server/images/1.jpg



6、站點路徑訪問控制

  訪問控制機制:可以基於來源地址或基於賬號來進行,定義的方式有兩種:

   ① 基於文件系統路徑:  

    <Directory "/PATH/TO/DIR">

     </Directory>

    

     <File "">

     </File>

   ②基於URL進行:

    <Location "URL">

     ...

     </Location>

    

     <LocationMatch ~ "URL_PATTERN">

     ...

     </LocationMatch>

 

7、Directory中的訪問控制定義

   ① Options:

Indexes Includes { FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews }

    None=none

    All:所有的都啓用 


    Indexes(索引):當前訪問的路徑下無默認主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現給用戶;非常危險,不建議使用


    FollowSymLinks:允許跟蹤符號鏈接,如果某頁面文件是指向DocumentRoot之外路徑上的其他文件時,將直接顯示目標文件的內容。


    ExecCGI:允許執行CGI腳本

      

   ② AllowOverride

    httpd的訪問控制配置,允許每目錄單獨進行;在每個目錄下建立一個.htaccess文件;

     AllowOverride表示是否允許目錄中的.htaccess文件中的配置來覆蓋當前配置段中的配置;

    

     Options FileInfo AuthConfig Limit

     All

     None

 

   ③基於來源地址的訪問控制:

     允許所有地址訪問:Require all granted

     拒絕所有地址訪問:Require all denied

    

     <RequireAll>

    

     </RequireAll>

    

    基於IP控制:

     Require ip ADDRESS

     Require not ip ADDRESS

       ADDRESS:

              ip

    

    

    基於主機名控制:

     Require host HOSTNAME

     Require not host HOSTNAME

       HOSTNAME:

          FQDN

          DOMAIN.TLD

    

8、定義默認的主頁面

    DirectoryIndex index.html index.html.var

    自左而右,找到首次匹配到的文件,就將其作爲默認主頁返回;


9、配置日誌:

    

錯誤日誌:

        ErrorLog  "/var/log/httpd/error_log"

        LogLevel warn

Possible values include: debug, info, notice, warn, error, crit, alert, emerg.


    訪問日誌:受限要定義日誌格式,然後才能設置日誌信息。通過關鍵字LogFormat來定義一個日誌的格式:

        LogFormat "FORMAT_STRINGS" LOG_FORMAT_NAME

如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

通過關鍵字CustomLog來設置訪問日誌的存放路徑及格式信息:

        CustomLog  "/PATH/TO/LOG_FILE"  LOG_FORMAT_NAME

注:"FORMAT_STRINGS"參數詳情請參考:

    http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats


10、路徑別名:

如DocumentRoot "/var/www/html",在/var/www/html/web/htdocs下面又有bbs/index.html,顯然我們通過url訪問的時候路徑是這樣的:

    URL:http://www.xxxx.com/web/htdocs/bbs/index.html

此時我們可以使用Alias /URL/ "/path/to/some_directory"即 

Alias /xxbbs/ "/var/www/html/web/htdocs/bbs" 來重新定義一個別名路徑,那麼我們可以通過訪問新的url來訪問之前同樣的內容。


格式:

    Alias  /URL/ /PATH/TO/SOME_DIR/

      注:/   相對應


11、設定默認字符集

    AddDefaultCharset UTF-8

    常用字符集:GBK,GB2312,GB18030

12、虛擬主機:

主機標識方式:

    IP不同 

    PORT不同

    ServerName:

模式:

<VirtualHost IP:PORT>
    ServerName
DocumentRoot
<Directory "">
    ...
Require all granted
</DIrective>
ErrorLog
CustomLog
</VirtualHost>

示例:

注:httpd-2.2中使用基於ServerName的虛擬主機時,要使用專用配置指令 NameVirtualHost IP:PORT

<VirtualHost 10.1.0.68:80>
    ServerName www1.a.com
    DocumentRoot "/vhosts/www1"
    <Directory "/vhosts/www1">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost 10.1.0.68:8080>
  ServerName www2.b.com
  DocumentRoot "/vhosts/www2"
  <Directory "/vhosts/www2">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost 10.1.0.69:80>
    ServerName www3.c.com
    DocumentRoot "/vhosts/www3"
    <Directory "/vhosts/www3">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>


13、基於用戶的訪問控制:

Require user USERLIST

    Require group GRPLIST


    虛擬用戶: 只是用戶標識,爲了獲取某個資源。


認證方式:

     basic

     digest


http協議認證過程 :

  認證質詢:

        WWW-Authencate:響應碼爲401,拒絕客戶端請求,並說明用戶需要輸入正確的賬號和密碼之後方可訪問;


  認證:

        Authorization:客戶端填入賬號和密碼,再次發送請求報文;認證通過,服務器發送響應內容;

 <Directory "">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "STRING"
    AuthUserFile ""
    Require user USER1 USER2 ...
 </Directory>


賬號文件生成工具htpasswd

    htpasswd [options] "/PATH/TO/HT_PASSWD_FILE" username

     -c:創建此文件;

     -m:md5加密密碼存放;

     -s:sha加密

     -D: 刪除指定用戶


示例:

<VirtualHost *:80>
    ServerName www1.a.com
    DocumentRoot "/vhosts/www1"
    <Directory "/vhosts/www1">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    <Directory "/vhosts/www1/admin">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "Admin Area, Enter your name/pass"
        AuthUserFile "/etc/httpd/conf/.htpasswd"
        Require valid-user
    </Directory>
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
</VirtualHost>



Require的使用方式:

    (1) Require valid-user

    (2) Require user USER1 USER2 ...


    基於組進行認證:

<Directory "/vhosts/www1/admin">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Admin Area, Enter your name/pass"
    AuthUserFile "/etc/httpd/conf/.htpasswd"
    AuthGroupFile "/etc/httpd/conf/.htgroup"
    Require group GRPNAME1 GRPNAME 2
</Directory>


組賬號文件:

        每行定義一個組

        group_name: user1 user2 ...



示例1:

(1) 基於主機名實現三個虛擬主機

(2) 每虛擬主機使用獨立的訪問日誌和錯誤日誌

(3) 第三個虛擬主機的/admin要進行用戶訪問認證

(4) 在第二個虛擬主機上提供/status;

(5) 在第三個虛擬主機提供路徑別名/bbs,訪問其它文件系統路徑;

(6) 嘗試使用混合類型的虛擬主機:基於IP,PORT和ServerName


[root@centos7~]# tree /vhosts/
/vhosts/
├── www1
│   └── index.html
├── www2
│   └── index.html
└── www3
├── admin
│   └── index.html
├── index.html
└── test
└── index.html
[root@centos7 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
[root@centos7 ~]# htpasswd -m /etc/httpd/conf.d/.htpasswd jack
[root@centos7 ~]# cat /etc/httpd/conf.d/.htpasswd
tom:$apr1$KsgClzeF$3sjkA4SYzbO4rsLJ1Ry1F0
jack:$apr1$8CXU2TlX$uQt2LfZYK1yLWwF8oQD4F1

配置文件
[root@centos7 ~]# vim /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName www1.magedu.com
     DocumentRoot "/vhosts/www1"
     <Directory "/vhosts/www1">
         Options None
         AllowOverride None
         Require all granted
     </Directory>

     ErrorLog "logs/www1-error_log"
     Customlog "logs/www1-access_log" combined
 </VirtualHost>

 <VirtualHost *:80>
     ServerName www2.magedu.com
     DocumentRoot "/vhosts/www2"
         <Directory "/vhosts/www2">
             Options None
             AllowOverride None
             Require all granted
         </Directory>

         <Location /status>
             SetHandler server-status
                 Require all granted
         </location>

     ErrorLog "logs/www2-error_log"
     Customlog "logs/www2-access_log" combined
 </VirtualHost>

 <VirtualHost *:80>
     ServerName www3.magedu.com
     DocumentRoot "/vhosts/www3"
         <Directory "/vhosts/www3">
             Options None
             AllowOverride None
             Require all granted
         </Directory>
     <Directory "/vhosts/www3/admin">
             Options None
             AllowOverride None
         AuthType Basic
         AuthName "Admin , Enter your name/passwd"
         AuthUserFIle "/etc/httpd/conf.d/.htpasswd"
         Require valid-user
     </Directory>

     Alias /bbs/ /vhosts/www3/admin/
     ErrorLog "logs/www2-error_log"
     Customlog "logs/www2-access_log" combined
 </VirtualHost>


示例2

2:使用腳本實現基於主機名的虛擬主機按需創建;

每虛擬使用單獨的配置文件;

腳本可接受參數,參數虛擬主機名稱;

 #!/bin/bash
 Dir=/vhost/
 Host() {
 cat <<EOF > /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName $Vhost.magedu.com
     DocumentRoot "$Dir$Vhost"
     <Directory "$Dir$Vhost">
         Options None
         AllowOverride None
         Require all granted
     </Directory>
 </VirtualHost>
 EOF
 }

 HostLog() {
 cat <<EOF > /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName $Vhost.magedu.com
     DocumentRoot "$Dir$Vhost"
     <Directory "$Dir$Vhost">
         Options None
         AllowOverride None
         Require all granted
     </Directory>
     ErrorLog "logs/$Vhost-error_log"
     CustomLog "logs/$Vhost-access_log" combined
 </VirtualHost>
 EOF
 }

  read -p "Input VirtualHost:(Hostname|quit)  " Vhost
   until [[ $Vhost == "quit" ]];do
   read -p "Whether use Log:(y|n) " Log
   if [ $Log == "y" ];then
      mkdir -pv $Dir$Vhost &> /dev/null
      HostLog
      echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html
      systemctl reload httpd
   else
      mkdir -pv $Dir$Vhost &> /dev/null
      Host
      echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html
      systemctl reload httpd
   fi
 read -p "Input VirtualHost:(Hostname|quit)  " Vhost
   done





14、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基本認證


   -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

   -X, --request <command>:自定義請求方法


另一個工具:elinks

語法:elinks  [OPTION]... [URL]...

    -dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出; 



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


適用場景:

(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;

(2) 壓縮適於壓縮的資源,例如文件文件;


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



16、https,  http over ssl 


OpenSSL:

libcrpyto, libssl (ssl/tls), openssl

PKI: 

CA, 


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]



17、httpd自帶的應用程序

  htpasswd:basic認證基於文件實現,用於生成賬號和密碼的程序;

    htdbm

    htdigest

  apachectl:httpd自帶的服務控制腳本,支持start和stop等子命令;

  apxs:- APache eXtenSion tool

    爲httpd增添模塊的;

 

  rotatelogs:

     access_log,

     access_log, access_log.1, ...


  

  壓測工具:

    ab:(http自帶) - Apache HTTP server benchmarking tool

     webbench, httpload, ...  只能做簡單評估

    

     loadrunner:既能做壓測,又能對軟件做測試

    jmeter (ASF):開源,既能壓測,又能做軟件測試需要測試模型

     tcpcopy:網易研發

  

18、ab - web service的壓力測試工具


  ab [OPTIONS]  [http[s]://]hostname[:port]/path

     請求數:[ -n requests ]

     併發數:[ -c concurrency ]

     長連接:[ -k ]

    



  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章