LAMP架構之:httpd.conf配置文件解析

LAMP架構之:httpd.conf配置文件解析

         各位小夥伴,有一段時間沒寫web架構方面的內容了,今天聊一聊WEB架構中apache的配置文件httpd.conf.這裏的配置文件是基於apache2.2的版本,之所以沒用2.4的版本,是因爲現在系統自

帶的都是2.2的版本,rpm包安裝起來也方便,如果你也是rpm包安裝,也能保證咱倆的配置是一樣的,而且默認的rpm包安裝所有的配置都會在一個文件中,這個相比分割開來要容易說一點。但是我還是會提一下2.4相比2.2中有幾個必須要知道的變化,至於其他的內容基本都是一樣的。。

         下面提煉出了2.2中所有可用的選項,將逐一解析並測試:

Global配置段:

#ServerTokens OS   

上面這個選項是設置服務器響應頭中,server字段的返回信息,這些信息還會在瀏覽器訪問報錯的時候顯示出來,默認參數爲OS,下面分別看一個例子:

瀏覽器輸出:

wKiom1QWnjax9L0lAAD1iiemNME607.jpg

看到沒,橫線下面的一行,可見web服務器使用的是apache軟件且版本號爲2.2.15,系統是centos。由此可見信息量是非常的大,很容易造成一些安全隱患。

 

再看一下響應頭中的信息:

wKioL1QWnmrTLlgGAAFuckuKfhs762.jpg

看到沒,所用軟件的版本和系統信息。

 

鑑於上面的情況,可見如此的設置是相當的不安全,因此當我們在考慮httpd安全的時候,這就是一個需要修改的地方。

 

從官方的文檔中可知,在指令的值有如下:

Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

還敢給出了幾個例子:
ServerTokens Prod[uctOnly]

服務器會發送(比如) Server: Apache

ServerTokens Major

服務器會發送(比如) Server: Apache/2

ServerTokens Minor

服務器會發送(比如) Server: Apache/2.0

ServerTokens Min[imal]

服務器會發送(比如) 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

 

從上面的信息可見,最安全的是Prod[untOnly],因此在考慮安全的時候就設置爲該參數。但是要注意的是,在修改配置文件的時候你只能設置爲Prod,而不是Prod[untOnly],否則你的信息還會多一點。請自行測試,看看效果。

 

#ServerRoot "/etc/httpd"

該指令設置整個httpd配置文件的根目錄所在,httpd服務會默認從該指令的設置來尋找httpd.conf配置文件等其他配置文件以及模塊文件等。

 

PidFile run/httpd.pid

該指令設置apachepid文件,這裏要注意的是,這裏使用了相對路徑,那到底文件在哪呢?因此要知道這裏的相對路徑是相對於ServerRoot指令設置根目錄而言的。

 

Timeout 60

該指令設置apache建立連接時的超時時間。。官方給出的解釋如下:

TimeOut指令用於設置Apache等待以下三種事件的時間長度:

接受一個GET請求耗費的總時間。

POSTPUT請求時,接受兩個TCP包之間的時間。

應答時TCP包傳輸中兩個ACK包之間的時間。

httpd.conf配置文件中說是在接受請求前和發送響應前的超時時間。。

 

KeepAlive Off

該選項控制的是TCP連接的持久性,是否開啓TCP的持久連接。持久連接可以讓一次成功的tcp三次握手建立的鏈接通道在一段時間內保持狀態,後續的請求將不在需要經過tcp的三次握手重新建立通道,而可以直接使用其傳輸數據。但是持久連接也不宜過長,過長會導致其它客戶端的請求不能建立連接,因爲對服務器來說連接數還是有限制的,這要看你服務器的資源。

MaxKeepAliveRequests 100

該選項設置持久連接通道最大可以處理的請求書,一旦超過這個請求數將立即關閉該通道重新建立連接。如果設置爲0則表示沒有任何限制,但通常不建議。

KeepAliveTimeout 15

該選項設置的時候持久連接的超時時間,當兩次請求之間超過這個時間限制,就關閉持久連接通道。

 

 

<IfModule prefork.c>

StartServers       8      //服務啓動時默認啓動的子進程數。

MinSpareServers    5   //服務最小空閒的子進程數,當空閒進程輸低於5個會啓動新的進程

MaxSpareServers   20    //服務最大空閒的子進程數,當空閒進程大於20時,會殺掉多餘的空閒進程。

