程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> VPS上如何優化Apache

VPS上如何優化Apache

編輯:PHP基礎知識
 

一、削減模塊以及計算調整可供APACHE使用的內存
影響WEB服務器最大的因素即為內存,所以我們把它放在最前面

在默認狀態下,Apache會分配最大256個並發客戶端連接,或者256個進程(每一個都對應一個請求)。按照這種設置,一個流量巨大的網站會在頃刻間崩潰(即使你假設每個進程占用5MB內存,那也需要1.3GB的內存來滿足請求的數量)。如果不采取其它措施,系統會通過硬盤來嘗試使用交換空間以處理它無法在物理內存中完成的任務。

所以,我們需要修改httpd.conf,使它使用最小的模塊集
修改httpd.conf文件,保留
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module modules/libphp5.so
LoadModule fastcgi_module modules/mod_fastcgi.so


去掉其它的模塊

我們配置的VPS服務器,系統加LAMP程序啟動後總共在300M左右的內存,你可能希望要求50%的物理內存都供Apache使用,這樣,你需要確定可以讓httpd真正使用的內存數。

首先准確計算出apache占用的進程數
# ps -ef|grep httpd
root 21678 1 0 Jul19 ? 00:00:00 /usr/local/apache//bin/httpd -k start
vuser 21679 21678 0 Jul19 ? 00:00:00 /usr/local/apache//bin/httpd -k start
vuser 21714 21678 0 Jul19 ? 00:00:07 /usr/local/apache//bin/httpd -k start
vuser 21855 21678 0 Jul19 ? 00:00:07 /usr/local/apache//bin/httpd -k start


看apache是以什麼用戶啟動的,然後我們再用
# ps -U vuser -u vuser u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
vuser 29838 0.0 0.0 200404 5580 ? S 11:29 0:00 /usr/local/apache//bin/fcgi- -k start
vuser 29845 0.0 0.0 879952 7592 ? Sl 11:29 0:00 /usr/local/apache//bin/httpd -k start
vuser 29851 0.0 0.0 879952 7592 ? Sl 11:29 0:00 /usr/local/apache//bin/httpd -k start


(注:一般是用# ps -U apache -u apache u察看,但我這裡運行apache的是vuser用戶)

我們看到單個httpd進程使用了7.6 MB的RSS(駐留集大小)內存以及最大為88M左右的VSZ(虛擬內存),這當然在很大程度上取決於你在Apache裡加載和運行的模塊數量。這決不是一個固定的數字。由於這個數字裡還包含了共享庫包,所以不是100%的准確。我們可以認為RSS數字的一半是httpd線程真正使用的內存數,這可能還有點保守,但是離我們的目的已經非常接近了,這樣,我們HTTPD線呈使用的內存數即為8M/2=4M

說明:MinSpareservers和MaxSpareServers分別設置空閒子進程的最小和最大數量,StartServers設置了服務器啟動時建立的子進程數量。
ServerLimit則是控制MaxClients所能使用的最大值。縮減MaxClients能讓運行動態內容(比如:Drupal)的服務器有很大的改變。如果你的VPS遭遇到流量的大幅增加,而你的MaxClients設置的太高的話,你的服務器將會無限循環工作於從物理內存交換頁面到虛擬內存中,最終導致宕機。一般計算適當的MaxClients值取決於你總共可用的系統內存除於每個Apache進程使用的內存。

計算MaxClient
MaxClients=(總內存-預留內存)/單個APACHE子進程使用的內存。
那麼我們的1GRAM的VPS服務器的MaxClient即為:
MaxClients=(1024-512)/4=128個

設置MaxRequestsPerChild

MaxRequestsPerChild設置的是每個子進程可以處理的請求數。每個子進程在處理了MaxRequestsPerChild個請求後將自動銷毀。0意味著無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:

1、可防止意外的內存卸漏;
2、在服務器負載下降的時侯會自動減少子進程數。

因此,可根據服務器的負載來調整這個值,如果非零的話,vps上個人認為1000左右是比較合適的。事實上這個值對Apache的性能影響不是很大。

以下是本人在1G內存的VPS上常用的配置
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 20
ServerLimit 128
MaxClients 128
MaxRequestsPerChild 1000
</IfModule>


它們要根據你的VPS的大小和你的Apache進程大小等來決定。

備注:
HostnameLookups最好設置為off,否則會帶來延遲,因為對每一個請求都需要作一次DNS查詢。如果你使用了任何”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主機名而不是IP地址),則代價是要進行兩次DNS查詢(一次正向和一次反向,以確認沒有作假)。所以,為了得到最高的性能,應該避免使用這些指令(不用域名而用IP地址也是可以的)。如果網站空間中沒有使用 Options FollowSymLinks,Apache就必須執行額外的系統調用以驗證符號連接。為了避免這種情況應該在所有地方都設置FollowSymLinks。如果設置AllowOverride all,則Apache會試圖對文件名的每一個組成部分都打開.htaccess,如無必要應該對文件系統中所有的地方都使用 AllowOverride None。在Apache2.0能夠忽略將要被發送的文件的內容的時候(比如發送靜態內容),如果操作系統支持sendfile() ,則Apache將使用內核提供的sendfile()來發送文件。使用sendfile可以通過免除分離的讀和寫操作來提升性能。我們可以通過設置EnableSendfile on來開啟它。

二、優化KeepAlive
KeepAlive允許你的訪問者在同一個TCP連接上完成多個請求,理論上它有助於提升反應時間,因為你的訪問者可以在同一個連接上請求你的網頁,圖片和javascripts。遺憾地是,Apache對於每個請求都需要一個工作進程去處理。默認的每個工作進程將持續打開15秒來處理每個請求,即使你的訪問者已經不再使用它了!這也就意味著你的系統在任何時間都是缺少工作進程的。我們都希望我們那只有有限資源的小VPS能有確實在工作的工作進程。實現的方法之一是關閉KeepAlive。在你的httpd.conf文件中找到下面的一行:  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved