HTTP協議及服務配置

HTTP:hyper text transfer protocol,80/tcp 超文本傳輸協議
http協議版本:
HTTP/0.9:原型版本,功能簡陋。僅能實現簡單的資源交互,不支持多媒體內容。
HTTP/1.0:第一個廣泛使用的版本,支持MIME,從而支持多媒體,但緩存機制設計仍然簡陋和薄弱
HTTP/1.1:增強了緩存功能
HTTP/2.0:
http是基於tcp完成的協議

一次完整的http請求處理過程:
  (1)建立或處理連接,接收請求或拒絕請求
  (2)接收請求,接收來自於網絡的請求報文中對某一資源的一次請求的過程
  (3)處理請求,對請求報文進行解析,並獲取請求的資源及請求方法等相關信息
  (4)訪問資源,獲取請求報文中請求的資源
  (5)構建響應報文,一旦web服務器找到資源,而且這個資源也允許被某個客戶端訪問,這個
  時候它就要能夠拿到這個資源,把它封裝成一個響應報文,並指明這個資源內部的內容格式發
  送給客戶端。
  (6)發送響應報文
  (7)記錄日誌

httpd的特性:

高度模塊化:core+modules  任何一個組件出現問題或者需要升級,它隻影響一個模塊,而不
會影響整體的代碼,任何一個模塊崩潰,有可能只需要替換一個模塊即可
DSO:Dynamic Shared Object 動態共享對象
MPM:Mutipath Processing Modules:實現多種不同的I/O模型。
    Prefork:多進程模型,主進程,生成多個子進程,每個子進程響應一個請求;
    worker:多線程模式,主進程,生成多個子進程,每個子進程生成多個線程,每個線程響
    應一個請求;
    event:事件驅動模型,主進程,生成多個子進程,每個子進程響應多個請求;
I/O類型
  同步和異步:synchronous,asynchronous;關注的是消息通知機制
    同步:調用發出後不會立即返回,但是一旦返回,則返回的是最終結果。
    異步:調用發出後,被調方立即返回消息,但返回並非最終結果,被調用者通過狀態,通知
    機制等來通知調用者,或通過回調函數來處理結果。
  阻塞和非阻塞:block,noblock ;關注的是調用者等待被調用者返回結果時的狀態
    阻塞:調用結果返回前,調用者被掛起;調用者只有在得到返回結果之後才能繼續;
    非阻塞:調用者在結果返回之前,不會被掛起,即調用不會阻塞調用者;

I/O模型:
  blocking IO:阻塞式IO
  noblocking IO:非阻塞IO
  IO multiplexing:複用型IO
  signal driven IO:事件驅動式IO
    通知:
      水平觸發:多次通知
      邊緣觸發:只通知一次
  asynchronous IO:異步IO

一個進程發起IO調用時,這個IO將由兩個階段組成(一次IO,指的是磁盤IO),第一步:數據
從磁盤到內核內存,第二步:數據從內核內存到進程內存。真正被稱爲IO是數據從內核內存到進
程內存的過程。

這裏寫圖片描述
實際上,除非特別指定,幾乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。這給網絡編程帶來了一個很大的問題,如在調用send()的同時,線程將被阻塞,在此期間,線程將無法執行任何運算或響應任何的網絡請求。

程序環境:
  配置文件:
    /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:訪問日誌
      error_log:錯誤日誌
  站點文檔目錄:
    /var/www/html

配置文件組成部分:
    ~]# grep "Section" /etc/httpd/conf/httpd.conf 
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration
    ### Section 3: Virtual Hosts

常用配置:

1 修改監聽的IP和PORT

Listen [IP:]PORT  IP可省略,省略表示監聽本地所有ip地址;listen可以應用多次

這裏寫圖片描述

2 持久連接

目前多數的瀏覽器都請求服務器保持持續連接,這種功能就稱爲“KeepAlive“,它是HTTP1.1標
準規格,一般是用來強化服務器的性能。在使用保持連接功能時,設置客戶一次請求連接能影響
文件的最大上限,建議把默認值設爲ON,以便提高訪問性能。但當使用負載均衡時,會影響負載
均衡的效果,在未斷開連接之前,同一客戶端時中被定向至同一臺服務器。

Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待
其他的請求完成;
KeepAlived On|Off  是否開啓持久連接
MaxKeepAliveRequests #  數量限制
KeepAliveTimout #  時間限制

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