ServerLimit      256      //這個設置是限制了服務器在活動期間MaxClients的最大值,MaxClients的設置不能超過這裏的設置

MaxClients       256   //設置允許啓動的最大服務子進程數,也就是最大併發連接數

MaxRequestsPerChild  4000   //一個子進程允許最大處理多少個請求,超過這裏的請求數將立即關閉該子進程。。

</IfModule>

上面這段內容和下面worker.c的內容是apache中相當重要的內容,這兩端內容設置的都是apache自身的處理引擎的設置。從apache2.2開始,還支持了event機制的引擎。這些內容配置控制了引擎的工作方式。其次這裏我還要說的是IfModule的使用,通常使用該形式的內容都是靜態模塊的使用方式,所謂靜態模塊都是被直接編譯進apache中的,而動態模塊都是通過LoadModule指令來添加的。但是即使是動態的模塊,你也可以使用IfModuleL以靜態的形式來配置,不過事先還是要使用LoadModule來導入模塊。

 

好,到這裏,可能你有好幾個疑問,下面就嘗試着來探討你心中的疑問:

1.爲什麼說子進程?

讀了上面的信息,你應該能發覺解釋每條指令的時候都是說的子進程,這是爲什麼?因爲apacheprefork模式是預派生的進程模式,既然是預派生,那麼肯定是事先要生成好進程,但是進程又會被關閉,那是什麼來預派生?因此這裏就涉及到了父進程和子進程的概念。Httpd服務啓動後除了子進程外,還有一個獨立的父進程,父進程不處理任何的請求,只負責監聽子進程的狀態,從而適當的關閉子進程,產生子進程。父進程的用戶都是root用戶,而子進程的用戶是你在配置文件中通過User來設置的用戶。下面看一下本人啓動的進程信息:

root      1339  0.0  1.4 175696  3644 ?        Ss   11:49   0:00 /usr/sbin/httpd

apache    1341  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1342  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1343  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1344  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1345  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1346  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1347  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

apache    1348  0.0  1.2 175828  3012 ?        S    11:49   0:00 /usr/sbin/httpd

看到沒?除了8個子進程,還有一個父進程,屬主是root用戶。

 

2.到底最大併發連接數是什麼?

談到最大併發連接數是個很敏感的話題,因爲當請求數,進程數,併發數這些東東聚到一起的時候就很容搞不清楚什麼是什麼。好,分析一下。

從客戶端來說,客戶端發起的是一個一個的請求,那麼對與客戶端來說可以說一個請求就會是一個連接,就會是一個連接數。但是對於服務器端就不是了,這要看服務器端是用什麼機制來處理客戶端的請求的。對於web而言,服務器的處理機制有基於進程的,基於線程的,基於事件機制的等,這是常用的幾個。以這裏的prefork而言,是基於進程的,那麼當客戶端的一個請求過來之後,服務器端是用一個進程去跟客戶端的一個請求建立連接(tcp三次握手),此時對於服務器端而言一個進程就是一個連接,同一時間最大開啓多少個進程就是最大併發連接數。到這裏你是否懂了?所以看最大併發連接數要看服務端基於的機制,當然這是理論值。實際情況要看你的服務器個方面資源的配合。例如這裏的MaxClients256,有人會說好少啊,這怎麼行?但是你要知道這是默認值,官方肯定是要滿足大部分的需求。你可以根據你的需求進行調整,但是進程相比線程是特別耗資源的,配置不當當大併發的時候可能你係統的內存就崩潰了。從上面的信息也可以看到還沒怎麼配置,一個httpd進程什麼都還沒弄已經佔了3M的常駐內存空間。所以怎麼協調你自己看這辦。。

 

 

3.MaxRequestsPerChildMaxKeepAliveRequests的對比理解

這個地方可能又有人有疑問了,這兩個指令到底怎麼理解?keepalive說是處理這麼多的請求數就關閉,而PerChild又說處理這麼多的請求書就關閉,那不是有衝突嗎?好,這裏要說明一下。Maxkeepaliverequests是針對鏈接通道而言的,一個持久的連接通道最大處理這麼多的請求數,超過將關閉。而maxrequestsperchild則是針對進程而言的,httpd的一個子進程允許最大處理這麼多的請求數將被父進程回收重新打開新的子進程。那也就是說在持久連接超過請求數後,只是關閉了這個連接通道,對子進程來說只是關閉了一個子進程,而該子進程在生存期內還可以與客戶端的其它請求建立連接。。好,這個問題就說到這裏。。。

 

 

<IfModule worker.c>

StartServers         4      //服務進程的進程數,這裏包括了父進程和子進程,父進程只有一個。

MaxClients         300    //服務開啓的最大進子程數

MinSpareThreads     25    //服務最小空閒的線程數

MaxSpareThreads     75   //服務最大空閒的線程數

ThreadsPerChild     25    //每個子進程持續的線程數,也就是保證每個子進程最少的線程數,這裏包括活動的和非活動的。注意要和空閒區分開

MaxRequestsPerChild  0   //每個子進程處理的最大請求書,0表示無限制

</IfModule>

以上段的配置就是apache的線程引擎的配置,鑑於在prefork中解釋的內容,這裏只提一下併發數的情況,這裏的併發數就不是看子進程了,而是線程數。這裏每個子進程的常駐線程是25,在高併發的時候可以不斷的增加,但是空閒時,每個子進程都會保持25個在線線程。有上面的信息可見併發數應該是maxclients*threadperchild的值,就以默認的來講以及支持併發7500了。想比prefork可以說提高了n倍。只要服務器資源夠用,能頂的住壓力,那麼併發可以無限制的擴大,但是一般不會讓其無限制擴大。可以通過ServerLimitThreadLimit來限制MaxClientsThreadsPerChild的值。

 

進程與線程的總結:

1.進程相比而言消耗系統的資源,而線程的開銷要小的多

2.進程和線程的上下文切換都會造成抖動,但是進程模式不影響其他進程,而線程模式由於共享進程資源,很可能造成其他線程不穩定

3.進程模式一個進程出現問題,不會對其他進程造成影響,而線程模式,一個線程崩潰導致進程崩潰,會導致該進程控制下所有的線程全部崩潰。

4.進程相比線程來說要穩定的多的多,但是線程支持的併發是進程不可比擬的(統一資源下)

 

這裏略說一下event,基於事件的機制,現在nginx默認就是使用epoll的事件機制,事件機制更誇張,一個線程通過控制n個信號令來處理n個請求。啊哦。。

 

Listen 80

//該指令設置web服務監聽的端口號,也可以設置監聽的套接字。如果值設端口好,表示監聽在任何ip地址上

 

LoadModule auth_basic_module modules/mod_auth_basic.so

LoadModule auth_digest_module modules/mod_auth_digest.so

上面的指令是用來設置動態加載模塊,這裏要注意的是加載模塊的寫法以及模塊在系統中的位置,這個就不多說了。。

 

