【面試虐菜】—— Apache知識整理


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)

1 內存
    適當選用適合大小的內存,保證谷峰負載時,有足夠的內存使用
 
2 使用ab測試apache性能
    ab -n 1000 -c 10 http://www.test.com
 
3 調節保持連接的設定
   
  KeepAlive On
  #在單一連接時進行多個請求
    MaxKeepAliveRequests 0
   #單一連接時間可以允許多少個保持連接的請求
    KeepAliveTimeout 15
  #在沒有接受其他請求時,會持續開啟特定連接的時間
 
 
4 取得網站活動快照
    啟用server-status處理器來取得子進程在運行的快照
    
<Location /server-status>
        SetHandler server-status
    </Location>
    ExtendedStatus On

 

5 避免DNS查詢
    以DNS來查詢客戶端地址
    
HostNameLookups Off

 

6 最佳化符號鏈接
    主要考慮安全防護:永遠不要允許遵循符號鏈接
    主要考慮性能:永遠使用Options FollowSysLinks且絕不使用Options SysLinkIfOwnerMatch
 
7 盡量降低.htaccess文件對性能的影響
    只在必要的目錄中啟用AllowOverride,並告知Apache不要浪費時間在其他的位置上查找.htaccess文件
    
AllowOverride None
    然后以<Directory>區塊啟用必要的.htaccess文件
 
8 最佳化進程的產生
    MinSpareServers
 #MaxSpareServers 控制服務器池的大小,以便有子進程等待服務引入的請求
    (永遠不要發生,當請求送至網站卻沒有閑置的服務器進程在等待處理請求的情形)
 
9 調節線程的產生
 
   <IfModule mpm_winnt.c>
        ThreadsPerChild 1000
        MaxRequestsPerChild 8000
        Win32DisableAcceptEx 
    </IfModule>

 

10 將經常查看的文件存入高速緩存區
    [使用MMapFile]----將文件內容存入內存的高速緩沖區
    MMapFile /www/xxx/index.html
    MMapFile /www/xxx/otherpage.html

 

    [使用CacheFile]----將文件句柄存入內存的高速緩沖區,稍微降低系統性能,但是占用內存較少
    CacheFile /www/xxx/index.html
    CacheFile /www/xxx/otherpage.html

 

 

Apache錯誤處理

 
1自定義錯誤信息
    ErrorDocument 405 /errors/test.html
 
2 將無效的URL重定向至其他網頁
    ErrorDocument 404 /index.html
    DirectoryIndex index.html /path/to/notfound.html
 
3 在發生錯誤狀況時得到通知
    ErrorDocument 404 /cgi-bin/404.cgi
    404.cgi的內容
 

Apache虛擬主機

1 IP地址方式:每台虛擬主機都有其唯一的IP地址
名稱尋址方式:多台虛擬主機會以不同的名稱在同一IP地址上運行
 
2 以名稱尋址的虛擬主機
使用NameVirtualHost *指令以及<VirtualHost>區塊
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>

 

 
3 指定一台名稱尋址的主機位默認服務器,並在查找不到主機時,轉向默認網頁
<VirtualHost *>
    ServerName default
    DocumentRoot /www/htdocs
    ErrorDocument 404 /site.html
</VirutualHost>

 

 
4 對特定主機設置多個名稱
ServerAlias www.baidu.com baidu.name

 

 
5 以IP尋址的虛擬主機(可以在系統上設定多個IP,然后各自支持某個網站)
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>

 

 
6 建立IP尋址的默認虛擬主機
<VirtualHost _default_>
    DocumentRoot /www/htdocs
</VirtualHost>

 

1 _default_ 建立虛擬主機,處理所有未設定虛擬主機“地址:端口號”的請求
2 _default_ 可與端口號同時使用 _default_:443 會接受443端口號的所有未設定虛擬主機的請求
 
7 端口號尋址的虛擬主機
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>

 

 
這種用法不常見,因為請求時,很麻煩,需要填入端口號:比如 www.test.com:8080/
 
8 在多個地址上顯示相同的網頁內容
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日志管理

1 取得更詳細的錯誤信息
 
LogLevel Debug
 
emerg 緊急狀況,網頁服務器無法使用
alert 必須立刻采取動作
crit 危急的狀況
error 錯誤的狀況
warn 警告
notice 正常但很重要
info 提供信息
debug 調試信息

 

 
2 按照日或小時來記錄請求
 
CustomLog "| /path/to/rotaelogs /path/to/logs/access_log.%Y-%m-%d 86400" combined
 
rotaelogs #日志的主文件名
86400 #兩次更新間隔的時間 一天24小時86400秒
 
3 記錄引用的網頁URL
    %{Referer}i
 
4 記錄瀏覽器軟件的名稱
    %{User-Agent}i


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM