Apache服務器配置全攻略
更新時間:2008年03月15日 18:44:38 作者:
Apache服務器的設置文件位于/usr/local/apache/conf/目錄下,傳統(tǒng)上使用三個配置文件httpd.conf,access.conf和srm.conf,來配置Apache服務器的行為。httpd.conf提供了最基本的服務器配置,是對守護程序httpd如何運行的技術(shù)描述;srm.conf是服務器的資源映射文件,告訴服務器各種文件的MIME類型,以及如何支持這些文件;access.conf用于配置服務器的訪問權(quán)限,控制不同用戶和計算機的訪問限制;這三
個配置文件控制著服務器的各個方面的特性,因此為了正常運行服務器便需要設置好這三個文件。
除了這三個設置文件之外,Apache還使用mime.types文件用于標識不同文件
對應的MIME類型, magic文件設置不同MIME類型文件的一些特殊標識,使得Apache 服務器從文檔后綴不能判斷出文件的MIME 類型時,能通過文件內(nèi)容中的這些特殊標記來判斷文檔的MIME類型。
bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
事實上當前版本的Apache將原來httpd.conf、srm.conf與access.conf中的所有配置參數(shù)均放在了一個配置文件httpd.conf中,只是為了與以前的版本兼容的原因(使用這三個設置文件的方式來源于NCSA-httpd),才使用三個配置文件。而提供的access.conf和srm.conf文件中沒有具體的設置。
由于在新版本的Apache中,所有的設置都被放在了httpd.conf中,因此只需要調(diào)整這個文件中的設置。以下使用缺省提供的httpd.conf為例,解釋Apache服務器的各個設置選項。然而不必因為它提供設置的參數(shù)太多而煩惱,基本上這些參數(shù)都很明確,也可以不加改動運行Apache服務器。但如果需要調(diào)整Apache服務器的性能,以及增加對某種特性的支持,就需要了解這些設置參數(shù)的含義。
關(guān)于Apache服務器的性能,在Internet上存在很大的爭議,基本上使用Apache的使用者幾乎都不懷疑它的優(yōu)秀性能,Apache也支撐了很多著名的高負載的網(wǎng)站,但是在商業(yè)機構(gòu)的評測中,Apache往往得分不高。很多人指出,在這些評測中,商業(yè)Web服務器及其操作系統(tǒng)往往由其專業(yè)公司的工程師進行過性能調(diào)整,而Free 的操作系統(tǒng)和Web服務器往往就使用其缺省配置或僅僅作很小的更改。需要指出的是,除了操作系統(tǒng)的性能調(diào)整之外,Apache 服務器本身的缺省配置絕不是最優(yōu)化和最高效的,而是要適應幾乎所有種類操作系統(tǒng)、所有種類硬件下的設置,多平臺的軟件不可能為特定平臺和特定硬件提供最優(yōu)化的缺省配置。因此要使用Apache的時候,性能調(diào)整是必不可少的。
在商業(yè)評測中忽略了的另一個事實是,評測時往往對不同種類的功能進行比較,例如使用Apache的標準CGI 的性能與ISAPI,NSAPI等服務器端API比較,事實上Apache服務器與此可以比較的功能為modperl ,F(xiàn)astCGI,與ASP類似的功能為PHP等等,只不過由于Apache的開放模式,這些功能是由獨立的開發(fā)組,作為獨立的模塊來實現(xiàn)的。但是在評測中,測試人員沒有加入相應的模塊評測其性能。
HTTP守護進程的運行參數(shù)
httpd.conf中首先定義了一些httpd守護進程運行時需要的參數(shù),來決定其運行方式和運行環(huán)境。
ServerType standalone
ServerType定義服務器的啟動方式,缺省值為獨立方式standalone,httpd服務器將由其本身啟動,并駐留在主機中監(jiān)視連接請求。在Linux下將在啟動文件 /etc/rc.d/rc.local/init.d/apache中自動啟動Web服務器,這種方式是推薦設置。
啟動Apache服務器的另一種方式是inet方式,使用超級服務器inetd監(jiān)視連接請求并啟動服務器。當需要使用inetd啟動方式時,便需要更改為這個設置,并屏蔽/etc/rc.d/rc.local/init.d/apache文件,以及更改/etc/inetd.conf并重起inetd,那么Apache就能從inetd中啟動了。
兩種方式的區(qū)別是獨立方式是由服務器自身管理自己的啟動進程,這樣在啟動時能立即啟動服務器的多個副本,每個副本都駐留在內(nèi)存中,一有連接請求不需要生成子進程就可以立即進行處理,對于客戶瀏覽器的請求反應更快,性能較高。而 inetd方式要由inetd發(fā)現(xiàn)有連接請求后才去啟動http服務器,由于inetd 要監(jiān)聽太多的端口,因此反應較慢、效率較低,但節(jié)約了沒有連接請求時Web服務器占用的資源。因此inetd方式只用于偶爾被訪問并且不要求訪問速度的服務器上。事實上inetd方式不適合http的突發(fā)和多連接的特性,因為一個頁面可能包含多個圖象,而每個圖象都會引起一個連接請求,即使雖然訪問人數(shù)造成教少,但瞬間的連接請求并不少,這就受到inetd性能的限制,甚至會影響由inetd啟動的其他服務器程序。
ServerRoot "/usr/local"
ServerRoot用于指定守護進程httpd的運行目錄,httpd在啟動之后將自動將進程的當前目錄改變?yōu)檫@個目錄,因此如果設置文件中指定的文件或目錄是相對路徑,那么真實路徑就位于這個ServerRoot定義的路徑之下。
由于httpd會經(jīng)常進行并發(fā)的文件操作,就需要使用加鎖的方式來保證文件操作不沖突,由于NFS文件系統(tǒng)在文件加鎖方面能力有限,因此這個目錄應該是本地磁盤文件系統(tǒng),而不應該使用NFS文件系統(tǒng)。
#LockFile /var/run/httpd.lock
LockFile參數(shù)指定了httpd守護進程的加鎖文件,一般不需要設置這個參數(shù), Apache服務器將自動在ServerRoot下面的路徑中進行操作。但如果ServerRoot為NFS文件系統(tǒng),便需要使用這個參數(shù)指定本地文件系統(tǒng)中的路徑。
PidFile /var/run/httpd.pid
PidFile指定的文件將記錄httpd守護進程的進程號,由于httpd能自動復制其自身,因此系統(tǒng)中有多個httpd進程,但只有一個進程為最初啟動的進程,它為其他進程的父進程,對這個進程發(fā)送信號將影響所有的httpd進程。PidFILE定義的文件中就記錄httpd父進程的進程號。
ScoreBoardFile /var/run/httpd.scoreboard
httpd使用ScoreBoardFile來維護進程的內(nèi)部數(shù)據(jù),因此通常不需要改變這個參數(shù),除非管理員想在一臺計算機上運行幾個Apache服務器,這時每個Apache服務器都需要獨立的設置文件htt pd.conf,并使用不同的ScoreBoardFile。
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
這兩個參數(shù)ResourceConfig和AccessConfig,就用于和使用 srm.conf 和 access.conf 設置文件的老版本Apache兼容。如果沒有兼容的需要,可以將對應的設置文件指定為/dev/null,這將表示不存在其他設置文件,而僅使用httpd.conf 一個文件來保存所有的設置選項。
Timeout 300
Timeout定義客戶程序和服務器連接的超時間隔,超過這個時間間隔(秒)后服務器將斷開與客戶機的連接。
KeepAlive On
在HTTP 1.0中,一次連接只能作傳輸一次HTTP請求,而KeepAlive參數(shù)用于支持HTTP 1.1版本的一次連接、多次傳輸功能,這樣就可以在一次連接中傳遞多個HTTP請求。雖然只有較新的瀏覽器才支持這個功能,但還是打開使用這個選項。
MaxKeepAliveRequests 100
MaxKeepAliveRequests為一次連接可以進行的HTTP請求的最大請求次數(shù)。將其值設為0將支持在一次連接內(nèi)進行無限次的傳輸請求。事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個上限就完成連接了。
KeepAliveTimeout 15
KeepAliveTimeout測試一次連接中的多次請求傳輸之間的時間,如果服務器已經(jīng)完成了一次請求,但一直沒有接收到客戶程序的下一次請求,在間隔超過了這個參數(shù)設置的值之后,服務器就斷開連接。
MinSpareServers 5MaxSpareServers 10
在使用子進程處理HTTP請求的Web服務器上,由于要首先生成子進程才能處理客戶的請求,因此反應時間就有一點延遲。但是,Apache服務器使用了一個特殊技術(shù)來擺脫這個問題,這就是預先生成多個空余的子進程駐留在系統(tǒng)中,一旦有請求出現(xiàn),就立即使用這些空余的子進程進行處理,這樣就不存在生成子進程造成的延遲了。在運行中隨著客戶請求的增多,啟動的子進程會隨之增多,但這些服務器副本在處理完一次HTTP請求之后并不立即退出,而是停留在計算機中等待下次請求。但是空余的子進程副本不能光增加不減少,太多的空余子進程沒有處理任務,也占用服務器的處理能力,因此也要限制空余副本的數(shù)量,使其保持一個合適的數(shù)量,使得既能及時回應客戶請求,又能減少不必要的進程數(shù)量。
因此就可以使用參數(shù)MinSpareServers來設置最少的空余子進程數(shù)量, 以及使用參數(shù)MaxSpareServers 來限制最多的空閑子進程數(shù)量,多余的服務器進程副本就會退出。根據(jù)服務器的實際情況來進行設置,如果服務器性能較高,并且也被頻繁訪問,就應該增大這兩個參數(shù)的設置。對于高負載的專業(yè)網(wǎng)站,這兩個值應該大致相同,并且等同于系統(tǒng)支持的最多服務器副本數(shù)量,也減少不必要的副本退出。
StartServers 5
StartServers參數(shù)就是用來設置httpd啟動時啟動的子進程副本數(shù)量,這個參數(shù)與上面定義的MinSpareServers和MaxSpareServers參數(shù)相關(guān),都是用于啟動空閑子進程以提高服務器的反應速度的。這個參數(shù)應該設置為前兩個值之間的一個數(shù)值,小于MinSpareServers和大于MaxS pareServers都沒有意義。
MaxClients 150
在另一方面,服務器的能力畢竟是有限的,不可能同時處理無限多的連接請求,因此參數(shù)Maxclient s就用于規(guī)定服務器支持的最多并發(fā)訪問的客戶數(shù),如果這個值設置得過大,系統(tǒng)在繁忙時不得不在過多的進程之間進行切換來為太多的客戶進行服務,這樣對每個客戶的反應就會減慢,并降低了整體的效率。如果這個值設置的較小,那么系統(tǒng)繁忙時就會拒絕一些客戶的連接請求。當服務器性能較高時,就可以適當增加這個值的設置。對于專業(yè)網(wǎng)站,應該使用提高服務器效率的策略,因此這個參數(shù)不能超過硬件本身的限制,如果頻繁出現(xiàn)拒絕訪問現(xiàn)象,就說明需要升級服務器硬件了。對于非專業(yè)網(wǎng)站,不太在意對客戶瀏覽器的反應速度,或者認為反應速度較慢也比拒絕連接好,就也可以略微超過硬件條件來設置這個參數(shù)。
這個參數(shù)限制了MinSpareServers和MaxSpareServers的設置,它們不應該大于這個參數(shù)的設置。
MaxRequestsPerChild 30
使用子進程的方式提供服務的Web服務,常用的方式是一個子進程為一次連接服務,這樣造成的問題就是每次連接都需要生成、退出子進程的系統(tǒng)操作,使得這些額外的處理過程占據(jù)了計算機的大量處理能力。因此最好的方式是一個子進程可以為多次連接請求服務,這樣就不需要這些生成、退出進程的系統(tǒng)消耗,Apache就采用了這樣的方式,一次連接結(jié)束后,子進程并不退出,而是停留在系統(tǒng)中等待下一次服務請求,這樣就極大的提高了性能。
但由于在處理過程中子進程要不斷的申請和釋放內(nèi)存,次數(shù)多了就會造成一些內(nèi)存垃圾,就會影響系統(tǒng)的穩(wěn)定性,并且影響系統(tǒng)資源的有效利用。因此在一個副本處理過一定次數(shù)的請求之后,就可以讓這個子進程副本退出,再從原始的httpd進程中重新復制一個干凈的副本,這樣就能提高系統(tǒng)的穩(wěn)定性。這樣,每個子進程處理服務請求次數(shù)由MaxRe questPerChild定義。 缺省的設置值為30,這個值對于具備高穩(wěn)定性特點的Linux系統(tǒng)來講是過于保守的設置,可以設置為1000甚至更高,設置為0支持每個副本進行無限次的服務處理。
#Listen 3000
#Listen 12.34.56.78:80
#BindAddress *
Listen參數(shù)可以指定服務器除了監(jiān)視標準的80端口之外,還監(jiān)視其他端口的HTTP請求。由于FreeBSD系統(tǒng)可以同時擁有多個IP地址,因此也可以指定服務器只聽取對某個BindAddress< /B>的IP地址的HTTP請求。如果沒有配置這一項,則服務器會回應對所有IP的請求。
即使使用了BindAddress參數(shù),使得服務器只回應對一個IP地址的請求,但是通過使用擴展的Listen參數(shù),仍然可以讓HTTP守護進程回應對其他IP地址的請求。此時Listen參數(shù)的用法與上面的第二個例子相同。這種比較復雜的用法主要用于設置。此后可以用VirtualHost參數(shù)定義對不同IP的,然而這種用法是較早的HTTP 1.0標準中設置的方法,每針對一個就需要一個IP地址,實際上用處并不大。在HTTP 1.1中,增加了對單IP地址多域名的的支持,使得的設置具備更大的意義。
LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache服務器的一個重要特性就是其模塊化的結(jié)構(gòu),這不但表現(xiàn)為其能在編譯時能通過新的模塊加入新的功能,還表現(xiàn)為其模塊可以動態(tài)加載入http服務程序中,而不必載入不需要的模塊。使用Apache的動態(tài)加載模塊只需要設置好Load Module和AddModule參數(shù)就可以了,這種特性就是Apache的 DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一個簡單的事情,不適當?shù)母膭舆@里的設置就可能造成服務器不能正常啟動。因此如果不是要增加或減少服務器提供的功能,就不要改動這里的設置。
上面這些列表就顯示了Linux下的缺省Apache服務器支持的模塊,事實上很多模塊是沒有必要的,不必要模塊不會被載入內(nèi)存。模塊可以靜態(tài)連接到pache 服務器內(nèi)部,也可以這樣動態(tài)加載,將Apache的特性都編譯成動態(tài)可加載模塊是該Port的做法,而不是Apache的缺省做法,這樣就以犧牲很小的性能的同時,帶來極大的靈活性。
因而動態(tài)可加載的能力還是對性能有輕微的影響,因此可以重新編譯Apache,將自己所需要的功能編譯進Apache 服務器內(nèi)部,可以讓系統(tǒng)顯得更為干凈,效率也有輕微的提高。通常僅僅為了這一個目的就重新編譯Apache是沒有必要的,如果需要增加其他特性而重新編譯Apache,不妨在增加其他模塊的同時將所有的模塊都靜態(tài)連接入Apache 服務器。有的使用者更喜歡動態(tài)加載模塊,那么也不妨全部都使用動態(tài)加載模塊。
這些模塊都被放置到/usr/local/apache/libexec/目錄下, 每個模塊對應Apache服務器的一個特性。詳細解釋每個模塊的功能需要相當多的篇幅,其中比較重要的特性將在后面相應的地方中進行解釋,而具體每個模塊的功能及用法就需要查看Apache的文檔。
#ExtendedStatus On
Apache服務器可以通過特殊的HTTP請求,來報告自身的運行狀態(tài),打開這個ExtendedStatus 參數(shù)可以讓服務器報告更全面的運行狀態(tài)信息。
主服務器設置
Apache服務器需要各種設置,以定義自己使用各種參數(shù)以提供Web服務。對于使用的情況,除了在的定義項中覆蓋的設置之外(有的設置必須重新定義),這里的設置也是的缺省設置。
Port 80
Port定義了Standalone模式下httpd守護進程使用的端口,標準端口是80。這個選項只對于以獨立方式啟動的服務器才有效,對于以inetd方式啟動的服務器則在inetd.conf中定義使用哪個端口。
在Unix下使用80端口需要root權(quán)限,一些管理員為了安全的原因,認為 httpd 服務器不可能沒有安全漏洞,因而更愿意使用普通用戶的權(quán)限來啟動服務器,這樣就不能使用80端口及其他小于1024的端口,而必須使用大于 1024的端口來啟動httpd,一般情況下8000或8080也是常用的端口。而Apache httpd服務器本身可以在以root權(quán)限打開80端口后再改變?yōu)槠胀ㄓ脩羯矸葸M行運行,這樣就減少了危險性,因而就不需要考慮這個安全問題。但是如果普通用戶也想安裝配置自己的WWW服務器,那么就不得不使用大于1024的端口。
User nobody
Group nogroup
User和Group配置是Apache的安全保證,Apache在打開端口之后,就將其本身設置為這兩個選項設置的用戶和組權(quán)限進行運行,這樣就降低了服務器的危險性。這個選項也只用于 Standalone模式,inetd模式在inetd.conf中指定運行Apache的用戶。由于服務器必須執(zhí)行改變身份的setuid()操作,因此初始進程應該具備root權(quán)限,如果是使用非root用戶來啟動Aapche,這個配置就不會發(fā)揮作用。
缺省設置為nobody和nogroup,這個用戶和組在系統(tǒng)中不擁有文件,保證了服務器本身和由它啟動的CGI 進程沒有權(quán)限更改文件系統(tǒng)。在某些情況下,例如為了運行CGI與Unix交互,也需要讓服務器來訪問服務器上的文件,如果仍然使用nobody和nogroup,那么系統(tǒng)中將會出現(xiàn)屬于nobody的文件,這對于系統(tǒng)安全是不利的,因為其他程序也會以nobody和nogroup的權(quán)限執(zhí)行某些操作,就有可能訪問這些nobody擁有的文件,造成安全問題。一般情況下要為Web服務設定一個特定的用戶和組,同時在這里更改用戶和組設置。
ServerAdmin
配置文件中應該改變的也許只有ServerAdmin, 這一項用于配置WWW服務器的管理員的email地址,這將在HTTP服務出現(xiàn)錯誤的條件下返回給瀏覽器,以便讓Web使用者和管理員聯(lián)系,報告錯誤。習慣上使用服務器上的webmaster作為WWW服務器的管理員,通過郵件服務器的別名機制,將發(fā)送到webmaster 的電子郵件發(fā)送給真正的Web管理員。
#ServerName new.host.name
缺省情況下,并不需要指定這個ServerName參數(shù),服務器將自動通過名字解析過程來獲得自己的名字,但如果服務器的名字解析有問題(通常為反向解析不正確),或者沒有正式的DNS名字,也可以在這里指定IP地址。當ServerName設置不正確的時候,服務器不能正常啟動。
通常一個Web服務器可以具有多個名字,客戶瀏覽器可以使用所有這些名字或IP地址來訪問這臺服務器,但在沒有定義的情況下,服務器總是以自己的正式名字回應瀏覽器。ServerName就定義了Web服務器自己承認的正式名字,例如一臺服務器名字(在DNS中定義了A類型)為exmaple.org.cn,同時為了方便記憶還定義了一個別名(CNAME記錄)為,那么Apache自動解析得到的名字就為example.org.cn,這樣不管客戶瀏覽器使用哪個名字發(fā)送請求,服務器總是告訴客戶程序自己為 example.org.cn。雖然這一般并不會造成什么問題,但是考慮到某一天服務器可能遷移到其他計算機上,而只想通過更改DNS中的www別名配置就完成遷移任務,所以不想讓客戶在其書簽中使用 Linux 記錄下這個服務器的地址,就必須使用ServerName來重新指定服務器的正式名字。
DocumentRoot "/www/"
DocumentRoot定義這個服務器對外發(fā)布的超文本文檔存放的路徑,客戶程序請求的UR L就被映射為這個目錄下的網(wǎng)頁文件。這個目錄下的子目錄,以及使用符號連接指出的文件和目錄都能被瀏覽器訪問,只是要在URL上使用同樣的相對目錄名。
注意,符號連接雖然邏輯上位于根文檔目錄之下,但實際上可以位于計算機上的任意目錄中,因此可以使客戶程序能訪問那些根文檔目錄之外的目錄,這在增加了靈活性的同時但減少了安全性。Apache在目錄的訪問控制中提供了FollowSymLinks選項來打開或關(guān)閉支持符號連接的特性。
Options FollowSymLinks
AllowOverride None
Apache服務器可以針對目錄進行文檔的訪問控制,然而訪問控制可以通過兩種方式來實現(xiàn),一個是在設置文件 httpd.conf(或access.conf)中針對每個目錄進行設置,另一個方法是在每個目錄下設置訪問控制文件,通常訪問控制文件名字為.htaccess。雖然使用這兩個方式都能用于控制瀏覽器的訪問,然而使用配置文件的方法要求每次改動后重新啟動httpd守護進程,比較不靈活,因此主要用于配置服務器系統(tǒng)的整體安全控制策略,而使用每個目錄下的.htaccess文件設置具體目錄的訪問控制更為靈活方便。
Directory語句就是用來定義目錄的訪問限制的,這里可以看出它的標準語法,為一個目錄定義訪問限制。上例的這個設置是針對系統(tǒng)的根目錄進行的,設置了允許符號連接的選項FollowSymLinks ,以及使用AllowOverride None表示不允許這個目錄下的訪問控制文件來改變這里進行的配置,這也意味著不用查看這個目錄下的相應訪問控制文件。
由于Apache對一個目錄的訪問控制設置是能夠被下一級目錄繼承的,因此對根目錄的設置將影響到它的下級目錄。注意由于AllowOverride None的設置,使得Apache服務器不需要查看根目錄下的訪問控制文件,也不需要查看以下各級目錄下的訪問控制文件,直至httpd.conf(或access.conf )中為某個目錄指定了允許Alloworride,即允許查看訪問控制文件。由于Apache對目錄訪問控制是采用的繼承方式,如果從根目錄就允許查看訪問控制文件,那么Apache就必須一級一級的查看訪問控制文件,對系統(tǒng)性能會造成影響。而缺省關(guān)閉了根目錄的這個特性,就使得Apache從httpd.conf中具體指定的目錄向下搜尋,減少了搜尋的級數(shù),增加了系統(tǒng)性能。因此對于系統(tǒng)根目錄設置AllowOverride None不但對于系統(tǒng)安全有幫助,也有益于系統(tǒng)性能。
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
這里定義的是系統(tǒng)對外發(fā)布文檔的目錄的訪問設置,設置不同的 AllowOverride選項,以定義配置文件中的目錄設置和用戶目錄下的安全控制文件的關(guān)系,而Options選項用于定義該目錄的特性。
配置文件和每個目錄下的訪問控制文件都可以設置訪問限制,設置文件是由管理員設置的,而每個目錄下的訪問控制文件是由目錄的屬主設置的,因此管理員可以規(guī)定目錄的屬主是否能覆蓋系統(tǒng)在設置文件中的設置,這就需要使用 啊AllowOverride參數(shù)進行設置,通??梢栽O置的值為:
AllowOverride的設置 對每個目錄訪問控制文件作用的影響
All 缺省值,使訪問控制文件可以覆蓋系統(tǒng)配置
None 服務器忽略訪問控制文件的設置
Options 允許訪問控制文件中可以使用Options參數(shù)定義目錄的選項
FileInfo 允許訪問控制文件中可以使用AddType等參數(shù)設置
AuthConfig 允許訪問控制文件使用AuthName,AuthType等針對每個用戶的認證機制,這使目錄屬主能用口令和用戶名來保護目錄 Limit 允許對訪問目錄的客戶機的IP地址和名字進行限制
每個目錄具備一定屬性,可以使用Options來控制這個目錄下的一些訪問特性設置,以下為常用的特性選項:
Options設置 服務器特性設置
All 所有的目錄特性都有效,這是缺省狀態(tài)
None 所有的目錄特性都無效
FollowSymLinks 允許使用符號連接,這將使瀏覽器有可能訪問文檔根目錄 (DocumentRoot)之外的文檔 SymLinksIfOwnerMatch 只有符號連接的目的與符號連接本身為同一用戶所擁有時,才允許訪問,這個設置將增加一些安全性
ExecCGI 允許這個目錄下可以執(zhí)行CGI程序 Indexes 允許瀏覽器可以生成這個目錄下所有文件的索引,使得在這個目錄下沒有index.html(或其他索引文件)時,能向瀏覽器發(fā)送這個目錄下的文件列表
此外,上例中還使用了Order、Allow、Deny等參數(shù),這是Limit語句中用來根據(jù)瀏覽器的域名和 IP地址來控制訪問的一種方式。其中Order定義處理Allow和Deny的順序,而Allow、Deny則針對名字或IP進行訪問控制設置,上例使用allowfrom all,表示允許所有的客戶機訪問這個目錄,而不進行任何限制。
UserDir public_html
當在一臺Linux上運行Apache服務器時,這臺計算機上的所有用戶都可以有自己的網(wǎng)頁路徑,形如 ,使用波浪符號加上用戶名就可以映射到用戶自己的網(wǎng)頁目錄上。映射目錄為用戶個人主目錄下的一個子目錄,其名字就用UseDir這個參數(shù)進行定義,缺省為public_html。如果不想為正式的用戶提供網(wǎng)頁服務,使用DISABLED作UserDir的參數(shù)即可。
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
這里可以看到Directory的另一個用法,即可以通過簡單的模式匹配方法,針對分布在不同目錄下的子目錄定義訪問控制權(quán)限。這樣設置就需要Apache服務器對每個路徑進行額外的處理,因此就會降低服務器的性能,所以缺省情況并沒有打開這種訪問限制。
除了這三個設置文件之外,Apache還使用mime.types文件用于標識不同文件
對應的MIME類型, magic文件設置不同MIME類型文件的一些特殊標識,使得Apache 服務器從文檔后綴不能判斷出文件的MIME 類型時,能通過文件內(nèi)容中的這些特殊標記來判斷文檔的MIME類型。
bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
事實上當前版本的Apache將原來httpd.conf、srm.conf與access.conf中的所有配置參數(shù)均放在了一個配置文件httpd.conf中,只是為了與以前的版本兼容的原因(使用這三個設置文件的方式來源于NCSA-httpd),才使用三個配置文件。而提供的access.conf和srm.conf文件中沒有具體的設置。
由于在新版本的Apache中,所有的設置都被放在了httpd.conf中,因此只需要調(diào)整這個文件中的設置。以下使用缺省提供的httpd.conf為例,解釋Apache服務器的各個設置選項。然而不必因為它提供設置的參數(shù)太多而煩惱,基本上這些參數(shù)都很明確,也可以不加改動運行Apache服務器。但如果需要調(diào)整Apache服務器的性能,以及增加對某種特性的支持,就需要了解這些設置參數(shù)的含義。
關(guān)于Apache服務器的性能,在Internet上存在很大的爭議,基本上使用Apache的使用者幾乎都不懷疑它的優(yōu)秀性能,Apache也支撐了很多著名的高負載的網(wǎng)站,但是在商業(yè)機構(gòu)的評測中,Apache往往得分不高。很多人指出,在這些評測中,商業(yè)Web服務器及其操作系統(tǒng)往往由其專業(yè)公司的工程師進行過性能調(diào)整,而Free 的操作系統(tǒng)和Web服務器往往就使用其缺省配置或僅僅作很小的更改。需要指出的是,除了操作系統(tǒng)的性能調(diào)整之外,Apache 服務器本身的缺省配置絕不是最優(yōu)化和最高效的,而是要適應幾乎所有種類操作系統(tǒng)、所有種類硬件下的設置,多平臺的軟件不可能為特定平臺和特定硬件提供最優(yōu)化的缺省配置。因此要使用Apache的時候,性能調(diào)整是必不可少的。
在商業(yè)評測中忽略了的另一個事實是,評測時往往對不同種類的功能進行比較,例如使用Apache的標準CGI 的性能與ISAPI,NSAPI等服務器端API比較,事實上Apache服務器與此可以比較的功能為modperl ,F(xiàn)astCGI,與ASP類似的功能為PHP等等,只不過由于Apache的開放模式,這些功能是由獨立的開發(fā)組,作為獨立的模塊來實現(xiàn)的。但是在評測中,測試人員沒有加入相應的模塊評測其性能。
HTTP守護進程的運行參數(shù)
httpd.conf中首先定義了一些httpd守護進程運行時需要的參數(shù),來決定其運行方式和運行環(huán)境。
ServerType standalone
ServerType定義服務器的啟動方式,缺省值為獨立方式standalone,httpd服務器將由其本身啟動,并駐留在主機中監(jiān)視連接請求。在Linux下將在啟動文件 /etc/rc.d/rc.local/init.d/apache中自動啟動Web服務器,這種方式是推薦設置。
啟動Apache服務器的另一種方式是inet方式,使用超級服務器inetd監(jiān)視連接請求并啟動服務器。當需要使用inetd啟動方式時,便需要更改為這個設置,并屏蔽/etc/rc.d/rc.local/init.d/apache文件,以及更改/etc/inetd.conf并重起inetd,那么Apache就能從inetd中啟動了。
兩種方式的區(qū)別是獨立方式是由服務器自身管理自己的啟動進程,這樣在啟動時能立即啟動服務器的多個副本,每個副本都駐留在內(nèi)存中,一有連接請求不需要生成子進程就可以立即進行處理,對于客戶瀏覽器的請求反應更快,性能較高。而 inetd方式要由inetd發(fā)現(xiàn)有連接請求后才去啟動http服務器,由于inetd 要監(jiān)聽太多的端口,因此反應較慢、效率較低,但節(jié)約了沒有連接請求時Web服務器占用的資源。因此inetd方式只用于偶爾被訪問并且不要求訪問速度的服務器上。事實上inetd方式不適合http的突發(fā)和多連接的特性,因為一個頁面可能包含多個圖象,而每個圖象都會引起一個連接請求,即使雖然訪問人數(shù)造成教少,但瞬間的連接請求并不少,這就受到inetd性能的限制,甚至會影響由inetd啟動的其他服務器程序。
ServerRoot "/usr/local"
ServerRoot用于指定守護進程httpd的運行目錄,httpd在啟動之后將自動將進程的當前目錄改變?yōu)檫@個目錄,因此如果設置文件中指定的文件或目錄是相對路徑,那么真實路徑就位于這個ServerRoot定義的路徑之下。
由于httpd會經(jīng)常進行并發(fā)的文件操作,就需要使用加鎖的方式來保證文件操作不沖突,由于NFS文件系統(tǒng)在文件加鎖方面能力有限,因此這個目錄應該是本地磁盤文件系統(tǒng),而不應該使用NFS文件系統(tǒng)。
#LockFile /var/run/httpd.lock
LockFile參數(shù)指定了httpd守護進程的加鎖文件,一般不需要設置這個參數(shù), Apache服務器將自動在ServerRoot下面的路徑中進行操作。但如果ServerRoot為NFS文件系統(tǒng),便需要使用這個參數(shù)指定本地文件系統(tǒng)中的路徑。
PidFile /var/run/httpd.pid
PidFile指定的文件將記錄httpd守護進程的進程號,由于httpd能自動復制其自身,因此系統(tǒng)中有多個httpd進程,但只有一個進程為最初啟動的進程,它為其他進程的父進程,對這個進程發(fā)送信號將影響所有的httpd進程。PidFILE定義的文件中就記錄httpd父進程的進程號。
ScoreBoardFile /var/run/httpd.scoreboard
httpd使用ScoreBoardFile來維護進程的內(nèi)部數(shù)據(jù),因此通常不需要改變這個參數(shù),除非管理員想在一臺計算機上運行幾個Apache服務器,這時每個Apache服務器都需要獨立的設置文件htt pd.conf,并使用不同的ScoreBoardFile。
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
這兩個參數(shù)ResourceConfig和AccessConfig,就用于和使用 srm.conf 和 access.conf 設置文件的老版本Apache兼容。如果沒有兼容的需要,可以將對應的設置文件指定為/dev/null,這將表示不存在其他設置文件,而僅使用httpd.conf 一個文件來保存所有的設置選項。
Timeout 300
Timeout定義客戶程序和服務器連接的超時間隔,超過這個時間間隔(秒)后服務器將斷開與客戶機的連接。
KeepAlive On
在HTTP 1.0中,一次連接只能作傳輸一次HTTP請求,而KeepAlive參數(shù)用于支持HTTP 1.1版本的一次連接、多次傳輸功能,這樣就可以在一次連接中傳遞多個HTTP請求。雖然只有較新的瀏覽器才支持這個功能,但還是打開使用這個選項。
MaxKeepAliveRequests 100
MaxKeepAliveRequests為一次連接可以進行的HTTP請求的最大請求次數(shù)。將其值設為0將支持在一次連接內(nèi)進行無限次的傳輸請求。事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個上限就完成連接了。
KeepAliveTimeout 15
KeepAliveTimeout測試一次連接中的多次請求傳輸之間的時間,如果服務器已經(jīng)完成了一次請求,但一直沒有接收到客戶程序的下一次請求,在間隔超過了這個參數(shù)設置的值之后,服務器就斷開連接。
MinSpareServers 5MaxSpareServers 10
在使用子進程處理HTTP請求的Web服務器上,由于要首先生成子進程才能處理客戶的請求,因此反應時間就有一點延遲。但是,Apache服務器使用了一個特殊技術(shù)來擺脫這個問題,這就是預先生成多個空余的子進程駐留在系統(tǒng)中,一旦有請求出現(xiàn),就立即使用這些空余的子進程進行處理,這樣就不存在生成子進程造成的延遲了。在運行中隨著客戶請求的增多,啟動的子進程會隨之增多,但這些服務器副本在處理完一次HTTP請求之后并不立即退出,而是停留在計算機中等待下次請求。但是空余的子進程副本不能光增加不減少,太多的空余子進程沒有處理任務,也占用服務器的處理能力,因此也要限制空余副本的數(shù)量,使其保持一個合適的數(shù)量,使得既能及時回應客戶請求,又能減少不必要的進程數(shù)量。
因此就可以使用參數(shù)MinSpareServers來設置最少的空余子進程數(shù)量, 以及使用參數(shù)MaxSpareServers 來限制最多的空閑子進程數(shù)量,多余的服務器進程副本就會退出。根據(jù)服務器的實際情況來進行設置,如果服務器性能較高,并且也被頻繁訪問,就應該增大這兩個參數(shù)的設置。對于高負載的專業(yè)網(wǎng)站,這兩個值應該大致相同,并且等同于系統(tǒng)支持的最多服務器副本數(shù)量,也減少不必要的副本退出。
StartServers 5
StartServers參數(shù)就是用來設置httpd啟動時啟動的子進程副本數(shù)量,這個參數(shù)與上面定義的MinSpareServers和MaxSpareServers參數(shù)相關(guān),都是用于啟動空閑子進程以提高服務器的反應速度的。這個參數(shù)應該設置為前兩個值之間的一個數(shù)值,小于MinSpareServers和大于MaxS pareServers都沒有意義。
MaxClients 150
在另一方面,服務器的能力畢竟是有限的,不可能同時處理無限多的連接請求,因此參數(shù)Maxclient s就用于規(guī)定服務器支持的最多并發(fā)訪問的客戶數(shù),如果這個值設置得過大,系統(tǒng)在繁忙時不得不在過多的進程之間進行切換來為太多的客戶進行服務,這樣對每個客戶的反應就會減慢,并降低了整體的效率。如果這個值設置的較小,那么系統(tǒng)繁忙時就會拒絕一些客戶的連接請求。當服務器性能較高時,就可以適當增加這個值的設置。對于專業(yè)網(wǎng)站,應該使用提高服務器效率的策略,因此這個參數(shù)不能超過硬件本身的限制,如果頻繁出現(xiàn)拒絕訪問現(xiàn)象,就說明需要升級服務器硬件了。對于非專業(yè)網(wǎng)站,不太在意對客戶瀏覽器的反應速度,或者認為反應速度較慢也比拒絕連接好,就也可以略微超過硬件條件來設置這個參數(shù)。
這個參數(shù)限制了MinSpareServers和MaxSpareServers的設置,它們不應該大于這個參數(shù)的設置。
MaxRequestsPerChild 30
使用子進程的方式提供服務的Web服務,常用的方式是一個子進程為一次連接服務,這樣造成的問題就是每次連接都需要生成、退出子進程的系統(tǒng)操作,使得這些額外的處理過程占據(jù)了計算機的大量處理能力。因此最好的方式是一個子進程可以為多次連接請求服務,這樣就不需要這些生成、退出進程的系統(tǒng)消耗,Apache就采用了這樣的方式,一次連接結(jié)束后,子進程并不退出,而是停留在系統(tǒng)中等待下一次服務請求,這樣就極大的提高了性能。
但由于在處理過程中子進程要不斷的申請和釋放內(nèi)存,次數(shù)多了就會造成一些內(nèi)存垃圾,就會影響系統(tǒng)的穩(wěn)定性,并且影響系統(tǒng)資源的有效利用。因此在一個副本處理過一定次數(shù)的請求之后,就可以讓這個子進程副本退出,再從原始的httpd進程中重新復制一個干凈的副本,這樣就能提高系統(tǒng)的穩(wěn)定性。這樣,每個子進程處理服務請求次數(shù)由MaxRe questPerChild定義。 缺省的設置值為30,這個值對于具備高穩(wěn)定性特點的Linux系統(tǒng)來講是過于保守的設置,可以設置為1000甚至更高,設置為0支持每個副本進行無限次的服務處理。
#Listen 3000
#Listen 12.34.56.78:80
#BindAddress *
Listen參數(shù)可以指定服務器除了監(jiān)視標準的80端口之外,還監(jiān)視其他端口的HTTP請求。由于FreeBSD系統(tǒng)可以同時擁有多個IP地址,因此也可以指定服務器只聽取對某個BindAddress< /B>的IP地址的HTTP請求。如果沒有配置這一項,則服務器會回應對所有IP的請求。
即使使用了BindAddress參數(shù),使得服務器只回應對一個IP地址的請求,但是通過使用擴展的Listen參數(shù),仍然可以讓HTTP守護進程回應對其他IP地址的請求。此時Listen參數(shù)的用法與上面的第二個例子相同。這種比較復雜的用法主要用于設置。此后可以用VirtualHost參數(shù)定義對不同IP的,然而這種用法是較早的HTTP 1.0標準中設置的方法,每針對一個就需要一個IP地址,實際上用處并不大。在HTTP 1.1中,增加了對單IP地址多域名的的支持,使得的設置具備更大的意義。
LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache服務器的一個重要特性就是其模塊化的結(jié)構(gòu),這不但表現(xiàn)為其能在編譯時能通過新的模塊加入新的功能,還表現(xiàn)為其模塊可以動態(tài)加載入http服務程序中,而不必載入不需要的模塊。使用Apache的動態(tài)加載模塊只需要設置好Load Module和AddModule參數(shù)就可以了,這種特性就是Apache的 DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一個簡單的事情,不適當?shù)母膭舆@里的設置就可能造成服務器不能正常啟動。因此如果不是要增加或減少服務器提供的功能,就不要改動這里的設置。
上面這些列表就顯示了Linux下的缺省Apache服務器支持的模塊,事實上很多模塊是沒有必要的,不必要模塊不會被載入內(nèi)存。模塊可以靜態(tài)連接到pache 服務器內(nèi)部,也可以這樣動態(tài)加載,將Apache的特性都編譯成動態(tài)可加載模塊是該Port的做法,而不是Apache的缺省做法,這樣就以犧牲很小的性能的同時,帶來極大的靈活性。
因而動態(tài)可加載的能力還是對性能有輕微的影響,因此可以重新編譯Apache,將自己所需要的功能編譯進Apache 服務器內(nèi)部,可以讓系統(tǒng)顯得更為干凈,效率也有輕微的提高。通常僅僅為了這一個目的就重新編譯Apache是沒有必要的,如果需要增加其他特性而重新編譯Apache,不妨在增加其他模塊的同時將所有的模塊都靜態(tài)連接入Apache 服務器。有的使用者更喜歡動態(tài)加載模塊,那么也不妨全部都使用動態(tài)加載模塊。
這些模塊都被放置到/usr/local/apache/libexec/目錄下, 每個模塊對應Apache服務器的一個特性。詳細解釋每個模塊的功能需要相當多的篇幅,其中比較重要的特性將在后面相應的地方中進行解釋,而具體每個模塊的功能及用法就需要查看Apache的文檔。
#ExtendedStatus On
Apache服務器可以通過特殊的HTTP請求,來報告自身的運行狀態(tài),打開這個ExtendedStatus 參數(shù)可以讓服務器報告更全面的運行狀態(tài)信息。
主服務器設置
Apache服務器需要各種設置,以定義自己使用各種參數(shù)以提供Web服務。對于使用的情況,除了在的定義項中覆蓋的設置之外(有的設置必須重新定義),這里的設置也是的缺省設置。
Port 80
Port定義了Standalone模式下httpd守護進程使用的端口,標準端口是80。這個選項只對于以獨立方式啟動的服務器才有效,對于以inetd方式啟動的服務器則在inetd.conf中定義使用哪個端口。
在Unix下使用80端口需要root權(quán)限,一些管理員為了安全的原因,認為 httpd 服務器不可能沒有安全漏洞,因而更愿意使用普通用戶的權(quán)限來啟動服務器,這樣就不能使用80端口及其他小于1024的端口,而必須使用大于 1024的端口來啟動httpd,一般情況下8000或8080也是常用的端口。而Apache httpd服務器本身可以在以root權(quán)限打開80端口后再改變?yōu)槠胀ㄓ脩羯矸葸M行運行,這樣就減少了危險性,因而就不需要考慮這個安全問題。但是如果普通用戶也想安裝配置自己的WWW服務器,那么就不得不使用大于1024的端口。
User nobody
Group nogroup
User和Group配置是Apache的安全保證,Apache在打開端口之后,就將其本身設置為這兩個選項設置的用戶和組權(quán)限進行運行,這樣就降低了服務器的危險性。這個選項也只用于 Standalone模式,inetd模式在inetd.conf中指定運行Apache的用戶。由于服務器必須執(zhí)行改變身份的setuid()操作,因此初始進程應該具備root權(quán)限,如果是使用非root用戶來啟動Aapche,這個配置就不會發(fā)揮作用。
缺省設置為nobody和nogroup,這個用戶和組在系統(tǒng)中不擁有文件,保證了服務器本身和由它啟動的CGI 進程沒有權(quán)限更改文件系統(tǒng)。在某些情況下,例如為了運行CGI與Unix交互,也需要讓服務器來訪問服務器上的文件,如果仍然使用nobody和nogroup,那么系統(tǒng)中將會出現(xiàn)屬于nobody的文件,這對于系統(tǒng)安全是不利的,因為其他程序也會以nobody和nogroup的權(quán)限執(zhí)行某些操作,就有可能訪問這些nobody擁有的文件,造成安全問題。一般情況下要為Web服務設定一個特定的用戶和組,同時在這里更改用戶和組設置。
ServerAdmin
配置文件中應該改變的也許只有ServerAdmin, 這一項用于配置WWW服務器的管理員的email地址,這將在HTTP服務出現(xiàn)錯誤的條件下返回給瀏覽器,以便讓Web使用者和管理員聯(lián)系,報告錯誤。習慣上使用服務器上的webmaster作為WWW服務器的管理員,通過郵件服務器的別名機制,將發(fā)送到webmaster 的電子郵件發(fā)送給真正的Web管理員。
#ServerName new.host.name
缺省情況下,并不需要指定這個ServerName參數(shù),服務器將自動通過名字解析過程來獲得自己的名字,但如果服務器的名字解析有問題(通常為反向解析不正確),或者沒有正式的DNS名字,也可以在這里指定IP地址。當ServerName設置不正確的時候,服務器不能正常啟動。
通常一個Web服務器可以具有多個名字,客戶瀏覽器可以使用所有這些名字或IP地址來訪問這臺服務器,但在沒有定義的情況下,服務器總是以自己的正式名字回應瀏覽器。ServerName就定義了Web服務器自己承認的正式名字,例如一臺服務器名字(在DNS中定義了A類型)為exmaple.org.cn,同時為了方便記憶還定義了一個別名(CNAME記錄)為,那么Apache自動解析得到的名字就為example.org.cn,這樣不管客戶瀏覽器使用哪個名字發(fā)送請求,服務器總是告訴客戶程序自己為 example.org.cn。雖然這一般并不會造成什么問題,但是考慮到某一天服務器可能遷移到其他計算機上,而只想通過更改DNS中的www別名配置就完成遷移任務,所以不想讓客戶在其書簽中使用 Linux 記錄下這個服務器的地址,就必須使用ServerName來重新指定服務器的正式名字。
DocumentRoot "/www/"
DocumentRoot定義這個服務器對外發(fā)布的超文本文檔存放的路徑,客戶程序請求的UR L就被映射為這個目錄下的網(wǎng)頁文件。這個目錄下的子目錄,以及使用符號連接指出的文件和目錄都能被瀏覽器訪問,只是要在URL上使用同樣的相對目錄名。
注意,符號連接雖然邏輯上位于根文檔目錄之下,但實際上可以位于計算機上的任意目錄中,因此可以使客戶程序能訪問那些根文檔目錄之外的目錄,這在增加了靈活性的同時但減少了安全性。Apache在目錄的訪問控制中提供了FollowSymLinks選項來打開或關(guān)閉支持符號連接的特性。
Options FollowSymLinks
AllowOverride None
Apache服務器可以針對目錄進行文檔的訪問控制,然而訪問控制可以通過兩種方式來實現(xiàn),一個是在設置文件 httpd.conf(或access.conf)中針對每個目錄進行設置,另一個方法是在每個目錄下設置訪問控制文件,通常訪問控制文件名字為.htaccess。雖然使用這兩個方式都能用于控制瀏覽器的訪問,然而使用配置文件的方法要求每次改動后重新啟動httpd守護進程,比較不靈活,因此主要用于配置服務器系統(tǒng)的整體安全控制策略,而使用每個目錄下的.htaccess文件設置具體目錄的訪問控制更為靈活方便。
Directory語句就是用來定義目錄的訪問限制的,這里可以看出它的標準語法,為一個目錄定義訪問限制。上例的這個設置是針對系統(tǒng)的根目錄進行的,設置了允許符號連接的選項FollowSymLinks ,以及使用AllowOverride None表示不允許這個目錄下的訪問控制文件來改變這里進行的配置,這也意味著不用查看這個目錄下的相應訪問控制文件。
由于Apache對一個目錄的訪問控制設置是能夠被下一級目錄繼承的,因此對根目錄的設置將影響到它的下級目錄。注意由于AllowOverride None的設置,使得Apache服務器不需要查看根目錄下的訪問控制文件,也不需要查看以下各級目錄下的訪問控制文件,直至httpd.conf(或access.conf )中為某個目錄指定了允許Alloworride,即允許查看訪問控制文件。由于Apache對目錄訪問控制是采用的繼承方式,如果從根目錄就允許查看訪問控制文件,那么Apache就必須一級一級的查看訪問控制文件,對系統(tǒng)性能會造成影響。而缺省關(guān)閉了根目錄的這個特性,就使得Apache從httpd.conf中具體指定的目錄向下搜尋,減少了搜尋的級數(shù),增加了系統(tǒng)性能。因此對于系統(tǒng)根目錄設置AllowOverride None不但對于系統(tǒng)安全有幫助,也有益于系統(tǒng)性能。
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
這里定義的是系統(tǒng)對外發(fā)布文檔的目錄的訪問設置,設置不同的 AllowOverride選項,以定義配置文件中的目錄設置和用戶目錄下的安全控制文件的關(guān)系,而Options選項用于定義該目錄的特性。
配置文件和每個目錄下的訪問控制文件都可以設置訪問限制,設置文件是由管理員設置的,而每個目錄下的訪問控制文件是由目錄的屬主設置的,因此管理員可以規(guī)定目錄的屬主是否能覆蓋系統(tǒng)在設置文件中的設置,這就需要使用 啊AllowOverride參數(shù)進行設置,通??梢栽O置的值為:
AllowOverride的設置 對每個目錄訪問控制文件作用的影響
All 缺省值,使訪問控制文件可以覆蓋系統(tǒng)配置
None 服務器忽略訪問控制文件的設置
Options 允許訪問控制文件中可以使用Options參數(shù)定義目錄的選項
FileInfo 允許訪問控制文件中可以使用AddType等參數(shù)設置
AuthConfig 允許訪問控制文件使用AuthName,AuthType等針對每個用戶的認證機制,這使目錄屬主能用口令和用戶名來保護目錄 Limit 允許對訪問目錄的客戶機的IP地址和名字進行限制
每個目錄具備一定屬性,可以使用Options來控制這個目錄下的一些訪問特性設置,以下為常用的特性選項:
Options設置 服務器特性設置
All 所有的目錄特性都有效,這是缺省狀態(tài)
None 所有的目錄特性都無效
FollowSymLinks 允許使用符號連接,這將使瀏覽器有可能訪問文檔根目錄 (DocumentRoot)之外的文檔 SymLinksIfOwnerMatch 只有符號連接的目的與符號連接本身為同一用戶所擁有時,才允許訪問,這個設置將增加一些安全性
ExecCGI 允許這個目錄下可以執(zhí)行CGI程序 Indexes 允許瀏覽器可以生成這個目錄下所有文件的索引,使得在這個目錄下沒有index.html(或其他索引文件)時,能向瀏覽器發(fā)送這個目錄下的文件列表
此外,上例中還使用了Order、Allow、Deny等參數(shù),這是Limit語句中用來根據(jù)瀏覽器的域名和 IP地址來控制訪問的一種方式。其中Order定義處理Allow和Deny的順序,而Allow、Deny則針對名字或IP進行訪問控制設置,上例使用allowfrom all,表示允許所有的客戶機訪問這個目錄,而不進行任何限制。
UserDir public_html
當在一臺Linux上運行Apache服務器時,這臺計算機上的所有用戶都可以有自己的網(wǎng)頁路徑,形如 ,使用波浪符號加上用戶名就可以映射到用戶自己的網(wǎng)頁目錄上。映射目錄為用戶個人主目錄下的一個子目錄,其名字就用UseDir這個參數(shù)進行定義,缺省為public_html。如果不想為正式的用戶提供網(wǎng)頁服務,使用DISABLED作UserDir的參數(shù)即可。
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
這里可以看到Directory的另一個用法,即可以通過簡單的模式匹配方法,針對分布在不同目錄下的子目錄定義訪問控制權(quán)限。這樣設置就需要Apache服務器對每個路徑進行額外的處理,因此就會降低服務器的性能,所以缺省情況并沒有打開這種訪問限制。
相關(guān)文章
解決IIS的Server Application Error的3種方法
The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance2006-12-12apache五合一程序建立PHP+CGI運行環(huán)境
apache五合一程序建立PHP+CGI運行環(huán)境...2006-10-10Win2003+IIS6.0+php5.2.2+MySQL 5.0.41+ZendOptimizer 3.2.8 +ph
Win2003+IIS6.0+php5.2.2+MySQL 5.0.41+ZendOptimizer 3.2.8 +phpMyAdmin 2.10.1環(huán)境配置安裝教程圖文詳解...2007-06-06