網路城邦

上一篇 回創作列表 下一篇   字體:
Apache伺服器係統設定與最佳化[1]
2009/03/25 17:19:51瀏覽6967|回應0|推薦0


Apache伺服器的設定檔案位於/usr/local/apache/conf/目錄下,傳統上使用三個配置檔案httpd.conf, access.conf和srm.conf,來配置Apache伺服器的行為。httpd.conf提供了最基本的伺服器配置,是對守護程式 httpd如何執行的技術描述;srm.conf是伺服器的資源對應檔案,告訴伺服器各種檔案的MIME類型,以及如何支援這些檔案; access.conf用於配置伺服器的訪問授權權,控制不同使用者和電腦的訪問限制;這三個配置檔案控制着伺服器的各個方麵的特性,因此為了正常執行伺服器便需要設定好這三個檔案。

除了這三個設定檔案之外,Apache 還使用mime.types檔案用於標識不同檔案對應的MIME類型, magic檔案設定不同MIME類型檔案的一些特殊標識,使得Apache 伺服器從文檔尾碼不能判斷出檔案的MIME 類型時,能透過檔案內容中的這些特殊標記來判斷文檔的MIME類型。 [iaspec@www conf]$ pwd /usr/local/apache/conf [iaspec@www conf]$ ls access.conf httpd.conf.OLD magic.default srm.conf access.conf.default httpd.conf.SAVE mime.types srm.conf.default httpd.conf magic mime.types.default

新版本的Apache將原來 httpd.conf、srm.conf與 access.conf中的所有配置參數均放在了一個配置檔案 httpd.conf中,隻是為了與以前的版本相容的原因(使用這三個設定檔案的方式來源於NCSA-httpd),才使用三個配置檔案。而提供的 access.conf和srm.conf檔案中沒有俱體的設定。

由於在新版本的Apache中,所有的設定都被放在了httpd.conf中,因此隻需要調整這個檔案中的設定。本文基於redhat 7.2 下的httpd.conf為例,解釋Apache伺服器的各個設定選項,當然,其配置方法可延伸到幾乎所有unix係統。

雖然Apache提供設定的參數很多,基本上這些 參數都很明確,也可以不加改動執行Apache伺服器。但如果需要調整Apache伺服器的效能,以及增加對某種特性的支援,就需要瞭解這些設定參數的含義。

需要指出的是,除了操作係統的效能調整之外,Apache 伺服器本身的預設配置絕不是最最佳化和最高效的,而是要適應幾乎所有種類操作係統、所有種類硬體下的設定,多平臺的軟體不可能為特定平臺和特定硬體提供最最佳化的預設配置。因此要使用Apache的時候,效能調整是必不可少的。

httpd.conf基本配置與效能最佳化的關係

httpd.conf中首先定義了一些httpd守護處理序執行時需要的參數,來決定其執行方式和執行環境。 下麵就httpd.conf中的配置參數的定義及其各種配置、最佳化方法進行逐項幫助:

(最佳化沒有捷徑,必須首先清楚各配置的含義)

ServerType standalone

ServerType 定義伺服器的啓動方式,預設值為獨立方式 standalone,httpd 伺服器將由其本身啓動,並駐留在主機中監視連線請求。在Linux下將在啓動檔案 /etc/rc.d/rc.local/init.d/apache中自動啓動Web伺服器,這種方式是推薦設定。

啓動Apache伺服器的另一種方式是inet方式,使用超級伺服器inetd監視連線請求並啓動伺服器。當需要使用inetd啓動方式時,便需要變更為這個設定,並屏蔽 /etc/rc.d/rc.local/init.d/apache檔案,以及變更/etc/inetd.conf並重新啟動 inetd,那麼Apache就能從inetd中啓動了。

兩種方式的區別是獨立方式是由伺服器自身管理自己的啓動處理序,這樣在啓動時能立即啓動伺服器的多個副本,每個副本都駐留在記憶體中,一有連線請求不需要生成子處理序就可以立即進行處理,對於客戶浏覽器的請求反應更快,效能較高。而 inetd方式要由inetd發現有連線請求後才去啓動http伺服器,由於inetd 要監聽太多的連接埠,因此反應較慢、效率較低,但節約了沒有連線請求時Web伺服器占用的資源。因此inetd方式隻用於偶爾被訪問並且不要求訪問速度的伺服器上。事實上inetd方式不適合http的突發和多連線的特性,因為一個页面可能包含多個影像,而每個影像都會引起一個連線請求,即使雖然訪問人數造成教少,但瞬間的連線請求並不少,這就受到inetd效能的限制,甚至會影響由inetd啓動的其他伺服器程式。

ServerRoot "/usr/local"

ServerRoot用於指定守護處理序httpd的執行目錄,httpd在啓動之後將自動將處理序的當前目錄改變為這個目錄,因此如果設定檔案中指定的檔案或目錄是相對路徑,那麼真實路徑就位於這個ServerRoot定義的路徑之下。

由於httpd會經常進行併發的檔案操作,就需要使用加鎖的方式來保證檔案操作不衝突,由於NFS檔案係統在檔案加鎖方麵能力有限,因此這個目錄應該是本機磁碟檔案係統,而不應該使用NFS檔案係統。

# LockFile /var/lock/httpd.lock

 LockFile參數指定了httpd守護處理序的加鎖檔案,一般不需要設定這個參數, Apache伺服器將自動在ServerRoot下麵的路徑中進行操作。但如果ServerRoot為NFS檔案係統,便需要使用這個參數指定本機檔案係統中的路徑,以提高讀寫速度。

PidFile /var/run/httpd.pid

PidFile 指定的檔案將記錄httpd守護處理序的處理序號,由於httpd能自動複製其自身,因此係統中有多個httpd處理序,但隻有一個處理序為最初啓動的處理序,它為其他處理序的父處理序,對這個處理序發送信號將影響所有的httpd處理序。 PidFILE定義的檔案中就記錄httpd父處理序的處理序號。

ScoreBoardFile /var/run/httpd.scoreboard

httpd使用ScoreBoardFile來維護處理序的內部資料,因此通常不需要改變這個參數,除非管理員想在一臺電腦上執行幾個Apache伺服器,這時每個Apache伺服器都需要獨立的設定檔案htt pd.conf,並使用不同的ScoreBoardFile。

#ResourceConfig conf/srm.conf #AccessConfig conf/access.conf

這兩個參數ResourceConfig和AccessConfig,就用於和使用 srm.conf 和 access.conf 設定檔案的老版本Apache相容。如果沒有相容的需要,可以將對應的設定檔案指定為/dev/null,這將表示不存在其他設定檔案,而僅使用 httpd.conf 一個檔案來儲存所有的設定選項。

Timeout 300

Timeout定義客戶程式和伺服器連線的逾時間隔,超過這個時間間隔(秒)後伺服器將斷開與客戶機的連線。如果伺服器的負載較重,可適當把此數字調小。

KeepAlive On

在HTTP 1.0中,一次連線隻能作傳輸一次HTTP請求,而KeepAlive參數用於支援HTTP的一次連線、多次傳輸功能,這樣就可以在一次連線中傳遞多個HTTP請求。

MaxKeepAliveRequests 100

 MaxKeepAliveRequests為一次連線可以進行的HTTP請求的最大請求次數。將其值設為0將支援在一次連線內進行無限次的傳輸請求。事實上沒有客戶程式在一次連線中請求太多的页面,通常達不到這個上限就完成連線了。可以適當將此數字調小,以獲取最大速度。

KeepAliveTimeout 15

 KeepAliveTimeout測試一次連線中的多次請求傳輸之間的時間,如果伺服器已經完成了一次請求,但一直沒有接收到客戶程式的下一次請求,在間隔超過了這個參數設定的值之後,伺服器就斷開連線。可以適當調小這個數值,以盡快釋放空閒的連線。但也不可太小,不然多數客戶都要重新連線,將耗費 CPU時間。

MinSpareServers 5       MaxSpareServers 10

在使用子處理序處理HTTP請求的Web伺服器上,由於要首先生成子處理序才能處理客戶的請求,因此反應時間就有一點延遲。但是,Apache伺服器使用了一個特殊技術來擺脫這個問題,這就是預先生成多個空餘的子處理序駐留在係統中,一旦有請求出現,就立即使用這些空餘的子處理序進行處理,這樣就不存在生成子處理序造成的延遲了。在執行中隨着客戶請求的增多,啓動的子處理序會隨之增多,但這些伺服器副本在處理完一次HTTP請求之後並不立即結束,而是停留在電腦中等待下次請求。但是空餘的子處理序副本不能光增加不減少,太多的空餘子處理序沒有處理工作,也占用伺服器的處理能力,因此也要限制空餘副本的數量,使其保持一個合適的數量,使得既能及時回應客戶請求,又能減少不必要的處理序數量。

因此就可以使用參數MinSpareServers來設定最少的空餘子處理序數量,以及使用參數MaxSpareServers 來限制最多的空閒子處理序數量,多餘的伺服器處理序副本就會結束。根據伺服器的實際情況來進行設定,如果伺服器效能較高,並且也被頻繁訪問,就應該增大這兩個參數的設定。對於高負載的專業網站,這兩個值應該大緻相同,並且等同於係統支援的最多伺服器副本數量,也減少不必要的副本結束。

比如,當係統高負載時,可以這樣偵測:

   [iaspec@www iaspec]$ ps -ef|grep apache|wc 55 .. .. [iaspec@www iaspec]$

這表明,高負載時有55個執行子處理序,如果此伺服器為WEB私用伺服器,就應該考慮將這兩個數值分別設為50、60,或者40、70,俱體以速度測試結果為準。

StartServers 5

StartServers 參數就是用來設定httpd啓動時啓動的子處理序副本數量,這個參數與上麵定義的MinSpareServers和 MaxSpareServers參數相關,都是用於啓動空閒子處理序以提高伺服器的反應速度的。這個參數應該設定為前兩個值之間的一個數值,小於 MinSpareServers和大於MaxSpareServers都沒有意義。

MaxClients 150

在另一方麵,伺服器的能力畢竟是有限的,不可能同時處理無限多的連線請求,因此參數 Maxclients就用於規定伺服器支援的最多併發訪問的客戶數,如果這個值設定得過大,係統在繁忙時不得不在過多的處理序之間進行切換來為太多的客戶進行服務,這樣對每個客戶的反應就會減慢,並降低了整體的效率。如果這個值設定的較小,那麼係統繁忙時就會拒絕一些客戶的連線請求。當伺服器效能較高時,就可以適當增加這個值的設定。對於專業網站,應該使用提高伺服器效率的策略,因此這個參數不能超過硬體本身的限制,如果頻繁出現拒絕訪問現象,就幫助需要升級伺服器硬體了。當不太在意對客戶浏覽器的反應速度,或者認為反應速度較慢也比拒絕連線好,就也可以略微超過硬體條件來設定這個參數。

但俱體這個數值以多少為宜呢?當對效能要求較高時,可以用下麵的方法確定如何配置此參數。

首先,估計妳的最大可能併發的連線數,或者在高負載時用ps -ef|grep apache|wc指令測得最大處理序數,通常MaxClients應該是這個數值的兩倍左右。如果當前網站在高負載時的訪問速度可以接受,但有拒絕服務現象,則應把此參數調大,如果無拒絕服務現象,但訪問速度緩慢,則應減低此數值。

這個參數同時限制了MinSpareServers和MaxSpareServers的設定,它們不應該大於這個參數的設定。

對於重負載的機器來說,僅僅這麼做還是不夠的。

Apache允許為請求開的最大處理序數是256,MaxClients的限制是 256.如果使用者多了,使用者就隻能看到Waiting for reply....然後等到下一個可用處理序的出現。這個最大數,是Apache的程式決定的--它的NT版可以有1024,但Unix版隻有256,妳可以在include/httpd.h中

看到: #ifndef HARD_SERVER_LIMIT #ifdef WIN32 #define HARD_SERVER_LIMIT 1024 #else #define HARD_SERVER_LIMIT 256 #endif #endif

妳可以把它調到1024,然後再編譯妳的係統。記得在httpd.conf裡也要變更相應配置。

MaxRequestsPerChild 30

使用子處理序的方式提供服務的Web服務,常用的方式是一個子處理序為一次連線服務,這樣造成的問題就是每次連線都需要生成、結束子處理序的係統操作,使得這些額外的處理過程占據了電腦的大量處理能力。因此最好的方式是一個子處理序可以為多次連線請求服務,這樣就不需要這些生成、結束處理序的係統消耗, Apache就采用了這樣的方式,一次連線結束後,子處理序並不結束,而是停留在係統中等待下一次服務請求,這樣就極大的提高了效能。

但由於在處理過程中子處理序要不斷的申請和釋放記憶體,次數多了就會造成一些記憶體垃圾,就會影響係統的穩定性,並且影響係統資源的有效利用。因此在一個副本處理過一定次數的請求之後,就可以讓這個子處理序副本結束,再從原始的 httpd處理序中重新複製一個乾淨的副本,這樣就能提高係統的穩定性。這樣,每個子處理序處理服務請求次數由MaxRequestPerChild定義。預設的設定值為30,這個值對於俱備高穩定性特點的Linux係統來講是過於保守的設定,可以設定為1000甚至更高,設定為0支援每個副本進行無限次的服務處理。

#Listen 3000 #Listen 12.34.56.78:80 #BindAddress *

Listen參數可以指定伺服器除了監視標準的80連接埠之外,還監視其他連接埠的 HTTP請求。由於係統可以同時擁有多個IP地址,因此也可以指定伺服器隻聽取對某個BindAddress< /B>;的IP地址的HTTP請求。如果沒有配置這一項,則伺服器會回應對所有IP的請求。

即使使用了BindAddress參數,使得伺服器隻回應對一個IP地址的請求,但是透過使用延伸的Listen參數,仍然可以讓HTTP守護處理序回應對其他IP地址的請求。此時List en參數的用法與上麵的第二個例子相同。這種比較復雜的用法主要用於設定虛擬主機。此後可以用 VirtualHost參數定義對不同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伺服器的一個重要特性就是其模組化的結構,這不但表現為其能在編譯時能透過新的模組加入新的功能,還表現為其模組可以動態載入入http服務程式中,而不必載入不需要的模組。

使用Apache的動態載入模組隻需要設定好 Load Module和AddModule參數就可以了,這種特性就是Apache的 DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一個簡單的事情,不適當的改動這裡的設定就可能造成伺服器不能正常啓動。因此如果不是要增加或減少伺服器提供的功能,就不要改動這裡的設定。

上麵這些清單就顯示了Linux下的預設Apache伺服器支援的模組,事實上很多模組是沒有必要的,不必要模組不會被載入記憶體。模組可以靜態連線到 apache 伺服器內部,也可以這樣動態載入,將Apache的特性都編譯成動態可載入模組是該Port的做法,而不是Apache的預設做法,這樣就以犧牲很小的效能的同時,帶來極大的靈活性。

因而動態可載入的能力還是對效能有輕微的影響,因此可以重新編譯Apache,將自己所需要的功能編譯進Apache 伺服器內部,可以讓係統顯得更為乾淨,效率也有輕微的提高。通常僅僅為了這一個目的就重新編譯Apache是沒有必要的,如果需要增加其他特性而重新編譯 Apache,不妨在增加其他模組的同時將所有的模組都靜態連線入Apache 伺服器。

這些模組都被放置到/usr/local/apache/modules/目錄下, 每個模組對應Apache伺服器的一個特性。詳細解釋每個模組的功能需要相當多的篇幅,其中比較重要的特性將在後麵相應的地方中進行解釋。

#ExtendedStatus On

Apache伺服器可以透過特殊的HTTP請求,來報告自身的執行狀態,在使用測試工俱測試時,開啟這個ExtendedStatus 參數可以讓伺服器報告更全麵的執行狀態資訊。

主伺服器設定