Include conf.d/*.conf

該指令用來設置包括配置文件外的設置,可以用來擴展配置文件。這裏所包括的配置文件都將被httpd進程所解析

 

ExtendedStatus On

該選項控制的是server-status的功能,打開服務的擴展信息功能。有時候想通過httpd自身的server-status擴展信息功能來查看當前的httpd狀態信息,就需要開啓該選項。但是從服務的運行效率來講,是不建議開啓的。至於server-status怎麼配,在下面在講。。。

 

User apache

Group apache

上面兩行內容就是設置apache子進程運行的用戶和組信息。。。

 

到這裏爲止,httpd的全局段的配置就結束了。。。全局的配置對後面所有的內容都生效。。。

 

MAIN配置:

         接下來的內容將是MAIN的配置,即httpd的主配置段內容。其實主配置段內容就是一個特別的虛擬主機的配置,裏面的任何內容都可以放到虛擬主機中,但當中的很多內容又對虛擬主機生效。但是一旦配置了虛擬機主機,MAIN裏面的ServerName配置的虛擬主機就失效了。

 

ServerAdmin root@localhost

該選項設置的是管理員的郵箱地址,隨便設,這是在服務器返回給客戶端的錯誤信息中所包含的郵箱地址,方便客戶端與你取得聯繫。通常會在定義的錯誤頁面中定義到該郵件地址的超鏈接,看一個例子:
wKioL1QWnorRxHluAACzGZY9m8M110.jpg

看到上面有一個webmaster的超鏈接沒,那個點開就會打開一個發送郵件的窗口,此時的收件人就是你ServerAdmin這裏設置的收件人。這個錯誤也沒是apache自帶的錯誤頁面,在/var/www/error/下面。這是通過httpd.conf裏面的ErrorDocument來定義錯誤代碼到這個頁面的,至於怎麼設置,請往下看。。。

 

ServerName 0.0.0.0:80

該選項設置的是虛擬主機名,但是它是相對於MAIN配置段而言的。。是默認的虛擬主機,可以設置成ip就用ip訪問,設置成域名就用域名訪問。。

 

UseCanonicalName Off

該指令我就不解釋了,我覺得手冊中解釋的挺好,直接拉過來給你看看:

在很多情況下,Apache必須構造一個自引用URL(即一個指回相同服務器的URL)。使用 UseCanonicalName On 會將ServerName這個域名用於所有自引用URLSERVER_NAMECGI中的SERVER_PORT

 

設置爲 UseCanonicalName Off 時,如果客戶端提供了主機名和端口(否則將如上所述使用標準域名)Apache將會使用這些信息來構建自引用URL。這些值與用於實現基於域名的虛擬主機的值相同,並且對於同樣的客戶端可用。CGI變量SERVER_NAMESERVER_PORT也會由客戶端提供的值來構建。

 

用這樣的方式成功解決問題的例子如下:在一個局域網內,您想讓連接主機的用戶使用諸如www這樣的短域名進行訪問。您會注意到,如果用戶鍵入了類似http://www/splat這樣的短域名和目錄的URL,並且沒有最後的斜線,Apache會將他們重定向到http://www.domain.com/splat/。如果您在這個目錄上啓用了身份驗證,這會導致用戶必須進行兩次驗證:一次針對www而另外一次針對www.domain.com(參見關於此主題的FAQ獲得更多信息)。但如果UseCanonicalName設爲 Off Apache就會重定向到http://www/splat/

 

第三個可選項是 UseCanonicalName DNS ,用於爲大量基於IP的虛擬主機支持那些古董級的不提供"Host:"頭的瀏覽器使用。使用這個選項時,Apache將對客戶端連入的服務器的IP地址進行反向DNS查詢,以構建自引用URL

 

這裏值說一句,通常情況下,都是將其設爲off,這也是apache的默認設置,如果你有特別的需求可以根據情況設置爲其他的參數。

 

 

DocumentRoot "/var/www/html"

//該選項是設置網站的根目錄,默認情況下訪問的站點內容,都是該目錄下的內容。。。

 

<Directory  />

    Options FollowSymLinks

    AllowOverride None

</Directory>

上面的內容是設置目錄“/”的權限,這裏的“/”就是系統的文件系統的根目錄。這裏其實是apache的一個預設,因爲即使你使用正則表達式也不能匹配這個符號,爲了防止安全隱患所以做了一個預設,在根目錄中允許從任何地址進行訪問,但是Options只有FollowSymLinks。而官網的建議是Deny from all。默認是Allow from all。這裏的功能有點隱晦,自行測試吧。通常保持默認即可。。

 

這裏要是說明一下的是<Directory>…</Directory>這種形式,這種形式用來設置具體某個目錄的訪問權限,使用該方法,你可以任意設置你想設置的目錄的權限。。

 

 

<Directory "/var/www/html">

 

    Options Indexes FollowSymLinks

 

    AllowOverride None

 

    Order allow,deny

    Allow from all

 

</Directory>

 

上面內容的設置也是一樣,設置目錄/var/www/html這個目錄的權限,這也是網站默認的根目錄。

 

在這裏要重點說一下三個知識點:Options AllowOverride 以及order allow,deny的問題。

Options

該指令設置的是目錄具有的功能特性。在apache2.2中有以下幾個功能特性選項:
None Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews All,下面將一個一個解釋,在這裏先說明下,如果你看過官方手冊,你會發現上面少了一個IncludesNoexec,上面的內容是在httpd.conf中說明,至於配置文件中踢掉的特性,這裏就不在說了。

None:設置該選項,表示關閉目錄的任何功能特性

Indexes:該特性是開啓目錄的索引功能,所爲索引就是瀏覽器訪問時會顯示一些列的文件列表,這個功能我想大家都會,就不解釋了。

Includes:這個特性是開啓服務器端包含功能,主要用在SSI文檔的處理(shtml),如果你看到開發的代碼中有shtml這樣的文檔,那你就要注意了是否需要開啓Includes特性。

FollowSymLinks:允許該目錄中使用鏈接文件,鏈接到網站外部目錄中的文件

SymLinksifOwnerMath:允許網站使用鏈接文件,但是鏈接所指向的文件必須與此鏈接文件的屬主相匹配,才允許訪問

ExecCGI:允許該目錄執行CGI的腳本

MultiViews:啓用服務器端的多內容視圖協商的功能。所爲協商功能,就是在客戶端訪問時,沒有寫出完全的文件名稱,但是服務器會根據客戶端的訪問請求進行自行的協商功能,選項最符合客戶端需求的文件予以響應。下面看一個例子:

假設設置如下:

wKioL1QWnrijS43SAACupdE-nM8518.jpg

 

瀏覽器訪問測試:

wKioL1QWnsqzEKPTAAFpx5qQOuI750.jpg

若上面所示,其實要訪問的文件是index.html,但是寫出了index,此時報404的錯誤。下面再看MultiViews的訪問效果:

wKioL1QWnuPR1XrMAACugdqw4lE448.jpg

 

瀏覽器訪問:
wKiom1QWnt-AW6FlAADQ-Jjr7f4813.jpg

 

看到沒,這下就能訪問了,這就是協商的特性。。

All:如果沒有設置任何的功能特性,那麼默認情況下就是All,但是使用了All,不包括MultiViews。至於實際效果,請自行測試。。

 

特殊用法:+/-

         關於這個用法有點特殊,這要是當對同一個目錄設置多個Options時,到底那些特性生效。先解釋下+/-,+表示該特性是一定包含,-表示該特性一定是禁止。下面通過舉個例子說明一下到底是什麼意思

例子1

<Directory  /var/www>

Options Indexes FollowSymLinks

</Directory>

<Directory  /var/www/html>

Options Includes

</Directory>

 

在這裏例子中,沒有使用任何的+/-,因此默認情況下對於多個Options是不合並的,而且最精確的設置優先。在對/var/www目錄設置時,其實是包含了下面的子目錄html,但是又對html子目錄單獨設置了,在加上不合並的特性,此時子目錄html只有Includes的特性。

例子2:

<Directory  /var/www>

Options Indexes FollowSymLinks

</Directory>

<Directory  /var/www/html>

Options +Includes -Indexes

</Directory>

 

在上面的這個例子裏面,有了+,那麼多個Options就要合併,但是-表示明確禁止該特性,因此html子目錄最後的特性就是 Includes FollowSymLinks

 

通過上面兩個例子的類比,應該可以知道+/-的含義了。。

 

 

AllowOverride: 確定允許存在於.htaccess文件中的指令類型,是否允許覆蓋定義的訪問權限

         該指令後面也可以跟好幾種指令類型,但是有的並不常用,這裏只介紹幾個常用的

         None:表示不允許使用.htaccess文件來設置目錄的權限,即使你在目錄下定義了.htaccesshttpd進程並不會去掃描它

         All:這是默認的設置,如果什麼都沒有設置,默認情況下表示允許使用.htaccess文件,而且允許使用所有的指令類型

         AuthConfig:該指令類型表示允許使用用戶名密碼的方式來設置目錄的訪問認證,這是比較常用的.格式爲:
                   AuthName:     //設置認證的相關描述信息,隨便寫

                   AuthType:   basic   //設置認證的類型,這裏有兩種類型basic,digist,通常都會使用basic

                   AuthUserFile   //指定用戶密碼信息文件

                   AuthGroupFile   //知道用戶組文件

                   require user username/valid-users    //設置哪些用戶具有權限 user username用來指定具體的用戶,而valid-users表示AuthUserFile中所有用戶都具有權限。如果是組怎麼辦呢?group groupname

         FileInfo:該指令表示允許使用控制文檔相關的指令。這裏面有一個很重要的就是rewrite規則,這個在生產服務器中基本都是會使用的,所以如果你不設置爲all,至少要設置爲FileInfo

 

注意:上面的指令既可以單獨的寫在.htaccess文件中,也可以直接寫在httpd.conf配置文件中。至於其具體的用法和效果,這裏不做測試了,將會在apache必知必會中予以測試和體驗。。

 

這裏還想點出一個知識點就是Satisfy的使用,在上面的內容中沒有寫出來,默認情況下沒有就是Satisfy All 表示客戶端訪問是先經過order設置的ip認證,然後在進行用戶名認證。但是有時你可能會遇到這樣的情況,比如對於外部用戶你需要用戶名和密碼認證,但是對於內部用戶則不需要用戶名密碼認證,而是能直接訪問,怎麼辦呢?這個時候就需要Satisfy的設置了,看一個例子:

   AllowOverride All

    AuthName "auth realm"

    AuthType basic

    AuthUserFile /etc/httpd/htpasswd.user

    Require valid-user

    Allow from 10.0.10

Satisfy any

 

從上面的信息看出,設置了某個目錄的認證,但是最後兩句話你可能沒見過。Allow from ip Satisfy any 就設置了來自10.0.10網段的ip地址不需要進行用戶名密碼的認證即可訪問。因此你可以知道Satisfy any 就是取消上面對應的客戶端的認證需要,這裏的測試也會在apache必知必會中體現

 

 

Order:該指令用來限制客戶端的訪問

         Order是順序的意思,常見的是兩種寫法: Order allow ,deny 或者Order deny,allow

          接下來就是allow from clinets或者deny from clients,這裏的clients寫法很多,可以是ip地址,可以是ip段,可以是具體域名,可以是域名後綴等,自行查看。

 

這裏要強調的是,allow,deny最後的結果到底怎麼判斷,根據官方手冊和測試經驗得出判斷方法:後定義的爲默認規則且優先檢查。例如:order allow ,deny deny爲默認規則,先檢查deny規則,如果禁止則明確禁止,再檢查allow,如果明確允許則允許,如果都不匹配,則執行默認規則deny

解析一個例子:
Order allow,deny

Allow from 10.0.10.254

Deny from 10.0.10.254

Allow from 10.0.10.11

 

看上面的例子,orderallowdeny,這裏的最終結果是隻允許從10.0.10.11來訪問,其他地址的全部拒絕。你可能不能理解,從你的第一感覺來看,allow排在deny的前面,先進行allow匹配,如果你是從10.0.10.254來訪問,你感覺應該可以訪問啊第一個就匹配放行了,可以如果你測試你就會發現被禁止了 403的錯誤。再看一個例子:

Order deny,allow

    Deny from 10.0.10.254

    Allow from 10.0.10.254

Allow from 10.0.10.11

這裏也是一樣,你可能會覺得從order的順序來看,應該禁止10.0.10.254的訪問,是測試時你會發現被允許了。所以綜合這兩個例子可以看出確實是上面總結的情況:後定義的爲默認規則且優先檢查 .

其實如果你按照官方手冊的來排也沒錯,但是有點繞,可能會進程確定錯誤。但是按照這個總結的絕對沒錯,而且結果是一樣的。

 

注意:這裏要提一下的是,在apache2.4中,已經不再是order allow deny這種形式了,而是變成了Require這種形式。例如:

Require all granted

Require all denied

Require ip 10.0.10.11

Require host www.lxm.com等,具體的測試在必知必會中在介紹,這裏你要先知道這麼個情況。。。

 

 

 

<IfModule mod_userdir.c>

    UserDir disabled

 

    UserDir public_html

 

</IfModule>

 

<Directory /home/*/public_html>

    AllowOverride FileInfo AuthConfig Limit

    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

    <Limit GET POST OPTIONS>

        Order allow,deny

        Allow from all

    </Limit>

    <LimitExcept GET POST OPTIONS>

        Order deny,allow

        Deny from all

    </LimitExcept>