3 MPM 多路處理模塊 prefork,worker,event

http-2.2不支持同時編譯多個模塊,所以一次編譯只能選定一個,rpm安裝的包提供
三個二進制執行程序,分別用於實現對不同MPM機制的支持。

<IfModule prefork.c>       #判定模塊是否存在
StartServers       8       
#默認啓動的工作進程數;不包括主進程,主進程只是負責子進程的創建回收等
MinSpareServers    5       #最少空閒進程數
MaxSpareServers   20       #最大空閒進程數
ServerLimit      256       #最大活動進程數
MaxClients       256       
#併發請求的最大數;請求連接進來不一定會活動,要小與等與ServerLimit
MaxRequestsPerChild  4000  #每個進程在生命週期內所能服務的最多的請求個數;
</IfModule>

<IfModule worker.c>
StartServers         4    #啓動的子進程的個數
MaxClients         300    #併發請求的最大數
MinSpareThreads     25    #最小空閒線程數
MaxSpareThreads     75    #最大空閒線程數
ThreadsPerChild     25    #每個子進程可生成的線程數
MaxRequestsPerChild  0    
#每個子進程在生命週期內所能服務的最多的請求個數,0標示不限定
</IfModule>

默認爲/usr/sbin/httpd,其使用prefork。
更換使用的httpd程序:
  /etc/sysconfig/httpd
    HTTPD=
  重啓服務生效;

這裏寫圖片描述
這裏寫圖片描述

4 DSO模塊加載方式

配置指令實現模塊加載
  LoadModule <mod_name> <mode_path>
  模塊路徑可使用相對地址,相對於ServerRoot(/etc/httpd)指向的路徑而言:
    /etc/httpd/modules/

httpd -M:列出已經裝載的所有DSO以及非DSO模塊
httpd -l:列出支持使用的非DSO模塊

這裏寫圖片描述

5 定義站點根目錄

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

apache服務器存放頁面的路徑,默認所有要求提供HTTP服務的連接,都要以這個目錄爲主目錄,默認爲/var/www/html

6 站點訪問控制

可基於兩種類型的路徑指明對哪些資源進行訪問控制
  文件系統路徑
    <Directory ""> </Directory>
    <FileMatch ""> <FileMatch>
  URL路徑:
    <Location ""> </Location>
    ...
訪問控制機制:
  基於來源地址;
  基於帳號;

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

1Options
   所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
       Indexes:缺少指定的默認頁面時,允許將目錄中所有文件以列表形式返回給用戶,危險!
       Includes:允許是用mod_include模塊實現服務器端包含(SSI);
       FollowSymlinks:允許跟蹤符號連接文件;
       SymlinksIfOwnerMatch:在鏈接文件屬主屬組與源文件的屬主屬組相同時,允許跟隨符號連接所指向的原始文件;
       ExecCGI:允許是用mod_cgi模塊執行CGI腳本;
       MultiViews:允許是用mod_negotiation實現內容協商;
       None:所有都不啓用;
       All:允許所有;
(2)基於來源地址的訪問控制機制
   Order:檢查次序
      Order allow,deny
      Order deny,allow
   Allow from
   Deny from
   來源地址:IP 或 NetAddr  172.16 | 172.16.0.0 | 172.16.0.0/16
<Directory>可以配置網站目錄下的訪問屬性,使用<Directory ~ "path">可以基於正則表達式的匹配,但是一般不建議使用,會消耗時間。類似的指令還有:
<Location [~] "">:配置URL訪問屬性,與<Directory>相似(可以配置ststus頁面或者定義了別名的路徑等);
<File [~] "">:限制單個文件的訪問屬性;
<locationmatch "">:相當於Location ~,但一般建議使用此配置進行正則匹配;
如果某要配置其屬性的URL能映射到某具體文件系統路徑,建議使用。  

8 定義默認主頁面

DirectryIndex index.html index.html.var
自左而右,依次匹配

9 日誌設定

默認日誌目錄:/var/log/httpd
錯誤日誌:
  ErrorLog logs/error_log
  LogLevel warn
      debug, info, notice, warn, error, crit, alert, emerg
訪問日誌:
  CustomLog logs/access_log_combined
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    %h:客戶端IP地址;
    %l:Remote logname (from identd, if supplied) -表示爲空;
    %u:Remote user,(from auth;may be bogus if return status (%s) is 401);
    %t:服務器收到請求的時間;
    %r:請求報文的道行信息;
    %>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/htdocs"
  http://server1/download/bash-4.4.2-3.el6.x86_64.rpm
    --> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

Alias /alias/ "/PATH/TO/SOMEDIR/" 
意味着訪問http://Server_IP/alias時,其頁面文件來自於/PATH/TO/SOMEDIR/這個位置
注意:前後路徑要一致,結尾都有“/“或者都沒有

  Alias /bbs/ "/forum/htdocs"
    http://server1/bbs/index.html
      --> /forum/htdocs/index.html

11 設定默認字符集

AddDefaultCharset UTF-8

GBK,GB2313,GB18030

12 基於用戶的訪問控制

當你的網站或者站點的某個路徑只想讓你授權的用戶訪問時,就可以使用基於用戶的訪問控制
認證質詢:
  WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼;
認證:
  Authorization:客戶端用戶天如帳號和密碼後,再次發送請求報文,認證成功,則服務器發送響應資源
     認證類型:  basic:明文  digest:消息摘要,hash編程後發送,大多瀏覽器不支持
安全域:需要用戶認證後方能訪問的路徑;
  應該通過名稱對其進行標示,並用於告知用戶認證的原因;
用戶的帳號和密碼存儲於何處?
  虛擬帳號:僅用於訪問某服務器時用到的認證標識;
  存儲: 文本文件;SQL數據庫;ldap,nis
basic認證:
  (1)定義安全域
    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "STRING"
        AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
        Require user username1 username2 ...
    </Directoty>

      允許帳號文件中的所有用戶登陸訪問: Requie valid-user
  (2)提供帳號和密碼存儲(文本文件)
    使用htpasswd命令進行管理
      htpasswd [options] passwordfile username
        -c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;
        -m:md5加密用戶密碼;
        -s:sha1加密用戶密碼;
        -D:刪除指定用戶;
  (3)實現基於組進行認證
    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "STRING"
        AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
        AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
        Require group GROUP1 GROUP2 ...
    </Directoty>

    要提供:用戶帳號文件和組文件;
      組文件:每行定義一個組

基於用戶的訪問控制

1 使用htpasswd命令生成用戶認證庫;

這裏寫圖片描述

2 編寫配置文件 /etc/httpd/conf/httpd.conf

這裏寫圖片描述

3 創建安全域,即訪問目錄。最後重新加載服務即可

這裏寫圖片描述

基於組進行認證

1 使用htpasswd命令生成認證庫,同上。創建組文件。

這裏寫圖片描述

2 修改配置文件 /etc/httpd/conf/httpd.conf

這裏寫圖片描述

3 創建安全域,即訪問目錄。最後重新加載服務即可

這裏寫圖片描述

13 虛擬主機

即爲一個物理服務器提供多個站點。有三種實現方案:
  基於ip:爲每個虛擬主機準備至少一個ip地址;
  基於port:爲每個虛擬主機準備至少一個專用port;實踐中很少使用;
  基於hostname:爲每個虛擬主機準備至少一個專用hostname;

注意:一般虛擬主機不要與中心主機混用,所以,要使用虛擬主機,先禁用中心主機;
  禁用中心主機:註釋DocumentRoot
NameVirtualHost *:80  #使用基於域名的虛擬主機時需要啓動此項,在httpd-2.4中不需要使用

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

基於ip

1 分別創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf

這裏寫圖片描述

實驗效果:分別輸入不同的ip,訪問到不同的頁面。

這裏寫圖片描述
這裏寫圖片描述
基於port

1 創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf

這裏寫圖片描述

實驗效果:分別輸入ip的不同端口,訪問到不同的頁面。前提是在listen處打開這個端口。

這裏寫圖片描述
這裏寫圖片描述

基於域名

1 創建安全域目錄,並配置主頁面。
2 修改配置文件 /etc/httpd/conf/httpd.conf  
3 注意打開修改NameVirtualHost選項!

這裏寫圖片描述
這裏寫圖片描述

實驗效果:分別輸入不同域名,訪問到不同的頁面。訪問的主機做好域名解析!

這裏寫圖片描述

14 內置的status頁面

<Location /server-status>
    SetHandler server-status
    Order dent,allow
    Dent from all
    Allow from 172.25
</Location>

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

這裏寫圖片描述

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