Apache之配置詳解

Apache基本配置:

1)設置監聽地址和端口:
javascript

   語法:Listen [IP:]PORTphp

   例子:css

         Listen 80     #表示監聽在本機全部接口的80端口上html

         Listen 172.16.100.1:8080  #表示只監聽在172.16.100.1接口的8080端口上java

   注意:linux

         Listen指令能夠重複使用web

         若是apache須要使用多個端口,則必須寫多行Listen選項正則表達式

   配置文件語法測試:apache

        #service httpd configtest    //實際是調用httpd -t
        #httpd -t
        #service httpd restart      //重啓服務

   注意:大多數配置修改後,使用service httpd reload即能生效;後端

         而修改了監聽地址和端口則須要重啓服務。


2)配置服務器HTTP響應頭:

   語法:ServerTokens Major|Minor|Minimal|ProductOnly|OS|Full

   默認值:ServerTokens Full

   說明:此指令控制了Server回送給客戶端的響應頭域是否包含關於服務器OS類型和編譯進的模塊描述信息。

   詳細說明:  

指令 回送格式
ServerTokens ProductOnly 服務器會發送:Server:Apache 
ServerTokens Major 服務器會發送:Server:Apache/2
ServerTokens Minor  服務器會發送:Server:Apache/2.0 
ServerTokens Minimal 服務器會發送:Server:Apache/2.0.41
ServerTokens OS 服務器會發送:Server: Apache/2.0.41 (Unix)
ServerTokens Full 服務器會發送:Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 

   注意:此設置將做用於整個服務器,並且不能在虛擬主機的管理層次上予以啓用或禁用。


3)設置httpd工做目錄:

   語法:ServerRoot "/path/to/somewhere"

   默認值:ServerRoot "/etc/httpd"

   說明:此指令用於指定守護進程httpd的運行目錄,httpd在啓動以後將自動將進程的當前目錄改變爲這個目錄。

   注意:路徑最後不要帶"/"


4)設置PidFile路徑:

   語法:PidFile  path/to/somewhere

   默認值:PidFile run/httpd.pid

   注意:這裏使用的是相對路徑;

         相對於httpd的工做目錄;

         /etc/httpd/run這個目錄是連接到/var/run/httpd目錄


5)設置連接超時:

   語法:Timeout 數字(單位爲秒)

   默認值:Timeout 60

   

6)設置保持鏈接:

   語法:keepAlive {on|off}               //是否啓用長鏈接

         MaxKeepAliveRequests  數字       //設置每一個鏈接的最大請求資源數

         KeepAliveTimeout  數字(單位爲秒) //兩次請求的最大間隔時間

   默認值:    

         KeepAlive Off   

         MaxKeepAliveRequests 100

         KeepAliveTimeout 15

   注意:對動態內容的服務器建議關閉keepalive

   keepAlive配置的合理使用:

在 Apache 服務器中,KeepAlive 是一個布爾值,On 表明打開,Off 表明關閉,這個指令在其餘衆多的 HTTPD 服務器中都是存在的。

  KeepAlive 配置指令決定當處理完用戶發起的 HTTP 請求後是否當即關閉 TCP 鏈接,若是 KeepAlive 設置爲 On,那麼用戶完成一次訪問後,不會當即斷開鏈接,若是還有請求,那麼會繼續在這一次 TCP 鏈接中完成,而不用重複創建新的 TCP 鏈接和關閉 TCP 鏈接,能夠提升用戶訪問速度。

  那麼咱們考慮3種狀況:
   1。用戶瀏覽一個網頁時,除了網頁自己外,還引用了多個 javascript. 文件,多個 css 文件,多個圖片文件,而且這些文件都在同一個 HTTP 服務器上。
  2。用戶瀏覽一個網頁時,除了網頁自己外,還引用一個 javascript. 文件,一個圖片文件。
  3。 用戶瀏覽的是一個動態網頁,由程序即時生成內容,而且不引用其餘內容。

  對於上面3中狀況,我認爲:1 最適合打開 KeepAlive ,2 隨意,3 最適合關閉 KeepAlive

  下面我來分析一下緣由。

  在 Apache 中,打開和關閉 KeepAlive 功能,服務器端會有什麼異同呢?

  先看看理論分析。

  打開 KeepAlive 後,意味着每次用戶完成所有訪問後,都要保持必定時間後才關閉會關閉 TCP 鏈接,那麼在關閉鏈接以前,必然會有一個 Apache 進程對應於該用戶而不能處理其餘用戶,假設 KeepAlive 的超時時間爲 10 秒種,服務器每秒處理 50 個獨立用戶訪問,那麼系統中 Apache 的總進程數就是 10 * 50 = 500 個,若是一個進程佔用 4M 內存,那麼總共會消耗 2G 內存,因此能夠看出,在這種配置中,至關消耗內存,但好處是系統只處理了 50次 TCP 的握手和關閉操做。

  若是關閉 KeepAlive,若是仍是每秒50個用戶訪問,若是用戶每次連續的請求數爲3個,那麼 Apache 的總進程數就是 50 * 3 = 150 個,若是仍是每一個進程佔用 4M 內存,那麼總的內存消耗爲 600M,這種配置能節省大量內存,可是,系統處理了 150 次 TCP 的握手和關閉的操做,所以又會多消耗一些 CPU 資源。

  在看看實踐的觀察。

  我在一組大量處理動態網頁內容的服 務器中,起初打開 KeepAlive 功能,常常觀察到用戶訪問量大時Apache進程數也很是多,系統頻繁使用交換內存,系統不穩定,有時負載會出現較大波動。關閉了 KeepAlive 功能後,看到明顯的變化是: Apache 的進程數減小了,空閒內存增長了,用於文件系統Cache的內存也增長了,CPU 的開銷增長了,可是服務更穩定了,系統負載也比較穩定,不多有負載大範圍波動的狀況,負載有必定程度的下降;變化不明顯的是:訪問量較少的時候,系統平均 負載沒有明顯變化。


  總結一下:
  在內存很是充足的服務器上,無論是否關閉 KeepAlive 功能,服務器性能不會有明顯變化;
  若是服務器內存較少,或者服務器有很是大量的文件系統訪問時,或者主要處理動態網頁服務,關閉 KeepAlive 後能夠節省不少內存,而節省出來的內存用於文件系統Cache,能夠提升文件系統訪問的性能,而且系統會更加穩定。


   補充:
  關因而否應該關閉 KeepAlive 選項,我以爲能夠基於下面的一個公式來判斷。

  在理想的網絡鏈接情況下, 系統的 Apache 進程數和內存使用能夠用以下公式表達:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
  換成中文:
