Apache配置文件詳解及優化
ServerTokens OS
#這個項目僅僅是在告知客戶端我們服務器的版本和操作系統而已,不需要改動他
#如果不在乎你的系統信息被遠程用戶查詢到,則可以將這個項目注釋掉(不建議)
ServerRoot "/etc/httpd"
#服務器設置的最頂層目錄,有點類似於chroot那種感覺。包括logs , modules等
#的數據都應該要放置在此目錄下面(如果這些配置沒有聲明成絕對路徑的話)
PidFile run/httpd.pid
#放置PID的文件,可方便apache軟件的管理。只有相對路徑考慮ServerRoot設置值,
#所以文件在/etc/httpd/run/httpd.pid
Timeout 60
#不論接收或發送,當持續連接等待超過60秒則該次連接就中斷
#一般來說,此數值在300秒左右即可,不需要修改這個原始值
KeepAlive Off
#這里最好把默認值“Off”修改為“On”
#這里表示是否允許持續性的連接,也就是一個TCP連接可以具有多個文件資料傳送的要求
#舉例來說,如果你的網頁內含有很多圖片文件,那么這一次連接就會將所有的數據傳送完
#而不必每一個圖片都需要進行一次TCP連接。
MaxKeepAliveRequests 100
#可以將默認的100改成500或更高
#與上一個設置的值KeepAlive有關,當KeepAlive的值設置為On的時候,這個數值可以決定
#該次連接能夠傳輸的最大傳輸數量。為了提高效率則可以改大一點。0代表不限制
KeepAliveTimeout 65
#在KeepAlive設置為“On”的情況下,該次連接在最后一次傳輸后等待延遲的秒數
#當超過該秒數的時候該連接中斷。保持默認值15即可,如果設置的值太高(等待時間較長)
#在較忙碌的系統上面將會有較多的Apache程序占用資源,可能有效率方面的問題。
<IfModule prefork.c>
StartServers 8 #啟動Apache的時候,喚醒幾個PID來處理服務的。
#Apache使用了進程預派生的技術來處理請求,大大提高了響應速度,
MinSpareServers 5 #最小預備使用的PID數量
MaxSpareServers 20 #最大預備使用的PID數量
ServerLimit 4096 #服務器的限制
MaxClients 4096 #最多可以有多少個客戶端同時連接到Apache
#最大的同時連接數量,也就是process不會超過這一數值。
#這個MaxClients設置值可以控制同時連上www服務器的總連接要求數量,
#也可以將其看作是最高實時在線人數。不過要注意的是:這個值並非越大越好
#因為他會消耗物理內存(與process有關),所以如果你設置太高導致超出物理內存
#能夠容許的范圍,那么效率就會大大降低(因為會跑SWAP),此外,MaxClients也在
#Apache編譯的時候就指定最大值了,所以你也無法超出系統最大值,除非你重新編譯Apache
MaxRequestsPerChild 4000
#每個程序能夠提供的最大傳輸次數要求。舉例來說:如果有個用戶連上服務器之后,
#要求數百個網頁,當他的要求數量超過這個值的時候則該程序會被丟棄,
#另外切換一個新程序。這個設置可以有效地管理每個process在系統上存活的時間。
#根據觀察所得,新程序的效果較好。
</IfModule>
<IfModule worker.c>
StartServers 8
MaxClients 4000
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 75
MaxRequestsPerChild 0
</IfModule>
#上面的prefork和worker其實就是兩個與服務器連接資源有關的設置項目。
#默認的項目配置對於一般中小型網站來說已經很夠用了,不過如果網站的流量
#比較大,也可以修訂一下里面的數值。這兩個模塊都是用在提供用戶連接資源,
#設置的數值越大代表系統會啟動越多的程序來提供Apache的服務,反映速度就比較快
#Redhat和CentOS將這兩個模塊分別放到了不同的執行文件中,分別是
# |- /usr/sbin/httpd 使用prefork模塊
# |- /usr/sbin/httpd.worker 使用worker模塊
#/etc/sysconfig/httpd這個文件決定了Apache使用哪一個模塊,可以通過。
#修改這個文件來切換不同的工作模式。
prefork和worker模式的比較
prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平台上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,並且對於那些線程調試困難的平台而言,它也更容易調試一些。
worker模式使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因為Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起"死掉".由於線程共享內存空間,所以一個程序在運行時必須被系統識別為"每個線程都是安全的"。
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
#Apache提供了非常多的模塊供我們使用,以上就是加載的模塊
Include conf.d/*.conf
ServerAdmin root@localhost
#系統管理員的郵箱,當網站出現問題的時候,錯誤信息會顯示的聯系郵箱
DocumentRoot "/var/www/html"
#上面這一行的配置指定了放置首頁的目錄
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#Directory指定后面的路徑是系統中的絕對路徑
#這個設置是針對www服務器的默認環境而來的,因為是針對“/”的設置
#建議保留上面的默認值
<Directory "/var/www/html">
#使用Directory指定了一個絕對路徑的目錄
Options -Indexes FollowSymLinks
#Options(目錄參數)
#此設置值表示在這個目錄內能夠讓Apache進行的操作,也就是針對Apache的程序的權限設置。
#主要的參數值有:
# Indexes:如果在此目錄下找不到首頁文件(默認為index.html)時,
# 就顯示整個目錄下的文件名,至於首頁文件名則與DirectoryIndex設置的值有關
# 建議注釋掉Indexes
# FollowSymLinks:這是Fllow Symolic Links的縮寫,字面意義是讓連接文件可以生效。
# 我們知道首頁的目錄是在/var/www/html,既然是WWW的根目錄,理論上就像被chroot
# 一般。一般說來說被chroot的程序無法離開其目錄,也就是說,默認的情況下,你在
# /var/www/html下面的連接文件只要鏈接到非此目錄的其他地方,則該連接文件默認是失效的。
# 但是使用這個設置可以讓鏈接有效的離開本目錄
# ExecCGI:讓此目錄具有執行CGI的權限,非常重要。舉例來說,OpenWebMail使用了
# 很多Perl程序,你要讓OpenWebMail可以執行,就需要在該程序所在目錄擁有ExecCGI
# 的權限才行。但是要注意:不要讓所有的目錄均可以使用ExecCGI
# Includes:讓一些Server-Side Include程序可以運行。建議可以加上去
# MultiViews:這個有點像是多國語言的支持,與語言數據有關。在錯誤信息的回報內容中
# 最常見,在同一台主機中,可以依據客戶端的語言而給予不同的語言顯示。默認在回報
# 信息中存在,你可以檢查一下/var/www/error/目錄下的數據。
AllowOverride None
#允許覆蓋參數功能
#表示是否允許額外配置文件.htaccess的某些參數覆蓋。我們可以在httpd.conf內設置好所有的權限
#不過這樣一來,若用戶自己的個人網頁想要修改權限時將會對管理員造成困擾。因此,Apache默認
#可以讓用戶以目錄下的.htaccess文件內覆蓋<Direcoty>內的某些功能參數。這個項目則是在規定
#.htaccess可以覆蓋的權限類型有哪些。常見的有以下幾種:
# ALL:全部的權限均可以覆蓋
# AuthConfig:僅有網頁認證(帳號與密碼)可以覆蓋
# Indexes:僅允許Indexes方面的覆蓋
# Limits:允許用戶利用Allow、Deny與Order管理可瀏覽的權限
# None:不可覆蓋,也就是讓.htaccess文件失效
#使用.htaccess會嚴重影響到Apache的性能,如果不是特殊需要,建議關閉
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
#能否登陸瀏覽的權限
#決定此目錄是否可被Apache的PID所瀏覽的權限設置。
#能否被瀏覽主要有兩種判斷的方式:
# deny,allow 以deny優先處理,但沒有寫入規則的默認為allow (可以理解拒絕所有,允許特定)
# allow,deny 以allow為優先處理,但是沒有寫入規則的默認為deny (可以理解允許所有,拒絕特定)
#所以在默認的情況下,因為是allow,deny 所以默認為deny(不可瀏覽)
#不過在下一行有個allow from all,allow優先處理,因此全部客戶端均可瀏覽
#舉個例子來說,我們要允許所有人訪問除了192.168.61.61
#Order allow,deny
#allow from all
#deny 192.168.61.61
#以上這個例子很明顯是允許所有拒絕特定的配置
#第二行定義了允許的規則,開放所有
#第三行定義了拒絕的規則,拒絕了一個IP,這個IP包含在第二行的all當中,
#所以它的權限就默認由最后一行配置決定,最后一行是deny,所以61.61被成功被拒之門外