httpd配置-CentOS6

CentOS6上的httpd程序包爲httpd-2.2版本,可以直接使用rpm包安裝或者源碼編譯安裝,rpm包的安裝方式不再贅述:

# yum install httpd

CentOS6上httpd程序安裝完成後的主要文件分佈

 主配置文件:/etc/httpd/conf/httpd.conf

 輔助配置文件:/etc/httpd/conf.d/*.conf 其作用是爲httpd.conf提供片段

 服務腳本:/etc/rc.d/init.d/httpd

 服務腳本配置文件:/etc/sysconfig/httpd

 主程序文件:

  prefork模型程序文件:/usr/sbin/httpd

  worker模型程序文件:/usr/sbin/httpd.worker

  event模型程序文件:/usr/sbin/httpd.event

 訪問日誌文件目錄:/var/log/httpd/access_log

 錯誤日誌文件目錄:/var/log/httpd/error_log

 站點文檔目錄:/var/www/html(可以理解爲網頁文件存放目錄)

 模塊文件路徑:/usr/lib64/httpd/modules/

CentOS6上httpd服務常用配置(以下配置均在httpd.conf中)

 配置文件的組成:

 分爲三部分組成

 第一部分 

 ### Section 1:Global Environment

  配置全局環境,程序工作特性

 ### Section 2:'Main' server configuration

  主服務器配置

 ### Section 3:Virtual Hosts

  虛擬主機配置


### Section 1 Global Environment

1、修改監聽的IP和端口

  Listen [IP:]PORT

  例:Listen 172.16.20.242:8080

  省略IP表示監聽本機所有IP地址;且Listen可重複多次;

  例:

   wKioL1nluUST9bLQAAAKPF4hWcM519.png-wh_50

  則表示即監聽本機所有IP地址的80端口,也監聽IP172.16.20.246的8080端口。

2、持久連接,Persistent Connection

  連接建立,每個資源獲取完成後不會立即斷開連接,而是繼續等待其它的請求完成;

  wKiom1nmsKHTd8EaAABAWcZqY9U084.png

 KeepAlive On|Off

  是否開啓KeepAlive

 MaxKeepAliveRequests #

  持久連接允許的發起的的最大請求次數,默認爲100,

 KeepAliveTimeout #

  超時時長,即連接建立之後,第一次請求和第二次請求之間的最大時間,默認爲15秒,超過這個時間,連接就會斷開,再次請求就必須重新建立連接

 

 測試KeepAlive配置效果

 wKioL1nmraziRR4IAABUQA9omyg509.png

 使用telnet HOST PORT指令

 輸入GET /URL HTTP/1.1(HTTP/1.1爲協議版本)

 Host: HOSTNAME or IP

 敲兩次回車

 如果開啓了KeepAlive,那麼連接不會斷開,等待用戶繼續發起請求,知道超過超時時間

 如果未開啓KeepAlive,那麼連接會立即斷開

3、MPM配置

 MPM即Multipath Process Module是;多道處理模塊,模型分別爲prefork,worker,event,httpd-2.2不支持同時編譯多個模塊,所以只能在編譯安裝時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現不同MPM機制的支持;

 prefork:多進程模型,每個進程響應一個請求;

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

  prefork配置如下

  wKioL1nnBazBtKNWAABGFJRDPl0331.png

  StartServers:服務啓動時啓動的服務器進程數。

  MinSpareServers:最小空閒進程數,當httpd啓動時,會先啓動StartServers個子進程,然後再啓動MinSpareServers個子進程。

  MaxSpareServers:最大空閒進程數,如果空閒子進程數大於MaxSpareServers個,那麼httpd會自動kill掉超出的子進程。

  MaxClients:併發請求的最大數,即可以同時處理的請求數。

  ServerLimit:最大活動進程數,爲MaxClient所準備的在其服務生命週期內所允許的最大值,在線的服務器進程數量最大值。最大值爲200000,當MaxClients不夠用時,可以增大ServerLimit,然後增大MaxClients,一般這兩個值相等。

  MaxRequestPerChild:每個子進程在生命週期內所能夠響應的最大請求數;一旦某進程超過了這個數量則會自動釋放所有內存後自殺。這個值可以設置爲0,0即永不結束,但這樣做的弊端是進程佔用內存過大而且容易內存溢出。不過對於KeepAlive鏈接,只有第一個請求會被算作一個請求,KeepAlive有效期內的其它請求不算。

 worker:多線程模型,每個線程響應一個請求;

  一個主進程,生成多個子進程,每個子進程生成固定個數的線程,每個線程獨立響應一個請求。

  worker配置如下

  wKioL1nnLrXzQInMAABG4i3Sw6g236.png

  StartServers:當httpd程序啓動時,伴隨啓動StartServers個子進程。

  MaxClients:併發請求的最大數,即所有子進程中的線程總數限制。

  MinSpareThreads:最小空閒線程數。

  MaxSpareThreads:最大空閒線程數。

  ThreadsPerChild:每個子進程可以生成的線程數。

  MaxRequestsPerChild:每個線程在生命週期內可以相應的最大請求數,0表示不限制。

 event模型

  事件驅動模型

  一個主進程,生產多個子進程,每個子進程直接響應n個請求。

  在httpd-2.2中,event爲測試使用

  在httpd-2.4中,event可在生產使用

  

 確認當前使用的模塊的方法:

   # ps aux | grep httpd

   wKiom1nnUNLAcrCrAAA5E-ciwOA282.png

 這裏可以查看到運行的是httpd.worker程序,其默認爲/usr/sbin/httpd,即prefork

 查看當前使用的靜態編譯的模塊:

  wKiom1nnVy6RpysTAAAM8_ONEew923.png

 更換使用的httpd程序:

  通過修改/etc/sysconfig/httpd實現,這是服務腳本/etc/rcd/init.d/httpd的配製文件

  wKioL1nnUsjgAoleAAArY3OPr4U001.png

   如果需要切換爲其它程序文件,直接將HTTPD=/usr/sbin/httpd.worker中的httpd.worker更改爲httpd(prefork模型)或httpd.event(event模型)。需要注意的是,修改配置後,需要重新啓動httpd服務才能使配置生效。


4、DSO

 Dynamic Shared Object,動態共享對象,即動態裝卸載模塊

 查看所有模塊包括靜態編譯和動態加載的

# httpd -M

 

 使用配置指令實現模塊加載

 wKiom1nnTaaDqfZXAABG1riijZ0396.png

 LoadModule <mod_name> <mod_path>

 模塊路徑mod_path可使用相對路徑,即相對於ServerROOT(/etc/httpd)指向的路徑而言,而在/etc/httpd/modules是一個指向/usr/lib64/httpd/modules/的軟鏈接。因爲真實的模塊存放路徑是/usr/lib64/httpd/modules/

# ll /etc/httpd/modules

 wKiom1nnWGDBnfgPAAAQbw4-thM656.png

# ls /usr/lib64/httpd/modules/

wKioL1nnVi_yI6L4AABSXrx1ILQ014.png

 

 啓用和禁用模塊:

 直接在/etc/httpd/conf/httpd.conf中修改

# vim /etc/httpd/conf/httpd.conf

wKiom1nnWnqx_yA_AABMT5ekXJw558.png

 如上圖所示,如果需要禁用某模塊,直接在該模塊指令前加上"#"號,使該指令註釋掉即可,如果需要啓用模塊,刪掉指令前的"#"號和空白字符。注意:修改後需要重啓服務才能生效。


### Section 2:'Main' server configuration

5、定義'Main' Server的文檔頁面路徑,即DocmentRoot,也就是網頁文件存放目錄

918282b1ecb14f2a0863f40bee3f6c86.png

默認路徑爲/var/www/html/,直接修改路徑即可,且路徑要真實存在。

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

 DocumentRoot "/var/www/html"

 如果在/var/www/html/test/index.html,那麼訪問該網頁時,應該輸入路徑:http://x.x.x.x/test/index.html


6、站點訪問控制

 即可基於兩種類型的路徑指明對哪些資源進行訪問控制

  基於文件系統路徑:

   <Directory ""></Directory>

   <File ""></File> 針對單個文件做訪問控制

   <FileMatch ""></FileMatch>基於匹配機制進行文件訪問控制

  基於URL路徑:

   <Location ""></Location>

   ...


 訪問控制機制:

   基於來源地址(IP)

   基於用戶賬號密碼


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

  855e72c311ebde298984e2ddf9a29428.png

<Directory "/www/htdocs">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directroy>

  如果所示,當需要對資源文件進行訪問控制的時候,需要修改Directory指令所指定的路徑,並且在其中修改訪問控制指令,訪問控制指令如下:

 (1)Options

    定義用戶對此目錄下資源進行訪問時所支持的訪問選項

    所有可用特性:Indexes Includes FollowSysmLinks SymLinksifOwnerMatch ExecCGI MultiViews None All

    在指定的選項前加"-"號,意爲使此選項失效

     例:Options -Indexes Inclues

   Indexes:索引

    當沒有定義主頁面時,如果允許Indexes,那麼會列出指定的文檔根路徑下的所有目錄及文件,具有非常大的安全風險,CentOS默認設置有默認頁面,會在沒有定義主頁面,而又允許Indexes時,用戶就會訪問到默認設置的頁面,這個網頁文件定義在/etc/htpd/conf.d/welcome.conf中

   83cec1a5981cbc80b562b49a7c537928.png


   Includes:允許使用mod_include提供的服務器端包含

         FollowSymLinks:允許跟蹤符號鏈接文件;如果在資源目錄中有符號鏈接,那麼訪問符號鏈接時,會自動追溯訪問符號鏈接指向的文件。

         SymLinksifOwnerMatch:只有當前源文件和符號鏈接文件屬主相同,才允許跟蹤符號鏈接文件。

         ExecCGI:是否允許執行CGI腳本。

         MultiViews:是否允許多視圖

         AllowOverride:是否允許在此處配置的目錄訪問控制覆蓋每個目錄自身的目錄訪問控制(每目錄訪問控制)。

    (2)基於來源地址的訪問控制機制

      Order:

           Order allow,deny   只有allow的才allow,其他的都爲deny,白名單

           Order deny,allow   只有deny的才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

            例:

    Order allow,deny
    Allow from 172.16.20.242

意爲只放行172.16.20.242,其他的全部都拒絕。

    Order deny,allow
    Allow from 172.16.20.242

意爲只拒絕172.16.20.242,其他的全部允許。


8、定義默認主頁面

DirectoryIndex index.html index.html.var

  可以同時定義多個。

9、日誌設定

  當客戶端訪問http資源時會產生日誌,日誌有兩類,錯誤日誌和訪問日誌。

    錯誤日誌:

      ErrorLog logs/error_log

        此路徑是相對應/etc/httpd/而言,而不是根路徑,即/etc/httpd/logs/error_log

0c9483339fea055153e9adf314c25abe.png

      LogLevel warn 日誌級別

      級別從高到低一次排列順序爲:

      emerg,alert,crit,error,warn,notice,info,debug

      emerg:緊急情況,系統無法使用

      alert:必須立即採取措施

      crit:致命情況

      error:錯誤情況

      warn:警告情況

      notice:一般重要情況

      info:普通信息

      debug:出錯級別信息

      如果定義錯誤日誌記錄級別爲某一級時,則表示會記錄比這個級別更高的的錯誤日誌,包括這個級別

      例:LogLevel warn定義記錄級別爲warn,那麼按照排序,warn以上級別的日誌都會記錄,包括emerg,alert,crit,error,包括warn。


  訪問日誌:

      CustomLog logs/access_log combined

             日誌存儲位置  日誌格式

859809d58ecf9194b6144d6622a3448a.png

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

  % 表示在記錄日誌時,根據用戶請求將這些宏替換成對應的相關信息。如下:

  %h:客戶端IP地址;

  %l:Remote logname(form identd,if supplied);-表示爲空;並非表單登錄名,而是使用mod_ident登陸

  %u:Remote user,(from auth;may be bogus if return status (%s)is 401);即基於httpbasic或digist登陸認證的用戶名;

  %t:Time the request was received(standard english format),服務器收到請求的時間;

  %r:First line of request,請求報文的首行信息(method url version);

  %>s:響應狀態碼;響應狀態中最後一段數值格式的響應狀態碼信息,而不包括原因短語;

  %b:響應報文的大小,單位是字節,不包含響應報文首部;

  %{Referer}i:請求報文當中“referer”首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;

  %{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的程序;

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

10、路徑別名

  Alias /URL/ "/PATH/TO/SOMEDIR/"

  示例:

  Alias /bbs/ "/forum/htdocs"

   http://www.xxx.com/bbs/index.html

   默認index.html存放在/www/htdocs/bbs/

   通過別名機制使得路徑變成了/forum/htdocs/bbs/

   這時候如果訪問http://www.xxx.com/bbs/index.html,就不是訪問的/www/htdocs/bbs/index.html,而是/forum/htdocs/bbs/index.html

11、設定默認字符集

  AddDefaultCharset XXX

  4e597f54bcbbac88e9ddbbdd83841f40.png

  常見的中文字符集:GBK,GB2312,GB18030

12、基於用戶的訪問控制

  即使用用戶名密碼的機制對資源的訪問進行控制。

  認證質詢:

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

  認證:

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

     認證方法:

       basic:明文

       digest:消息摘要,即經過md5加密,很多老版本的瀏覽器不支持digest認證;不過可以放置在https中使用,現在大多數都是通過表單認證(使用編寫的認證程序進行認證,與http程序無關),很少通過這種認證。

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


  用戶的賬號和密碼,一般使用虛擬賬號;避免使用系統賬號,產生安全隱患,僅用於訪問某服務器時用到的認證標識;

    存儲:

      文本文件

      SQL數據庫

      ldap 輕量目錄訪問協議

      nis ???

  

  basic認證:

   (1)定義安全域

      

<Directory "">
        Options None
        AllowOverride None
        AuthType Basic    //認證類型爲明文認證
        AuthName "STRING"   //認證名爲爲STRING
        AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"    //認證所用的用戶文件存儲位置
        Require user username1 usename2 ...   //可用的用戶,即那些用戶可以通過認證,取自用戶文件
</Directory>

    例:

    cfae3a56a9ea1fad0c881174e07c09a6.png

    首先在httpd.conf中做好相應配置,然後創建存儲用戶名和密碼的用戶文件

  (2)提供賬號和密碼存儲(文本文件)

     用戶文件需要使用htpasswd命令進行創建和管理等

        htpasswd [options] PASSWORD_FILE USERNMAE

         -c:自動創建password_file,因此,僅應該在添加第一個用戶時使用;

         -m:md5加密用戶密碼

         -s:sha1加密用戶名密碼

         -D:刪除指定用戶

       例:

        3fb38bf8d782c4b4af80fcc0a4333d58.png

        可以通過cat命令查看密碼文件,可以看出用戶的密碼都是加密存放的。

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

[root@localhost htdocs]# vim /etc/httpd/conf.d/.htpgroup
MyGroup1: tom jerry
[root@localhost htdocs]#

   示例:

      95d28ae7d4ab9e7775b03c7f1da7fc81.png


13、虛擬主機,即可以在一個物理服務器上提供多個網頁站點服務


  有三種實現方案:

    基於IP:爲每個虛擬主機準備至少一個IP地址

    基於PORT:爲每個虛擬主機準備至少一個專用port;實踐中很少使用

    基於hostname:爲每個虛擬主機準備至少一個專用hostname;實踐中很多使用

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

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

  

  每個虛擬主機都有自己的專用配置:

    <VirtualHost "IP:PORT">

      ServerName ""

      DocumentRoot ""

      ServerAlias

      ErrorLog

      CustomLog

   </VirtualHost>

例1:基於ip

 894aedc6bae8ae442de92220c933c782.png

需要有多個IP地址,httpd.conf中配置好後,還需要創建好網頁文件,否則會報錯。日誌文件制定好路徑和文件名後,系統會自動生成的。

例2:基於port

 ea8993ebaa6d4738dfa614fc6eb420fb.png

需要用到除80以外的端口時,需要額外修改Listen指令

0ccdfa9e4224678a0e4d3465c6f49dd6.png

例3:基於hostname

首先需要將NameVirtualHost *:80啓用,2.2需要,2.4不需要啓用,並且將*號改爲監聽的IP地址

310835e7062b3b4488f25ce20a757a34.png

配置如下

f99dedf36417d8c1989a1b82846649f0.png


14、內置的status頁面

可以通過此頁面查看關於服務器的相關信息

73ef5285e98ae3fb8d4a16d6fe69bc0c.png

在Order指令中,可以配置允許那些IP用戶訪問此頁面,這是非常有必要的

配置完畢後,需要重載配置文件才能生效,訪問地址爲: http://x.x.x.x/server-status

如果需要查看更詳細的信息,需要啓用ExtendedStatus On

7c2d023c1ea0f7f583684b81069a9eec.png

實現:基於賬號實現訪問控制,在location中實現



寫的比較潦草,如有遺漏錯誤和爭議之處,歡迎大家的批評指正和討論,謝謝。

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