</Directory>

 

上面的這段內容,是跟apache設置個人站點有關的。有時候搭建web站點可能是給不同的個人來使用的,這個時候就要用到上面個人站點的設置了。至於怎麼配置,這裏先不說,在apache必知必會中會給出具體配置方法,但是這裏要說明一點的就是Limit的使用,看上面的例子就可以知道,這是用來針對http協議頭部中的http方法來過濾的。

 

 

DirectoryIndex index.html index.html.var

該指令設置的目錄索引文件,當客戶訪問站點時,會在匹配的目錄中按照這裏的次序以此超找對應的文件響應給客戶,直到找到爲止,如果都不符合,則報錯。

 

AccessFileName .htaccess

該指令設置的是分佈式配置文件名,這裏設置的文件名,在每個目錄中都會被查找,前提是使用AllowOverride開放了每個目錄的分佈式文件的使用,這裏的文件名可以隨便寫,當考慮安全的時候,完全可以修改掉,只要後續的配置保持一致即可。

 

<Files ~ "^\.ht">

    Order allow,deny

    Deny from all

    Satisfy All

</Files>

上面這段內容是設置以.ht開頭的文件的訪問權限,從這裏可以知道<Files..></Files>的用法,其是用來匹配某個文件的

 

TypesConfig /etc/mime.types