Apache伺服器需要各種設定,以定義自己使用各種參數以提供Web服務。對於使用虛擬主機的情況,除了在虛擬主機的定義項中覆蓋的設定之外(有的設定必須重新定義),這裡的設定也是虛擬主機的預設設定。

Port 80

Port定義了Standalone模式下httpd守護處理序使用的連接埠,標準連接埠是80。這個選項隻對於以獨立方式啓動的伺服器才有效,對於以inetd方式啓動的伺服器則在inetd.conf中定義使用哪個連接埠。

在Unix下使用80連接埠需要root授權權,一些管理員為了安全的原因,認為 httpd 伺服器不可能沒有安全漏洞,因而更願意使用普通使用者的授權權來啓動伺服器,這樣就不能使用80連接埠及其他小於1024的連接埠,而必須使用大於 1024的連接埠來啓動httpd,一般情況下8000或8080也是常用的連接埠。而Apache httpd伺服器本身可以在以root授權權開啟80連接埠後再改變為普通使用者身份進行執行,這樣就減少了危險性,因而就不需要考慮這個安全問題。但是如果普通使用者也想安裝配置自己的WWW伺服器,那麼就不得不使用大於1024的連接埠。

User nobody Group nogroup

 User和Group配置是Apache的安全保證,Apache在開啟連接埠之後,就將其本身設定為這兩個選項設定的使用者和組授權權進行執行,這樣就降低了伺服器的危險性。這個選項也隻用於 Standalone模式,inetd模式在inetd.conf中指定執行Apache的使用者。由於伺服器必須執行改變身份的setuid()操作,因此初始處理序應該俱備root授權權,如果是使用非root使用者來啓動Aapche,這個配置就不會發揮作用。

預設設定為nobody和nogroup,這個使用者和組在係統中不擁有檔案,保證了伺服器本身和由它啓動的CGI 處理序沒有授權權變更檔案係統。在某些情況下,例如為了執行CGI與Unix互動,也需要讓伺服器來訪問伺服器上的檔案,如果仍然使用nobody和 nogroup,那麼係統中將會出現屬於nobody的檔案,這對於係統安全是不利的,因為其他程式也會以nobody和nogroup的授權權執行某些操作,就有可能訪問這些nobody擁有的檔案,造成安全問題。一般情況下要為Web服務設定一個特定的使用者和組,同時在這裡變更使用者和組設定。

ServerAdmin you@your.address

配置檔案中應該改變的也許隻有ServerAdmin,這一項用於配置WWW伺服器的管理員的email地址,這將在HTTP服務出現錯誤的條件下返回給浏覽器,以便讓Web使用者和管理員聯係,報告錯誤。習慣上使用伺服器上的 webmaster作為WWW伺服器的管理員,透過郵件伺服器的別名機制,將發送到webmaster 的電子郵件發送給真正的Web管理員。

#ServerName new.host.name

預設情況下,並不需要指定這個ServerName參數,伺服器將自動透過名字解析過程來獲得自己的名字,但如果伺服器的名字解析有問題(通常為反嚮解析不正確),或者沒有正式的DNS名字,也可以在這裡指定IP地址。當ServerName設定不正確的時候,伺服器不能正常啓動。

通常一個Web伺服器可以俱有多個名字,客戶浏覽器可以使用所有這些名字或IP地址來訪問這臺伺服器,但在沒有定義虛擬主機的情況下,伺服器總是以自己的正式名字回應浏覽器。ServerName就定義了Web伺服器自己承認的正式名字,例如一臺伺服器名字(在DNS中定義了A類型)為 exmaple.org.cn,同時為了方便記憶還定義了一個別名(CNAME記錄)為www.exmaple.org.cn,那麼Apache自動解析得到的名字就為example.org.cn,這樣不管客戶浏覽器使用哪個名字發送請求,伺服器總是告訴客戶程式自己為 example.org.cn。雖然這一般並不會造成什麼問題,但是考慮到某一天伺服器可能遷移到其他電腦上,而隻想透過變更DNS中的www別名配置就完成遷移工作,所以不想讓客戶在其書簽中使用 Linux 記錄下這個伺服器的地址,就必須使用ServerName來重新指定伺服器的正式名字。

DocumentRoot "/www/"

DocumentRoot定義這個伺服器對外發佈的超文字文檔存放的路徑,客戶程式請求的UR L就被對應為這個目錄下的網頁檔案。這個目錄下的子目錄,以及使用符號連線指出的檔案和目錄都能被浏覽器訪問,隻是要在URL上使用同樣的相對目錄名。

    注意,符號連線雖然邏輯上位於根文檔目錄之下,但實際上可以位於電腦上的任意目錄中,因此可以使客戶程式能訪問那些根文檔目錄之外的目錄,這在增加了靈活性的同時但減少了安全性。Apache在目錄的訪問控制中提供了 FollowSymLinks選項來開啟或關閉支援符號連線的特性。

Options FollowSymLinks
AllowOverride None

Apache 伺服器可以針對目錄進行文檔的訪問控制,然而訪問控制可以透過兩種方式來實現,一個是在設定檔案 httpd.conf(或access.conf)中針對每個目錄進行設定,另一個方法是在每個目錄下設定訪問控制檔案,通常訪問控制檔案名字為. htaccess。雖然使用這兩個方式都能用於控制浏覽器的訪問,然而使用配置檔案的方法要求每次改動後重新啓動httpd守護處理序,比較不靈活,因此主要用於配置伺服器係統的整體安全控制策略,而使用每個目錄下的.htaccess檔案設定俱體目錄的訪問控制更為靈活方便。
 Directory陳述式就是用來定義目錄的訪問限制的,這裡可以看出它的標準語法,為一個目錄定義訪問限制。上例的這個設定是針對係統的根目錄進行的,設定了允許符號連線的選項FollowSymLinks ,以及使用AllowOverride None表示不允許這個目錄下的訪問控制檔案來改變這裡進行的配置,這也意味着不用檢視這個目錄下的相應訪問控制檔案。
由於Apache 對一個目錄的訪問控制設定是能夠被下一級目錄繼承的,因此對根目錄的設定將影響到它的下級目錄。注意由於AllowOverride None的設定,使得Apache伺服器不需要檢視根目錄下的訪問控制檔案,也不需要檢視以下各級目錄下的訪問控制檔案,直至httpd.conf(或 access.conf )中為某個目錄指定了允許Alloworride,即允許檢視訪問控制檔案。由於Apache對目錄訪問控制是采用的繼承方式,如果從根目錄就允許檢視訪問控制檔案,那麼Apache就必須一級一級的檢視訪問控制檔案,對係統效能會造成影響。而預設關閉了根目錄的這個特性,就使得Apache從 httpd.conf中俱體指定的目錄嚮下搜尋,減少了搜尋的級數,增加了係統效能。因此對於係統根目錄設定AllowOverride None不但對於係統安全有說明,也有益於係統效能。

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all

這裡定義的是係統對外發佈文檔的目錄的訪問設定,設定不同的 AllowOverride選項,以定義配置檔案中的目錄設定和使用者目錄下的安全控制檔案的關係,而Options選項用於定義該目錄的特性。
配置檔案和每個目錄下的訪問控制檔案都可以設定訪問限制,設定檔案是由管理員設定的,而每個目錄下的訪問控制檔案是由目錄的屬主設定的,因此管理員可以規定目錄的屬主是否能覆蓋係統在設定檔案中的設定,這就需要使用 啊AllowOverride參數進行設定,通常可以設定的值為: AllowOverride的設定 對每個目錄訪問控制檔案作用的影響All 預設值,使訪問控制檔案可以覆蓋係統配置
None 伺服器略過訪問控制檔案的設定
Options 允許訪問控制檔案中可以使用Options參數定義目錄的選項
FileInfo 允許訪問控制檔案中可以使用AddType等參數設定
AuthConfig 允許訪問控制檔案使用AuthName,AuthType等針對每個使用者的認證機制,這使目錄屬主能用口令和使用者名稱來保護目錄 Limit 允許對訪問目錄的客戶機的IP地址和名字進行限制
每個目錄俱備一定內容,可以使用Options來控制這個目錄下的一些訪問特性設定,以下為常用的特性選項:
Options設定 伺服器特性設定
All 所有的目錄特性都有效,這是預設狀態
None 所有的目錄特性都無效
FollowSymLinks 允許使用符號連線,這將使浏覽器有可能訪問文檔根目錄 (DocumentRoot)之外的文檔 SymLinksIfOwnerMatch 隻有符號連線的目的與符號連線本身為同一使用者所擁有時,才允許訪問,這個設定將增加一些安全性
ExecCGI 允許這個目錄下可以執行CGI程式 Indexes 允許浏覽器可以生成這個目錄下所有檔案的索引,使得在這個目錄下沒有index.html(或其他索引檔案)時,能嚮浏覽器發送這個目錄下的檔案清單
 此外,上例中還使用了Order、Allow、Deny等參數,這是Limit陳述式中用來根據浏覽器的網域名稱和 IP地址來控制訪問的一種方式。其中Order定義處理Allow和Deny的順序,而Allow、Deny則針對名字或IP進行訪問控制設定,上例使用 allowfrom all,表示允許所有的客戶機訪問這個目錄,而不進行任何限制。

UserDir public_html

當在一臺Linux上執行Apache伺服器時,這臺電腦上的所有使用者都可以有自己的網頁路徑,形如 http://example.org.cn/~use...,使用波浪符號加上使用者名稱就可以對應到使用者自己的網頁目錄上。對應目錄為使用者個人主目錄下的一個子目錄,其名字就用UseDir這個參數進行定義,預設為public_html。如果不想為正式的使用者提供網頁服務,使用DISABLED作UserDir的參數即可。

# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# Order allow,deny
# Allow from all
# Order deny,allow
# Deny from all

這裡可以看到Directory的另一個用法,即可以透過簡單的模式比對方法,針對分佈在不同目錄下的子目錄定義訪問控制授權權。這樣設定就需要Apache伺服器對每個路徑進行額外的處理,因此就會降低伺服器的效能,所以預設情況並沒有開啟這種訪問限制。
 這裡可以看到另外一個陳述式Limit,Limit陳述式就是用來針對俱體的請求方法來設定訪問控制的,其中可以使用GET、POST等各種伺服器支援的請求方法做Limit的參數,來設定對不同請求方法的訪問限制。一般可以開啟對GET、POST、 HEAD三種請求方法,而屏蔽其他的請求方法,以增加安全性。Limit陳述式中,可以用Order 、Allow、Deny,Allow和Deny中可以使用比對的方法針對網域名稱和IP進行限制,隻是對於網域名稱是從後嚮前比對,對於IP地址則從前嚮後比對。

DirectoryIndex index.html

很多情況下,URL中並沒有指定文檔的名字,而隻是給出了一個目錄名。那麼Apache伺服器就自動返回這個目錄下由DirectoryIndex定義的檔案,當然可以指定多個檔案名字,係統會這個目錄下順序搜尋。當所有由DirectoryIndex指定的檔案都不存在時,Apache伺服器可以根據係統設定,生成這個目錄下的所有檔案清單,提供使用者選擇。此時該目錄的訪問控制選項中的Indexes選項(Options Indexes )必須開啟,以使得伺服器能夠生成目錄清單,否則Apache將拒絕訪問。

AccessFileName .htaccess

AccessFileName定義每個目錄下的訪問控制檔案的檔案名,預設為.htaccess,可以透過變更這個檔案,來改變不同目錄的訪問控制限制。

Order allow,deny
Deny from all


除了可以針對目錄進行訪問控制之外,還可以根據檔案來設定訪問控制,這就是File陳述式的工作。使用File 陳述式,不管檔案處於哪個目錄,只要名字比對,就必須接受相應的訪問控制。這個陳述式對於係統安全比較重要,例如上例將屏蔽所有的使用者不能訪問.htaccess檔案,這樣就避免.htaccess中的關鍵安全資訊不至於被客戶獲取。

#CacheNegotiatedDocs