總Apache進程數 = KeepAliveTimeout * 每秒種HTTP請求數 / 平均KeepAlive請求
Apache佔用內存 = 總Apache進程數 * 平均每進程佔用內存數

  須要特別說明的是:
  [平均KeepAlive請求] 數,是指每一個用戶鏈接上服務器後,持續發出的 HTTP 請求數。當 KeepAliveTimeout 等 0 或者 KeepAlive 關閉時,KeepAliveTimeout 不參與乘的運算從上面的公式看,若是 [每秒用戶請求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive請求] 的值小,都會形成 [Apache進程數] 多和 [內存] 多,可是當 [平均KeepAlive請求] 的值越大時,[Apache進程數] 和 [內存] 都是趨向於減小的。

  基於上面的公式,咱們就能夠推算出當 平均KeepAlive請求 <= KeepAliveTimeout 時,關閉 KeepAlive 選項是划算的,不然就能夠考慮打開。


7)設置Prefork MPM(多道處理模塊):

   prefork:預先fork進程模型

          主進程的做用:

                       1,啓動服務時,綁定特權端口(小於1024的端口)

                       2,管理各子進程,包括子進程的建立和銷燬

                       3,讀取並分析主配置文件

                       4,監聽每個客戶端請求並給它派發子進程

   默認值:       

   <IfModule prefork.c>

   StartServers       8     //設置預生成的子進程數

   MinSpareServers    5     //設置預生成最小空閒進程數

   MaxSpareServers   20     //設置預生成最大空閒進程數

   ServerLimit      256     //設置最多啓動多少個子進程數

   MaxClients       256     //設置容許鏈接進來的最大客戶端數量

   MaxRequestsPerChild  4000 //設置每一個子進程可處理的請求數,0表明無限制。

   </IfModule>


   注意:maxclients的值通常小於等於serverlimit;

         maxclients大於serverlimit,當客戶端數量達到maxclients時,則多出serverlimit的客戶端只能排隊等待;

         maxclients小於serverlimit,則總有一部分服務器進程處於閒置狀態;

         一個子進程接受的請求次數超過MaxRequestsPerChild值時,這個子進程會被重啓。

     

   練習題:

         1,假如每個客戶端請求進來,到響應處理結束須要50ms。請問在一秒鐘內一個服務器進程能夠處理多少個這樣的請求?

           答案:20個   1000/50=20

         2,一個子進程響應處理時間依然爲50ms,服務器一共啓動了256個子進程。請問一秒鐘內服務器能夠處理的最大鏈接數?一天內服務器能夠處理的最大鏈接數?

           答案: 一秒鐘:  256*20     

                  一天:    256*20*86400


8)設置Worker MPM(多道處理模塊):

   worker:一個進程生成多個線程,一個線程響應一個客戶端請求;

           一個進程生成的線程不能過多,有一個最佳值。

   啓用worker模型:       

                # vi /etc/sysconfig/httpd      //httpd啓動時會讀取這個配置文件
                  HTTP=/usr/sbin/httpd_worker  //設置使用worker模型
                # service httpd restart        //從新啓動httpd


   默認值:

   <IfModule worker.c>

   StartServers         4    //設置預生成的子進程數

   MaxClients         300    //最多容許鏈接進來的客戶端個數

   MinSpareThreads     25    //最小空閒線程數

   MaxSpareThreads     75    //最大空閒線程數

   ThreadsPerChild     25    //設置每一個子進程數預生成的線程數

   MaxRequestsPerChild  0    //設置每一個子進程最大請求數,0表示無限制

   </IfModule>


   注意:

        到達MaxRequestsPerChild的限制後,子進程將會結束。若是MaxRequestsPerChild爲"0",子進程將永遠不會結束。

        將MaxRequestsPerChild設置成非零值有兩個好處:
           * 能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
           * 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減小活動進程的數量。

        對於KeepAlive連接,只有第一個請求會被計數。事實上,它改變了每一個子進程限制最大連接數量的行爲。

     

    練習題:

           1,假如一個進程最多生成25個線程,指望最多150個客戶端同時鏈接進來,那麼須要啓動多少個進程?

             答案:6個  150/25=6  

           2,依據work的默認設置,請問服務器滿負荷服務時,須要多少個子進程?

             答案:12個  300/25=12


9)設置Event MPM(多道處理模塊):

   event:一個進程處理多個客戶端請求

    

   默認值:

   <IfModule mpm_event_module>

   StartServers      3           //啓動多少個進程 一個進程響應多個用戶請求

   MinSpareThreads   75          //最小空閒線程數

   MaxSpareThreads   250         //最大空閒線程數

   ThreadsPerChild   25          //每一個進程最多生成多少個線程數

   MaxRequestWorkers  400        //最大提供多少個工做線程

   MaxConnectionsPerChild 0      //一個線程響應多少個客戶端請求 0表示無限制 

   </IfModule>

    