該指令設置的是mime的類型,該文件中的mime類型都將被支持。至於什麼是mime自行百度,這個東西基本上不用管。

 

DefaultType text/plain

該指令設置mime的默認類型,當服務器無法確定某個文檔的mime類型時,就會向客戶端返回這裏的默認mime類型。

 

 

<IfModule mod_mime_magic.c>

    MIMEMagicFile conf/magic

</IfModule>

這段內容也是設置跟mime有關的東東了,基本不用管

 

HostnameLookups Off

該指令設置是否啓用DNS的反向查找,通常在互聯網上,除了郵件服務器會啓動DNS的反向超找,其他的基本不會啓用,因此這裏選擇關閉,也是優化httpd的一個知識點

 

EnableMMAP on

該指令設置的是內存映射的功能,將內層直接映射到kernel buffer,默認情況下是開啓的,這是一種優化機制,將內存映射到kernel buffer,這樣大大提高了底層數據的傳輸效率,加快了響應速度

 

EnableSendfile on

該指令設置的是kernel sendfile的功能,這個需要os的支持,目前RHEL6以後基本都支持。這也是一種優化的功能,默認也是on

 

注:上面兩個功能都跟web架構的調優有關,關於這些內容,將專門弄一個web架構分析整理出來。這裏有點忘了,哈哈哈。。

 

ErrorLog logs/error_log

該指令設置的是錯誤日誌的記錄文件

 

LogLevel warn

該指令設置的是日誌的級別,關於日誌有那些級別,百度吧。

 

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

上面的內容,以LogFormat開頭的都是設置訪問日誌的記錄格式,記錄格式你可以設置多個,對於不同的站點調用需要的記錄格式即可,後面的combined common等這些就是日誌記錄格式的名稱,供後面調用

 

CustomLog logs/access_log common

該指令設置的就是訪問日誌文件以及日誌文件的日誌記錄格式

 

 

ServerSignature On

該指令設置服務器生成頁面的頁腳,通常是在錯誤頁面中,增加一些必要的信息,默認爲on,設置爲off,則不會生成頁面的頁腳信息。包括前面的郵件地址的就必須開啓這個功能。

 

 

Alias /icons/ "/var/www/icons/"

該指令是用來設置訪問的url別名,其實就是映射url到特定的目錄,使用該方式可以將不是站點默認目錄的內容給包含進來供客戶端訪問

 

<IfModule mod_dav_fs.c>

    DAVLockDB /var/lib/dav/lockdb

</IfModule>

該模塊設置是設置webdav的功能,關於webdav的設置將會在apache必知必會中討論一下。

 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

該指令設置CGI腳本的url映射

 

 Redirect permanent /foo http://www.example.com/bar

該指令設置url的重定向功能

 

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8

該指令設置的是索引的選項,就是web訪問時以一個列表的形式展示目錄下的內容,這裏的設置就是頁面怎麼佈局或者頁面特性的展示

 

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

 