預設情況下如果代理伺服器和Apache伺服器協商是否快取其網頁,Apache給予否定的回答,不希望自己的網頁被代理伺服器快取。然而這樣就不能有效的利用代理伺服器的優勢,因此可以設定CacheNegotiatieDocs 選項,使得代理伺服器可以對網頁進行快取。然而即使不設定這個選項,有的代理伺服器(或透過調整設定)也能對網頁進行快取。

UseCanonicalName On

開啟這個UseCanonicalName是Web伺服器的標準做法,因為客戶發送的大部分請求都是對本伺服器的引用,這樣伺服器就能使用 ServerName和Port選項的設定內容建置完整的URL,並回應客戶,使浏覽器能得到規範的URL。如果將這個參數設定為Off,那麼 Apache將使用從客戶請求中獲得伺服器的名字和連接埠值(支援HTTP 1.1的客戶的請求中將會有這些資訊),重開啓新檔置URL。

TypesConfig /etc/mime.types

TypeConfig用於設定儲存有不同的MIME類型資料的檔案名,在Linux下預設設定為/usr/local/apache/etc/mime.types 或者/etc/mime.types。

DefaultType text/plain

如果Web伺服器不能決定一個文檔的預設類型,這通常表示文檔使用了非標準的尾碼,那麼伺服器就使用 DefaultType定義的MIME類型將文檔發送給客戶浏覽器。這裡的設定為text/plain,這樣設定的問題是,如果伺服器不能判斷出文檔的 MIME,那麼大部分情況下這個文檔為一個二進位文檔,但使用 text/plain格式發送回去,浏覽器將在內部開啟它而不會提示儲存。因此建議將這個設定變更為application/octet-stream,這樣浏覽器將提示使用者進行儲存。

MIMEMagicFile /usr/share/magic

除了從檔案的尾碼出發來判斷檔案的MIME類型之外,Apache還可以進一步分析檔案的一些特徵,來判斷檔案的真實MIME類型。這個功能是由 mod_mime_magic 模組實現的,它需要一個記錄各種MIME類型特徵的檔案,以進行分析判斷。上麵的設定是一個條件陳述式,如果載入了這個模組,就必須指定相應的標誌檔案 magic的位置。

HostnameLookups Off

通常連線時,伺服器僅僅可以得到客戶機的IP地址,如果要想獲得客戶機的主機名,以進行日誌記錄和提供給 CGI程式使用,就需要使用這個HostnameLookups 選項,將其設定為On開啟DNS反查功能。但是這將使伺服器對每次客戶請求都進行DNS查詢,增加了係統開銷,使得反應變慢,因此預設設定為使用Off關閉此選項。關閉選項之後,伺服器就不會獲得客戶機的主機名,而隻能使用IP地址來記錄客戶。

ErrorLog /var/log/httpd-error.log

LogLevel warn
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent} "" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#CustomLog /var/log/httpd-access.log common
#CustomLog /var/log/httpd-referer.log referer
#CustomLog /var/log/httpd-agent.log agent
CustomLog /var/log/httpd-access.log combined

這裡定義了係統日誌的形式,對於伺服器錯誤記錄, 由ErrorLog、 LogLevel 來定義不同的錯誤日誌檔案及其記錄內容。


對於係統的訪問日誌,預設使用CustomLog參數定義日誌的位置,預設使用 combined 參數指定將所有的訪問日誌放在一個檔案中,然而也可以將不同種類的訪問日誌放在不同的日誌記錄檔案中,這是透過在 CustomLog中指定不同的記錄類型來完成的。

common表示普通的對單页面請求訪問記錄,referer表示每個页面的引用記錄,可以看出一個页面中包含的請求數,agent表示對客戶機的類型記錄,顯然可以將現有的combined 定義的設定行注釋掉,並使用common、referer和agent作為CustomLog的參數,來為不同種類的日誌分別指定日誌記錄檔案。


顯然,LogFormat是用於定義不同類型的日誌進行記錄時使用的格式, 這裡使用了以%開頭的宏定義,以記錄不同的內容。 如果這些參數指定的檔案使用的是相對路徑,那麼就是相對於ServerRoot的路徑。

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=maxmas&aid=2781342