Apache性能調優1
Apache 部分:
1. 移除不用的模塊。
2. 使用 mod_disk_cache NOT mod_mem_cache 。
3. 扁平架構配置mod_disk_cache。
4. 安裝恰當的Expires, Etag, 和 Cache-Control Headers 。
5. 將緩存放在獨立的磁盤
6. 使用管道日志替代直接記錄
7. 將日志放在不同的磁盤
8. 使用 mod_gzip/mod_deflate 。
9. 將HostnameLookups關閉.
10. 避免在configs中使用主機名。
11. 使用持久連接。
12. 不要設置KeepAliveTimeout太高。
13. 禁用 .htaccess。
14. 允許symlinks。
15. 關閉ExtendedStatus。
16. 避免在DirectoryIndex中通配符。
OS 部分:
17. 提高Swappiness。
18. 提高寫入緩沖器( Write Buffer)大小。
19. 提高最大打開文件。
應用部分:
20. 設置圖像和樣式表的前端代理。
21. 使用 mod_passenger for rails。
22. 關閉safe_mode for php。
23. 不要使用threaded mpm with mod_php。
24. 刷新緩沖區預渲染。
25. 頻繁訪問的數據設置緩存。
Apache性能調優2
1 模塊的加載
去掉不必要的加載或者動態加載模塊
一般來說,不需要加載一下的模塊:
Mod_include.so:服務器端包含,是一種已經過時的技術
Mod_autoindex.so:如果不希望apache列目錄顯示,可以刪除
Mod_access.so mod_auth.so:如果你不需要進行安全驗證,也沒有必要加載
最好加載的模塊:
Mod_dir.so:用於定義缺省文檔index.php index.jsp等
Mod_log_config.so:用於記錄文件格式
Mod_mime.so:定義文件類型的關聯
2 域名查找
Hhostnamelookups off默認情況下已經是關閉的,務必要保持該設置。如果需要客戶端dnx,可以使用第三方軟件代替。服務器對dns作一個反向查詢以找出客戶系統的主機名,又進行正向查詢看獲得的主機名是否真實指向客戶IP。
3 符號連接
Options -followsymlinks 開啟后,apache檢查每個請求中是否包含對符號鏈接的引用,對請求中包含的每個路徑調用一次lstat()系統調用。
這將使用瀏覽器有可能訪問文檔根目錄(DocumentRoot)之外的內容,並且只有符號連接的目的與符號連接本身為同一用戶所擁有時(SymLinksOwnerMatch),才允許訪問,這個設置將增加一些安全性,但將耗費Apache大量的資源。
4 服務器狀態信息,默認關閉。
sethandler server--status
5 關閉目錄瀏覽
options -indexes
6 更精確的時候盡可能不適用通配符之類的靈活選項,刪除不必要的選項,明確的制定設置文件列表,最常用的放在前面。Directoryindex index.php index.html
7 cgi模塊
將所有cgi文件放在一個特定的目錄並設置正確的權限,避免apache對每一個請求都要判斷一次要求的是一個靜態文件還是動態文件。
8 日志
寫入日志信息是一個花費時間的工作,apache保持日志文件的打開狀態以節省打開文件 的時間,如果沒有必要的可以關閉節省更多的處理器時間。
9 allowoverrice none
.htaccess文件可以極大的擴展apache的設置參數,而無需每次改變設計都要編輯apache的主設置文件,但是也降低了服務器的性能。
使用這個文件,apache必須要在當前的目錄中查找是否存在這個文件,如果存在就解析這個文件並在當前目錄中應用文件的設置。更壞的是,apache不僅要查看當前的目錄,還要查看當前目錄的所有上層的目錄是否包括htaccess文件已根據所有這些文件最終確定設置。
如果你想最優化服務器的性能,你應該禁止使用htaccess文件,任何基本目錄的設置都可以在主設置文件中進行,而主設置文件僅在服務器啟動時解析一次。為了禁用htaccess文件,在任何節里加上指示allowoverride none。
10 timeout
Timeout設置apache等待一個連接讀寫操作的時間長度,也就是連接建立后,apache等待客戶端完成請求發送的時間,或者相應開始以后。Apache寫出數據到客戶端連接時間長度。無論對於哪種應用來說,300秒的缺省值都有些過長了,因為這就意味着,如果客戶端發生了某種未知因素導致的遲滯的話,服務器的一個連接和與之對應的所有資源都要維持 300 秒,這個對於重載的服務器來說是在是有些過長,所以,我建議將其設置得小一些,這個長度只要足夠保證各種客戶端的應用能夠正常傳遞數據即可。這里需要考慮的因素主要有各種客戶端的連接狀況和服務器的繁忙程度。一般來說,我建議設置為 3~5。
11 keepalive on
Apache 的KeepAlive這個指令指定一段時間,在這段時間內,可以讓服務器和客戶端之間持同一個連接。這個特性,有其好處,也有其壞處。好處是,如果客戶端 發出多個請求,服務端不必每次都花時間去創建連接。壞處就是,這段時間內,即使客戶端不再發出新的請求、訪問新的頁面,這個連接也會被占用,這對服務器資 源來說是一種浪費。
在默認情況下,KeepAlive是設置為On的,KeepAliveTimeout設置為15秒。也就是說,在15秒之內,服務器平均每秒連接到150個不同的連接,那么從理論上講,服務器將同時有15×150=2250個連接,內存消耗比較嚴重。
那么我們要如何來優化KeepAlive呢?
a、可以禁用KeepAlive(設置為 Off);
b、將KeepAliveTimeout改小,比3或者5秒。
12 maxkeepaliverequests 100
最多保持多少個活動的長鏈接
13 keepalivetimeout 5
連接的保持時間,超過時間就回收。apache進程在使用內存時,是“漸長”的。也就是說,直到這個進程死掉,使用內存的數量是一直增長而不會減少的。這樣的話,apache進程使用內存的多少,就決定於你的應用程序最大使用內存量了。
keepalivetimeout 這個參數決定了,在什么都不做之前,一個http進程能夠等待多長時間?設想一下,如果keepalive設置為on,而 keepalivetimeout設置為一個比較大的數字,apache占用內存會很快的增長。這是因為,一個apache進程完成了一個任務(並達到了一定的內存占用,想一下“漸進”模式),並不會馬上退出,而是等待一個keepalivetimeout時間。假設用戶的鏈接請求持續不斷的到來,則積累起來的無用的apache進程就會相當多,直到timeout,這些進程才會被殺死。
但是,keepalive的確對於靜態的文件,比如圖像文件的傳送是很有效的,因此,keepalive要設置為on,但是keepalvietimeout要設置的小些,比如5s
14 serversignature off
默認情況下,很多apache安裝時會顯示版本號及操作系統版本,甚至會顯示服務器上安裝的是什么樣的apache模塊。這些信息可以為黑客所用,並且黑客還可以從中得知你所配置的服務器上的很多設置都是默認狀態。
所以,請加入如下兩條:
serversignature off
servertokens prod
serversignature 出現在apache所產生的像404頁面、目錄列表等頁面的底部。servertokens目錄被用來判斷apache會在server http響應包的頭部填充什么信息。如果把servertokens設為prod,那么http響應包頭就會被設置成:server:apache
15 優化maxclient
Apache2啟動的時候會創建一些進程(配置文件中的StartServer設定的數目),並保持一個最大的MaxClients數;每一個超過該數目的連接請求,都會排隊等待。
這 個MaxClients設置,是和MPM相關的。在apache.conf中,既有針對prefork的MaxClients設置,也有針對worker 的。前者在<IfModule mpm_prefork_module>段,后者在<IfModule mpm_worker_module>段。這里以woker為例,原配置為:
<IfModule mpm_worker_module> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
MaxClients如果要設置超過256的話,就需要同步修改ServerLimit的數值,因為ServerLimit的默認值是256.比如這里需要配置為1024:
<IfModule mpm_worker_module> StartServers 10 ServerLimit 1024 MaxClients 1024 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
那么,要怎么才能知道是不是需要增大MaxClients呢?可以查看Apache2的錯誤日志文件/var/log/apache2/error.log,如果發現如下內容,就應該增大MaxClients了:
[error] server reached MaxClients setting,consider raising the MaxClients setting
下面代碼取自http.conf文件
ServerLimit 2000
StartServers 25
MinSpareServers 25
MaxSpareServers 50
MaxClients 2000
MaxRequestsPerChild 10000
ServerLimit 2000
#有這個參數就不必像apache1一樣修改源碼才能修改256客戶數的限制,要放到最前面才會生效,2000是這個參數的最大值
StartServers 25
#指定服務器啟動時建立的子進程數量,prefork默認為5。
MinSpareServers 25
#指定空閑子進程的最小數量,默認為5。如果當前空閑子進程數少於MinSpareServers ,那么Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
MaxSpareServers 50
#設置空閑子進程的最大數量,默認為10。如果當前有超過MaxSpareServers數量的空閑子進程,那么父進程將殺死多余的子進程。此參數 不要設的太大。如果你將該指令的值設置為比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。
MaxClients 2000
#限定同一時間客戶端最大接入請求的數量(單個進程並發線程數),默認為256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit 。
MaxRequestsPerChild 10000
#每個子進程在其生存期內允許伺服的最大請求數量,默認為10000.到達MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。
將MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
16 啟用壓縮優化apache
在 Apache1.3中,有個gzip模塊。在Apache2中,沒有了gzip,有一個新的模塊叫做deflate。這個模塊可以在用戶訪問網站時實時將 內容進行壓縮,然后再傳給客戶端。因為壓縮比較高(測試結果顯示,其壓縮比最高可達97%,最少也有40%),所以deflate能夠極大地加速網站,節 約帶寬。當然,壓縮是要花費CPU時間的。
要啟用該模塊,運行以下命令:
sudo a2enmod deflate
sudo /etc/init.d/apache2 force-reload
該模塊有一個配置文件:/etc/apache2/mods-enabled/deflate.conf,可以配置要壓縮的文件類型。默認配置為:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml </IfModule>
上面配置較為合理,因為一般情況下,不需要對圖片、PDF和mp3等文件進行壓縮,那是很費資源的事情
17 使用緩存mod_cache提高apache性能
apache2 有兩種緩存模塊:一種是基於硬盤的,另外一種是基於內存的。
前者由mod_disk_cache實現,后者由mod_mem_cache實現,不過它們都 需要mod_cache的支持。
在基於內存的緩存方式中,還有一個mod_file_cache模塊,它是用於搭配mod_mem_cache模塊使用 的。
Apache調優(cookbook)
<Location /server-status> SetHandler server-status </Location> ExtendedStatus On
HostNameLookups Off
AllowOverride None
<IfModule mpm_winnt.c> ThreadsPerChild 1000 MaxRequestsPerChild 8000 Win32DisableAcceptEx </IfModule>
MMapFile /www/xxx/index.html
MMapFile /www/xxx/otherpage.html
CacheFile /www/xxx/index.html
CacheFile /www/xxx/otherpage.html
Apache錯誤處理
Apache虛擬主機
ServerName 127.0.0.1 NameVirtualHost * #表示所設定的主機可在所有的地址上運行 <VirtualHost *> ServerName test1.name #默認的第一個主機會接收未列出虛擬主機的請求 DocumentRoot "C:/Apache2.2/htdocs/test1" </VirutalHost> <VirtualHost *> ServerName test2.name DocumentRoot "C:/Apache2.2/htdocs/test2" </VirutalHost>
<VirtualHost *> ServerName default DocumentRoot /www/htdocs ErrorDocument 404 /site.html </VirutualHost>
ServerAlias www.baidu.com baidu.name
ServerName 127.0.0.1 <VirtualHost 10.0.0.1> ServerName test.name DocumentRoot "C:/Apache2.2/htdocs/test1" </VirtualHost> <VirtualHost 10.0.0.2> ServerName test2.name DocumentRoot "C:/Apache2.2/htdocs/test2" </VirutalHost>
<VirtualHost _default_> DocumentRoot /www/htdocs </VirtualHost>
Listen 8080 <VirtualHost 10.0.0.1:8080> DocumentRoot "C:/Apache2.2/htdocs/test_port8080" </VirtualHost> Listen 8081 <VirtualHost 10.0.0.1:8081> DocumentRoot "C:/Apache2.2/htdocs/test2_port8081" </VirtualHost>
NameVirtualHost 192.168.1.1 NameVirtualHost 170.1.2.3 <VirtualHost 192.168.1.1 170.1.2.3> DocumentRoot "C:/Apache2.2/htdocs/test" </VirtualHost>
Apache日志管理
emerg 緊急狀況,網頁服務器無法使用
alert 必須立刻采取動作
crit 危急的狀況
error 錯誤的狀況
warn 警告
notice 正常但很重要
info 提供信息
debug 調試信息
CustomLog "| /path/to/rotaelogs /path/to/logs/access_log.%Y-%m-%d 86400" combined