AddIconByType (TXT,/icons/text.gif) text/*

AddIconByType (IMG,/icons/image2.gif) image/*

AddIconByType (SND,/icons/sound2.gif) audio/*

AddIconByType (VID,/icons/movie.gif) video/*

 

AddIcon /icons/binary.gif .bin .exe

AddIcon /icons/binhex.gif .hqx

AddIcon /icons/tar.gif .tar

AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv

AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip

AddIcon /icons/a.gif .ps .ai .eps

上面一段內容的設置是告訴服務器針對什麼樣格式的文本以上面樣的圖片標識,這通常用在fancyIndex上,這裏的圖片你可以自行設置

 

DefaultIcon /icons/unknown.gif

該指令是設置默認的圖片,當上面的AddIcon都不匹配時,就調用這裏的設置

 

AddDescription "GZIP compressed document" .gz

AddDescription "tar archive" .tar

AddDescription "GZIP compressed tar archive" .tgz

上面這段內容一看就是針對不同格式結尾的文件進行描述

 

 

ReadmeName README.html

該指令設置README文檔,這裏設置的文件會插入index list中的尾部,你可以在該文件中寫入你想告訴客戶端的內容,客戶端可以下載該文件進行查看

 

HeaderName HEADER.html

該指令設置的文件將會插入到index list的頭部

 

DefaultLanguage nl

該指令設置頁面的默認語言,通常是被註釋掉的,非特殊情況下不要使用

 

AddLanguage ca .ca

AddLanguage sv .sv

AddLanguage zh-CN .zh-cn

AddLanguage zh-TW .zh-tw

上面的指令設置的是增加web站點支持的語言類型

 

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

設置的是語言優先級,當客戶端沒有設置語言偏好的時候,就以這裏設置的語言優先級來選擇匹配。。

 

ForceLanguagePriority Prefer Fallback

關於這個解釋,看手冊了,巴拉巴拉,基本沒動過。。

 

 

AddDefaultCharset UTF-8

該選項設置的是頁面的默認字符編碼

 

AddEncoding x-compress .Z

AddEncoding x-gzip .gz .tgz

上面的指令是設置壓縮的格式

 

AddType application/x-tar .tgz

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl    .crl

AddType指令通常是用來設置後綴名和內容請求內型的映射關係,通常在typesconfig指定的文件中,如果不存在,就可以使用該指令添加。關於這個指令一個典型的例子就是跟php整合的時候。

 

 

AddHandler cgi-script .cgi

AddHandler send-as-is asis

AddHandler type-map var

該指令設置的是將文件擴展名與特定的處理器之間建立映射,以第一個爲例,所有以.cgi結尾的文件都將被認爲是可執行的cgi腳本。

 

ErrorDocument 500 "The server made a boo boo."

ErrorDocument 404 /missing.html

ErrorDocument 404 "/cgi-bin/missing_handler.pl"

ErrorDocument 402 http://www.example.com/subscription_info.html

這裏的ErrorDocument指令設置的是錯誤代碼的重定向。

這裏要說明一下的就是文件的路徑到底是以什麼爲標準的?經過測試發現,文件的路徑只能是以DocumentRoot/var/www下默認的子目錄爲準

 

 

BrowserMatch "Mozilla/2" nokeepalive

BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

BrowserMatch "RealPlayer 4\.0" force-response-1.0

BrowserMatch "Java/1\.0" force-response-1.0

BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully

BrowserMatch "MS FrontPage" redirect-carefully

BrowserMatch "^WebDrive" redirect-carefully

上面的內容是基於User-Agent來匹配不同的瀏覽器,設置一些環境變量

 

 

 

<Location /server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

   Allow from .example.com

</Location>

<Location /server-info>

    SetHandler server-info

    Order deny,allow

    Deny from all

    Allow from .example.com

</Location>

 

關於上面兩段內容的設置,要說明的是<Location …></Location>的形式,Location是用來設置匹配url的,用來針對url的訪問控制。

Server-status:設置的是wen站點訪問的統計信息

Server-info:設置的是httpd程序本身的設置信息,包括httpd.conf的當前設置,模塊信息等

看兩個直觀的截圖:

 

wKiom1QWnv6Dhe7AAANspPGkLYo306.jpg

 

 

wKiom1QWnxWDgMLDAAHIKH3Br_k775.jpg

 

<IfModule mod_proxy.c>

ProxyRequests On

<Proxy *>

    Order deny,allow

    Deny from all

    Allow from .example.com

</Proxy>

 

ProxyVia On

 

<IfModule mod_disk_cache.c>

   CacheEnable disk /

   CacheRoot "/var/cache/mod_proxy"

</IfModule>

 

</IfModule>

 

上面的內容設置的是httpd proxy功能,其次還設置了一個磁盤緩存的功能。Httpd默認自身就可以充當緩存服務器,可以使用內層緩存,也可以使用磁盤緩存。關於proxy功能通常用的比較少,一般會配合tomcat進行使用。

 

NameVirtualHost *:80

該指令表示開啓基於域名的虛擬主機,這也是用的最多的一種形式,要想開啓基於域名的虛擬主機,必須打開這一項,但是要注意的是在apache2.4中,此項已經被廢棄了,虛擬主機可以隨便設置

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot /www/docs/dummy-host.example.com

    ServerName dummy-host.example.com

    ErrorLog logs/dummy-host.example.com-error_log

    CustomLog logs/dummy-host.example.com-access_log common

</VirtualHost>

        

上面的內容就是用來設置一個虛擬主機的樣例,基本上在main中的內容都可以寫在虛擬主機中,但是一旦啓用了虛擬主機,main中的DocumentRoot就失效了。不管你是用ip訪問還是域名訪問,你所訪問的都將是虛擬主機的內容。

        

到此,關於httpd.conf配置文件就聊到這裏,更多內容,請看下回分解……..

 

結束!!!

 

    笨蛋的技術------不怕你不會!!!

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