10)設置模塊加載

   語法:LoadModule  模塊名稱  模塊路徑

   例子:LoadModule  foo_module modules/mod_foo.so 

   注意:這個模塊路徑是相對於httpd的工做目錄;

         /etc/httpd/modules是連接到/usr/lib64/httpd/modules


11)設置加載擴展配置文件:

   語法:Include conf.d/*.conf


12)顯示服務器運行狀態的詳細信息:

   語法:ExtendedStatus On

   說明:Apache服務器能夠經過特殊的HTTP請求,來報告自身的運行狀態,打開這個ExtendedStatus 參數可讓服務器報告更全面的運行狀態信息。

   注意:當使用"server-status"時,能夠開啓此功能來獲取更爲詳細的服務器狀態信息。


13)配置啓動服務進程的用戶和組:

    語法:User apache

          Group apache


14)設置管理員郵箱地址:

    語法:ServerAdmin root@localhost

    說明:這個指令用來設置服務器返回給客戶端的錯誤信息中包含的管理員郵件地址。便於用戶在收到錯誤信息後能及時與管理員取得聯繫。


14)設置站點名稱:
    語法:ServerName www.example.com:80

    注意:若是設置這項  在啓動apache的時候 apache會去試圖反解當前主機監聽的IP地址去獲得主機名 若是反解不出來 就會報錯。並使用127.0.0.1。

          解決辦法:           

                    1,啓動這個選項 並設置站點名稱

                    2,添加監聽地址對應的主機名 host記錄

                       #vi /etc/hosts

                       172.16.100.1   www.example.com   www


站點發布的基本設置:

1)設置站點主目錄的位置:

   語法:DocumentRoot "路徑"

   默認值:DocumentRoot "/var/www/html"

2)指定首頁文件名:

   語法:DirectoryIndex  文件名

   默認值:DirectoryIndex index.html index.html.var

3)設置特定目錄的相關屬性:

   語法:<Directory "路徑">

          .........

          配置命令

          ........

         </Directory>

   配置命令:

           1,Options [+|-] 選項

             功能:設置目錄的各類特性。主要特性有:

                   ExecCGI      容許執行CGI腳本

                   FollowSymLinks   容許使用符合連接

                   SymLinksifOwnerMatch  若是那個連接目標文件的屬主是當前運行apache程序的屬                         

                                         主,就能夠符號連接

                   Includes     容許使用服務器包含

                   Indexes      容許使用自動生成目錄列表

                   ALL          全部特性,除MultiViews外

           2,AllowOverride  選項

             功能:容許存在於.htaccess文件中的指令類型。選項有:

Authconfig 

容許使用與認證受權相關的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。

fileinfo

容許使用控制文檔類型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文檔元數據的(Header,RequestHeader,  SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain,  CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。

 Indexes  

容許使用控制目錄索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。

Limit 容許使用控制主機訪問的指令(Allow, Deny, Order)。
Options

容許使用控制指定目錄功能的指令(Options和XBitHack)。能夠在等號後面附加一個逗號分隔的(無空格的)Options選項列表,用來控制容許Options指令使用哪些選項。

All 全部具備 「.htaccess」 做用域的指令都容許出如今 .htaccess 文件中。
None .htaccess 文件將被徹底忽略


4)其餘容器類指令:

   1,配置特定URL屬性

       <Location URL-PATH>

        ............

       </Location>

   

       <LocationMatch 正則表達式>

        ............

       </LocationMatch>

   2,配置特定文件屬性

       <Files 文件名>

        .............

       </Files>

   

       <FilesMatch   正則表達式>

        .............

       </FilesMatch>


5)配置語言與字符集:

   設置全部文件的默認語言:

             DefaultLanguage  語言縮寫

   設置指定語言所對應的擴展名:

             AddLanguage  語言縮寫  擴展名

   設置默認字符集:    

             AddDefaultCharset UTF-8


配置虛擬主機:

1)apache支持的虛擬主機種類:

   --基於IP地址的虛擬主機

   --基於域名的虛擬主機

   --基於端口的虛擬主機

   --動態虛擬主機

  注意:虛擬主機和主服務器不能同時使用,關閉主服務器,註釋主服務器的DocumentRoot便可。

2)虛擬主機定義基本格式

    <VirtualHost IP:PORT>

     ServerName

     DocumentRoot ""

    </VirtualHost>

3)基於端口的虛擬主機:

       1,設置監聽端口:

            Listen 80

            Listen 8080

       2,關閉主服務器

            #DocumentRoot "/var/www/html" //註釋主站根目錄

       3,添加虛擬主機記錄

            <VirtualHost *:80>

            ServerName  www.a.com

            DocumentRoot "/web/host1"

            </VirtualHost>

            <VirtualHost *:8080>

            ServerName  www.b.org

            DocumentRoot "/web/host2"

            </VirtualHost>

       4,建立主頁面

            # mkdir -pv /web/host{1,2}

            # echo "<h1>Host1</h1>" >/web/host1/index.html

            # echo "<h1>Host2</h1>" >/web/host2/index.html

       5,客戶端測試

            # elinks http://172.16.100.1 

            # elinks http://172.16.100.1:8080

4)基於IP的虛擬主機: 

       1,添加輔助地址

            # ifconfig eth0:0 172.16.100.2 

       2,添加虛擬主機記錄

           <VirtualHost 172.16.100.1:80>

           ServerName  www.a.com

           DocumentRoot "/web/host1"

           </VirtualHost>

           <VirtualHost 172.16.100.2:80>

           ServerName  www.b.org

           DocumentRoot "/web/host2"

           </VirtualHost>

       3,關閉主服務器

           #DocumentRoot "/var/www/html"

5)基於域名的虛擬主機:

   httpd-2.2: NameVirtualHost 須要啓用;

   httpd-2.4之後不須要這個指令。

       1, 清空輔助地址

           #ifconfig eth0:0 down

       2, 啓用NameVirtualHost

           NameVirtualHost 172.16.100.1:80 //監聽地址和端口 必須與虛擬主機設置中的保持一致      

       3, 添加虛擬主機記錄

   <VirtualHost 172.16.100.1:80>

           ServerName  www.a.com

           DocumentRoot "/web/host1"

           </VirtualHost>

           <VirtualHost 172.16.100.1:80>

           ServerName  www.b.org

           DocumentRoot "/web/host2"

           </VirtualHost>

       4, 添加主機解析記錄

           # echo "172.16.100.1 www.a.com" >>/etc/hosts

           # echo "172.16.100.1 www.b.org" >>/etc/hosts

       5, 測試

           # elinks -dump http://www.a.com   //-dump 表示不進入交互模式 直接查看網頁內容

           # elinks -dump http://www.b.org 

6)動態虛擬主機:

   —基於IP地址的動態虛擬主機
a.給服務器綁定多個IP地址
b.修改httpd.conf
   #vi  httpd.conf
   .........
   virtualdocumentrootip    可變化的路徑
   ........
注:可變化的路徑就是路徑中包含了變量,經常使用的變量格式以下:
    %N  表示客戶機輸入的IP地址(域名)的從左向右的第N部分,其中%0表明整個IP地址(域名)
    %-N表示客戶機輸入的IP地址(域名)的從右到左的第N部分
    %+N表示客戶機輸入的IP地址(域名)的從左邊第N部分到結尾
    %-N+表示客戶機輸入的IP地址(域名)的從右邊第N部分到開頭
如:www.abc.com, %0=www.abc.com,%2=abc, %-1=com%, %2+=abc.com  %-2+=www.abc
例如:virtualdocumentrootip    /web/%0
c.重啓服務


  —基於域名的動態虛擬主機
a.申請多個域名指向服務器
b.修改httpd.conf
 #vi  httpd.conf
   ...........
  virtualdocumentroot    可變化的路徑
   ...........
c.重啓服務
注:配置基於域名虛擬主機時必須將usecanonicalname設爲off


7)混合使用:

       1,添加虛擬主機記錄

          <VirtualHost 172.16.100.1:80>

          ServerName  www.a.com

          DocumentRoot "/web/host1"

          </VirtualHost>

          <VirtualHost 172.16.100.1:80>

          ServerName  www.b.org

          DocumentRoot "/web/host2"

          </VirtualHost>

          <VirtualHost 172.16.100.2:80>

          ServerName  www.c.net

          DocumentRoot "/web/host3"

          </VirtualHost>

          <VirtualHost 172.16.100.2:8080>

          ServerName  www.d.gov

          DocumentRoot "/web/host4"

          </VirtualHost>

      2,啓用監聽8080端口

          Listen 172.16.100.2:8080

      3,配置輔助地址

         # ifconfig eth0:0 172.16.100.2 

      4,建立主頁面

         # mkdir /web/host{3,4}

         # echo "<h1>Host3</h1>" >/web/host3/index.html

         # echo "<h1>Host4</h1>" >/web/host4/index.html


配置用戶認證和主機訪問控制:

1)主機訪問控制:

   做用:限制訪問站點資源的客戶端來源,即設置容許或拒絕訪問服務器資源的來源主機。

   配置指令:

         Order allow,deny|deny,allow

         Allow from  all|IP地址|網絡號       //定義容許列表

         Deny from  all|IP地址|網絡號       //定義拒絕列表

         指令說明:Order指令是用來定義allow和deny哪個爲默認法則;

                   寫在後面的爲默認法則;

                   寫在前面的指令,沒有顯示定義的,即受後面指令控制。

         例子:

               Order allow,deny

               Allow from 172.16.0.0/16    //僅容許這個網段內的客戶端訪問


               Order deny,allow

               Deny from 172.16.0.0/16     //僅拒絕這個網段內的客戶端訪問


               Order allow,deny

               Allow from 172.16.0.0/16

               Deny from 172.16.100.7      //最長匹配原則 172.16.100.7是被拒絕的

   注意:這些命令可放directory/files/location容器中,也能夠放在.htaccess文件


2)用戶認證:

   用戶認證的分類:

                 基本用戶認證

                 摘要用戶認證

   --基於文本文件的用戶認證配置指令:

                 AuthType   basic|digset     //指定用戶認證的類型

                 AuthName   "字符串"         //配置用戶認證的提示信息

                 AuthUserfile  文件路徑      //配置存放用戶口令信息的文件路徑

                 Require  user   用戶名      //指定能夠訪問站點資源的用戶名

                 Require  group  用戶組名    //指定能夠訪問站點資源的組名

                 Require  valid-user         //配置容許全部通過身份驗證的用戶都能訪問資源

                 Authgroupfile   文件路徑    //配置存放用戶組信息的文件路徑

                Satisfy  all|any           //配置主機訪問控制和用戶認證之間的相互關係

                             當一個目錄同時使用主機訪問控制和用戶認證兩種規則時,

                             Satisfy值爲All時,表示必須同時知足兩個規則才能訪問;

                             Satisfy值爲Any時,表示任意一個規則知足均可以訪問。

     注意:這些命令可放directory/files/location容器中,也能夠放在.htaccess文件

   ---爲客戶端訪問建立web用戶: 

             # htpasswd -c -m /etc/httpd/conf/.htpass jerry
               -c  表示建立認證文件
               -m  指定認證文件
             # cat /etc/httpd/conf/.htpass
             # htpasswd -m  /etc/httpd/conf/.htpass tom  
                //若是認證文件已經存在則不須要-c選項,不然會覆蓋以前的文件

     例子:

           1,建立用戶

             # htpasswd -c -m /etc/httpd/conf/.htpass jerry

           2,設置用戶認證     

            <Directory "/web/host1">

            Options None

            AllowOverride  AuthConfig

            AuthName "Realm"

            AuthType Basic           //有基本認證和摘要認證

            AuthUserFile /path/to/passwords   //指定認證文件路徑

            Require jerry tom        //指明哪些用戶能夠訪問  valid-user  表示全部用戶

            </Directory>


     注意:保證apache的啓動用戶對用戶信息文件具備讀權限


3)apache 2.4中使用的新方法:

   基於IP的訪問控制:

         語法格式:      

             Require ip IPADDR

             Require not ip IPADDR

         IP地址格式:          IP 

                   NETWORK/NETMASK

                   NETWORK/LENGTH

   NET 

 例如: 定義172.16.0.0網段有如下三種方式:

              172.16.0.0/255.255.0.0- 172.16.0.0/16- 172.16 

  

   基於主機名的訪問控制:

         語法格式:             

             Require host HOSTNAME

             Require not host HOSTNAME

         主機名部分:

                    能夠是主機名

                    也能夠是域名

         例如:

                    www.abc.com

                    .abc.com


   基於用戶的訪問控制:

         語法格式:              

             Require user USERNAME

             Require group GRPNAME


    特殊約定:     

        容許全部主機訪問:

 Require all granted

 

拒絕全部主機訪問:

 Require all deny

 

配置虛擬目錄和URL重定向:

1)配置虛擬目錄

   --認識虛擬目錄:

                  就是在站點中創建一個連接指向某個物理路徑,可用於發佈站點主目錄之外資源或縮短物理路徑。

   --虛擬目錄配置指令:

                  Alias  URL-path  物理路徑

                      做用:映射URL到文件系統的特定區域

                  AliasMatch  正則表達式  物理路徑

                      做用:使用正則表達式映射URL到文件系統特定區域

   --注意:以上配置命令能夠在主服務器或虛擬主機中配置

   --例子:

           Alias /p_w_picpaths/ "/www/static/p_w_picpaths/"


2)配置URL重定向:

   --認識URL重定向:

                   修改客戶端請求的URL,並將修改後的URL返回給客戶端,由客戶端從新請求修改後的URL。

   --URL重定向配置指令:

                   redirect [狀態] URL-path  URL

                       做用:發送一個外部重定向使客戶端重定向到一個不一樣的URL

                   RedirectMatch  正則表達式  URL

                       做用:基於正則表達式匹配對當前的URL發送一個外部重定向

   --注意:以配置命令能夠放在主服務器、虛擬主機、directory或.htaccess中

   --例子:

           RedirectMatch ^/(.*)$ http://www.new.com/$1


配置我的站點:

userdir模塊:

         # httpd -D DUMP_MODULES | grep user   

模塊功能:

         能夠實現當前主機上能夠正常登陸系統的每個用戶均可以擁有本身獨立的我的站點。

配置指令:  

         <IfModule mod_userdir.c>

 UserDir disabled         //禁用user功能  註釋這行表示啓用這個功能

 UserDir public_html       //設置user的主目錄

 </IfModule>

建立用戶我的主頁:

         # useradd jerry

         # su - jerry

         # mkdir public_html

         # echo "jerry home" >public_html/index.html

         # exit

         # setfacl -m u:apache:x /home/jerry/     

             //必須apache啓動用戶有權限進入這個目錄,而且能讀取裏面的文件


查看服務器狀態:

server-status模塊:

         # httpd -D DUMP_MODULES |grep status    

先肯定該模塊是否已經加載:

         LoadModule status_module modules/mod_status.so

添加容器:      

        <Location /status>

        SetHandler server-status     //處理器

        #AllowOverride AuthConfig    //沒有使用Order allow,deny 基於IP的訪問控制 須要這行

        AuthName "Status"

        AuthType Basic

        AuthUserFile  /etc/httpd/conf/.statuspass

        </Location>

建立訪問用戶:

        # htpasswd -c -m /etc/httpd/conf/.statuspass  status

輸出更爲詳細信息:

        ExtendedStatus On     //開啓status擴展內容  輸出的信息更爲詳細

server-status的輸出說明:

wKiom1O4-1CBJprzAAEpPqYQODU275.jpg


Apache Server Status for 192.168.1.109 服務器的配置地址
Server Version: 服務器軟件版本
Server Built: Apr 3 2014 23:56:16 服務器的安裝日期
Current Time: 服務器當前時間
Restart Time 服務器上次重啓的時間
Parent Server Generation: 2 apache在正常運行後,apache的父進程會重讀配置文件,若是配置文件有改動那麼就強制全部apache的子進程重啓,Parent Server Generation就是記錄這個重啓次數的
Server uptime: 8 seconds apache的持續運行時間
3 requests currently being processed, 5 idle workers 當前任務運行情況,正在處理的請求是3個,空閒的活動是5個

Scoreboard Key的含義:


-
等待連結中。
S 啓動中
R 正在讀取要求
W 正在送出迴應
K 處於保持聯機的狀態
D 正在查找 DNS
C
正在關閉連結
L 正在寫入記錄文件
G 進入正常結束程序中
I
處理閒置
. 尚無此程序


配置代理與負載均衡:

1)正向代理:

   配置正向代理很簡單,此處咱們配置vhost來實現代理, 只須要在瀏覽器的Proxy選項里加入你的Apache配置的vHost主機便可。

   開啓代理模塊:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

  引入vhost文件

Include conf/extra/httpd-vhosts.conf

  若是你想監聽別的端口, 修改Listen參數:

Listen 80
Listen 8087
Listen 8088

  將想監聽的端口全都寫上,相應的, 在vhost文件裏寫上:

NameVirtualHost *:80
NameVirtualHost *:8087
NameVirtualHost *:8088

  NameVirtualHost表示vhost匹配的請求的ip和端口那些會取掃描vhost


  虛擬主機配置:

<VirtualHost *:80>
    DocumentRoot "D:/www/test"
    ServerName www.test.com
     <Directory "D:/www/test">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all    
     </Directory>
    
    #正向代理設置
    ProxyRequests On       #開啓正向代理
    ProxyVia On            
       
      <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1    
      </Proxy>
</VirtualHost>

   配置解釋:

<VirtualHost *:80>

   VirtualHost 後面的參數表示的是該VHost的IP/域名/和端口, 你能夠寫 :

  (1)IP:PORT, 例如 <VirtualHost 175.2.22.65:8088>, 訪問的時候經過IP訪問

    (2) Domain, 例如 <VirtualHost www.test1.com>, 訪問的時候經過域名訪問, 也能夠指定裏面的ServerName來指定域名

      (3) *, 表示匹配全部對Apache監聽主機的請求, 只要是apache監聽到的請求均可以匹配該虛擬主機

     此處表示的就是監聽全部80端口的請求, 可是因爲ServerName裏寫了www.test.com, 因此這個vhost匹配的是www.test.com:80,

  

  如今看正向代理設置那一段:

  • ProxyRequests On:開啓Apache正向代理

  • ProxyVia On:控制位於代理服務器鏈中的代理請求的流向

引用Apache2.2官方文檔中對ProxyVia的解釋以下:


1,若是設置爲默認值Off ,將不會採起特殊的處理。若是一個請求或應答包含"Via:"頭,將不進行任何修改而直接經過。

2,若是設置爲On每一個請求和應答都會對應當前主機獲得一個"Via:"頭。

3,若是設置爲Full ,每一個產生的"Via:"頭中都會額外加入Apache服務器的版本,以"Via:"註釋域出現。

4,若是設置爲Block ,每一個代理請求中的全部"Via:"頭行都將被刪除。且不會產生新的"Via:"頭。

 

  • <Proxy *>...</Proxy>:用來控制誰能夠訪問你的代理


<Proxy *>
     Order deny,allow
     Deny from all
     Allow from 127.0.0.15
</Proxy>

  客戶端設置(以FireFox爲例):


wKiom1O3kbLAhJgOAAHKsIc2WPE420.jpg

  測試:

訪問 www.sina.com,觀察HTTP請求Response:

wKioL1O3kcqRvBzBAADqYYGX67o952.jpg

能夠看到,Via:www.test.com,正向代理成功了。


2)反向代理:

  1,一樣須要開啓代理模塊

  2,配置:

<VirtualHost *:80> 
    DocumentRoot "/www/test" 
    ServerName www.test.com 
    <Directory "/www/test">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory> 
    #反向代理設置
    ProxyRequests Off   #關閉正向代理 也就是啓用反向代理
    ProxyPass /proxy http://www.proxypass.com/proxy
    ProxyPa***everse /proxy http://www.proxypass.com/proxy
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/www/proxypass"
    ServerName www.proxypass.com
    <Directory "/www/proxypass">        
           Options FollowSymLinks        
           AllowOverride All        
           Order allow,deny         
           Allow from all
    </Directory> 
</VirtualHost>

  3,解釋:

     經過在同一臺主機上實現模擬反向代理的效果。

  • ProxyPass /proxy http://www.proxypass.com/proxy : 將 www.test.com/proxy 域下的全部請求轉發給 www.proxypass.com/proxy 代理,例如 www.test.com/proxy/login.php 會交給 www.proxypass.com/proxy/login.php 代理

  • ProxyPa***everse /proxy http://www.proxypass.com/proxy :


  •  www.proxypass.com/proxy/login.php 中有以下代碼:


<?php
     header('Location: http://www.proxypass.com/proxy/result.php');
?>

    www.proxypass.com/proxy/result.php 中有以下代碼:



 <?php
      echo 'in proxypass.com <br>';
 ?>

  4,測試效果:


訪問 www.test.com/proxy/login.php 

  • Apache將請求交給 www.proxypass.com/proxy/login.php 代理,HTTP請求如圖:


wKiom1O3ljCgfkCjAAGA__az7n4469.jpg

 能夠發現其實Request中的請求仍是 www.test.com 的,可是它確實是由 www.proxypass.com 來處理的

  • proxypass.com/proxy/login.php 重定向到 proxypass.com/proxy/result.php

   頁面顯示:


              in proxypass.com

 HTTP請求如圖:


wKiom1O3ltTyXH52AAF5XfelGFo316.jpg

也能夠看到請求依然是 www.test.com/proxy/result.php

  5,總結反向代理相關指令:

ProxyRequests Off

開啓反向代理
SetEnv force-proxy-request-1.0 1 強制使用HTTP/1.0 若是後端應用程序服務器不支持HTTP/1.1
SetEnv proxy-nokeepalive 1 關閉長鏈接 若是後端應用程序服務器不支持長鏈接
proxypass  將一個遠端服務器映射到本地服務器的URL空間中
proxypa***everse
調整由反向代理服務器發送的HTTP迴應頭中的UR


3)負載均衡:

  1,加載負載均衡模塊:

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

  2,相關配置:

    將Apache做爲LoadBalance前置機分別有三種不一樣的部署方式,分別是:

    1,輪詢均衡策略的配置

    進入Apache的conf目錄,打開httpd.conf文件,在文件的末尾加入:

    ProxyPass / balancer://proxy/         #注意這裏以"/"結尾

    <Proxy balancer://proxy>

           BalancerMember http://192.168.6.37:6888/

           BalancerMember http://192.168.6.38:6888/

    </Proxy>


      咱們來觀察上述的參數「ProxyPass / balancer://proxy/」,其中,「ProxyPass」是配置虛擬服務器的命令,「/」表明發送Web請求的URL前綴,如:http://myserver/或者http://myserver/aaa,這些URL都將符合上述過濾條件;「balancer://proxy/」表示要配置負載均衡,proxy表明負載均衡名;BalancerMember 及其後面的URL表示要配置的後臺服務器,其中URL爲後臺服務器請求時的URL。以上面的配置爲例,實現負載均衡的原理以下:


      假設Apache接收到http://localhost/aaa請求,因爲該請求知足ProxyPass條件(其URL前綴爲「/」),該請求會被分發到後臺某一個BalancerMember,譬如,該請求可能會轉發到 http://192.168.6.37:6888/aaa進行處理。當第二個知足條件的URL請求過來時,該請求可能會被分發到另一臺BalancerMember,譬如,可能會轉發到http://192.168.6.38:6888/。如此循環反覆,便實現了負載均衡的機制。


    2,按權重分配均衡策略的配置

    ProxyPass / balancer://proxy/         #注意這裏以"/"結尾

    <Proxy balancer://proxy>

            BalancerMember http://192.168.6.37:6888/  loadfactor=3

            BalancerMember http://192.168.6.38:6888/  loadfactor=1

    </Proxy>


      參數」loadfactor」表示後臺服務器負載到由Apache發送請求的權值,該值默認爲1,能夠將該值設置爲1到100之間的任何值。以上面的配置爲例,介紹如何實現按權重分配的負載均衡,現假設Apache收到http://myserver/aaa 4次這樣的請求,該請求分別被負載到後臺服務器,則有3次連續的這樣請求被負載到BalancerMember爲http://192.168.6.37:6888的服務器,有1次這樣的請求被負載BalancerMember爲http://192.168.6.38:6888後臺服務器。實現了按照權重連續分配的均衡策略。


    3,權重請求響應負載均衡策略的配置

    ProxyPass / balancer://proxy/ lbmethod=bytraffic  #注意這裏以"/"結尾

    <Proxy balancer://proxy>

             BalancerMember http://192.168.6.37:6888/  loadfactor=3

             BalancerMember http://192.168.6.38:6888/  loadfactor=1

    </Proxy>


       參數「lbmethod=bytraffic」表示後臺服務器負載請求和響應的字節數,處理字節數的多少是以權值的方式來表示的。「loadfactor」表示後臺服務器處理負載請求和響應字節數的權值,該值默認爲1,能夠將該值設置在1到100的任何值。根據以上配置是這麼進行均衡負載的,假設Apache接收到http://myserver/aaa請求,將請求轉發給後臺服務器,若是BalancerMember爲http://192.168.6.37:6888後臺服務器負載到這個請求,那麼它處理請求和響應的字節數是BalancerMember爲http://192.168.6.38:6888 服務器的3倍(回想(2)均衡配置,(2)是以請求數做爲權重負載均衡的,(3)是以流量爲權重負載均衡的,這是最大的區別)。


注:每次修改httpd.conf,用apachectl –k restart從新啓動Apache。


配置帶寬和併發鏈接數限制:

1)配置帶寬:

   mod_bandwidth能夠對IP的併發數進行控制,也能夠對下載流量進行控制,也能夠對某個目錄的流量進行控制。

   1,下載地址:http://bwmod.sourceforge.net/

   2,安裝bw_mod:

      若是沒有apxs工具,能夠安裝httpd-devel包。

      # yum install httpd-devel -y

      # tar  -xzvf   mod_bw

      # cd mod_bw

      # apxs -i -a -c mod_bw.c

   3,配置帶寬限制:

      <VirtualHost 172.16.100.1:80>

      ServerName  www.a.com

      DocumentRoot "/web/host1" 

      BandwidthModule On    //

      ForceBandWidthModule On   

      Bandwidth all 1024000   

      MinBandwidth all 50000   

      LargeFileLimit * 500 50000   

      MaxConnection all 6 

      CustomLog "/var/log/httpd/access1_access_log" combined

      </VirtualHost>

    4,參數說明:

  解壓bandwidth的壓縮文件後,裏面有一個mod_bw.txt有詳細的說明和實例,下面是部分參數說明

1,BandWidth localhost 0                                      #對localhost不限速
2,BandWidth 192.168.1.5 102400                       #對192.168.1.5限速爲100KB

3,BandWidth 「u:^Mozilla(.*)」 10240              #用mozilla時限速10KB
4,BandWidth 「u:wget」 102400                      #若是用wget下載時限速10KB

5,MinBandWidth all -1                                      #保證每一個客戶端最高速度可達10KB
6,LargeFileLimit .jpg 100 10240                      #jpg文件超過100KB,限速10KB

7,#下面的510挺好,若是不設置,apache本身會報錯,就根報404差很少,頁面很是的醜
ErrorDocument 510 /exceed_speed.html
BandWidthError 510

8,MaxConnection all 10                                       #全部ip最大鏈接數爲10
9,MaxConnection 192.168.1.5 5                         #192.168.1.5最大鏈接數爲5

2)配置併發鏈接限制:

   1,下載地址:http://dominia.org/djao/limitipconn2.html

   2,安裝mod_limitipconn模塊

      # tar  -xjvf  mod_limitipconn-........tar.bz2

      # cd  mod_limiticonn

      # apxs  -i  -a   -c  mod_limitipconn.c

   3,配置:

      Extendedstatus   on

      <IfModule mod_limitipconn.c>   

            <Location />                                       #對應根目錄   

               MaxConnPerIP 6                                  #最大併發數   

               NoIPLimit p_w_picpath/*                              #對圖片不作限制   

            </Location>   

            <Location /download>                             #對根目錄下面的download   

               MaxConnPerIP 1                                #最大併發數爲1   

            </Location>   

       </IfModule>

    4,參數說明:

       Extendedstatus   on/off         #啓用apache的擴展狀態         
       Maxconnperip   數字             #設置每一個客戶機的最大併發鏈接數  

      

配置規則重寫:

1)認識規則重寫
 規則重寫就是web服務器會改寫客戶機符合特定規則的URL;用於實現資源重定向


2)規則重寫的配置命令
  —rewriteengine   on/off
  設置apache是否啓用重寫引擎


  —rewriterule
  做用:爲重寫引擎定義重寫規則
  格式:rewriterule   正則表達式   替代字符串[標記]
  正則表達式元字符:
          .         任意一個單字符                
          [chars]   字符類:「chars」中的任意一個字符
          [^chars]  字符類:不在「chars」中的字符
          text1|text2   選擇:text1或text2 
          ?          前面的字符出現0或1次
          *          前面的字符出現0或N次 (N>0)
          +          前面的字符出現1或N次(N>1)
          ^          錨定到行首
          $          錨定到行尾
          \字符      轉義字符
  標記:C         鏈接到下一條件規則 ....
          F          強烈禁URL
          G         強烈廢棄URL
          L         結尾規則
          N        跳轉到開頭,從頭再來
          NC      忽略大小寫
          P        強制爲代理
          R       強制爲重定向
  實例:rewriterule    ^/$    http://www.sje.cn  [R.L]


  —rewritecond
  做用:定義重寫發生的條件
  格式:rewritecond   字符串   正則表達式    [標記]
  字符串所包含一些特殊字符
  a.$N  反向rewriterule中的分組
  b.%N  反向rewritecond中的分組
   c. 服務器變量
           %{HTTP_USER_AGENT}   客戶機信息,包括操做系統和瀏覽器信息
           %{HTTP_HOST} 請求的主機名  
           %{REMOTE_ADDR}  客戶機IP地址
           %{REMOTE_HOST}  客戶機的主機名
           %{REMOTE_PORT}  客戶機鏈接服務器全部端口
           %{REQUEST_METHOD}  客戶機的請求方法
           %{REQUEST_FILENAME} 客戶機的請求的文件名
           %{REQUEST_URI}  客戶機請求URI
           %{DOCUMENT_ROOT} 服務器的站點主目錄
           %{SERVER_NAME}  服務器的名稱
           %{SERVER_ADDR}  服務器的IP地址
           %{SERVER_PORT}  服務器的端口號
    特殊比較符號:
          <  小於
          >  大於
          =  等於
          -d  判斷是否是存在的目錄
          -f  判斷是否是存在的普通文件
          -s  判斷是否是爲非空的普通文件
          -x  判斷是否是爲可執行的文件
          -l  判斷是否是爲連接文件
          -U  判斷是否是有效的URL
      標記:
          -NC   忽略大小寫 
          -OR   或
      實例:rewritecond %{REMOTE_ADDR} ^192.168.3.1


  --rewritebase 
  做用:設置目錄級重寫的基準URL
  格式:rewritebase  URL-PATH


3) 規則重寫的應用案例
     --移動站點主目錄到站點的/bbs路徑下
     rewriteengine on
     rewriterule  ^/$    /bbs [R,L]
     -利用規則重寫實現基於域名的虛擬主機
    RewriteEngine on
    RewriteCond   %{HTTP_HOST}    ^www\.abc\.com$
    RewriteRule   ^(.+)     %{HTTP_HOST}$1   [C]
    RewriteRule   ^www\.abc\.com(.*) /web/abc$1
 
    RewriteCond   %{HTTP_HOST}    ^www\.linux\.cn$
    RewriteRule   ^(.+)     %{HTTP_HOST}$1   [C]
    RewriteRule   ^www\.linux\.com(.*) /web/linux$1


配置使用SSL實現https訪問:

1,安裝SSL模塊:

 # yum -y install mod_ssl

2,自建CA: 

# cd /etc/pki/CA

# (umask 077;openssl genrsa -out private/cakey.pem 2048)  //產生CA服務器私鑰

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365  

                                                         //生成CA自簽名證書

# touch index.txt

# echo 01 >serial

3,生成證書籤發請求:

# cd /etc/httpd/conf

# mkdir ssl

# cd ssl

# (umask 077;openssl genrsa -out httpd.key 1024)   //生成私鑰文件

# openssl req -new -key httpd.key -out httpd.csr   //生成證書請求文件

4,CA完成對證書的簽發:

# openssl ca -in httpd.csr -out httpd.crt -days 365   //CA簽署證書

5,修改配置文件:

# vi /etc/httpd/conf.d/ssl.conf

      <VirtalHost 172.16.100.1;443>

      DocumentRoot "/web/host1"

      ServerName www.a.com 

      SSLEngine on   //啓用SSL引擎

      SSLProtocol all -SSLv2   //協議版本

      SSLCertificateFile  /etc/httpd/conf/ssl/httpd.crt   //證書文件

      SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key   //指定服務器私鑰文件

      </VirtualHost>

6,測試:

# openssl s_client -connect www.a.com:443 -CAfile /etc/pki/CA/cacert.pem
相關文章
相關標籤/搜索