A Cooly Weblog

             ::  ::  ::  ::  :: 管理

          Apache安裝配置與優化

          Posted on 2007-04-29 13:19 acooly 閱讀(3161) 評論(0)  編輯  收藏 所屬分類: WEB開發服務器安裝配置
          本文針對apache? web服務器的安裝配置收集有效的一些經驗和方法,用于交流。

          1.Apache安裝配置

          Apache的安裝,考慮只用于Tomcat的前段代理,處理圖片和靜態文件的請求,并把動態請求轉發到tomcat服務處理。本文使用編譯安裝方式,把跟需求無關的模塊關閉,只使用最小的模塊編譯,提高軟件性能。

          配置編譯命令請參考:

          http://www.uplinux.com/download/doc/apache/ApacheManual/install.html#configure

          編譯參數說明:

          編譯和包含是兩個不同的概念。編譯是指這個模塊被編譯了,要想使用它,只用簡單的修改httpd.conf加上LoadModule xxx_module? libexec/mod_xxx.so 明確指出。

          用以前命令可以查看缺省時已編譯和包含進去的模塊。不用顯式的--enable-MODULE[=shared] LoadModule 操作。就已經可以使用的。

          1. core.cApache HTTP 服務器提供的核心功能。必須要有的。
          2. mod_access.c:安全認證大大降低訪問速度,建議disable it .
          3. mod_auth.c :安全認證大大降低訪問速度,建議disable it .
          4. mod_include.cserver side include已經過時了,建議disable it .
          5. mod_log_config.c:用于定制log格式.最好保留.
          6. mod_env.c:修改傳送到 CGI 腳本和 SSI 頁面的系統環境(變量)。一般說來,可以不需要。
          7. mod_setenvif.c :用戶設置環境變量和認證相關,如果沒有使用壓縮輸出,建議disable it .
          8. prefork.cImplements a non-threaded, pre-forking web server。參考下面的mpm介紹。
          9. http_core.cApache HTTP 服務器提供的核心功能。必須要有的。
          10. mod_mime.c:用于增加文件應用的關聯。最好保留。
          11. mod_status.cProvides information on server activity and performance 。一般說來,可以不需要。
          12. mod_autoindex.c:不需要將沒有缺省index文件的目錄下所有文件列出,建議disable it .
          13. mod_asis.c:盡量不使用CGI:一直是Apache安全問題最多的地方,建議disable it .
          14. mod_cgi.c:盡量不使用CGI:一直是Apache安全問題最多的地方,建議disable it .
          15. mod_negotiation.c :內容協商,以根據瀏覽器提供的設置選擇不同媒介類型、語言、字符集和編碼的最佳表現,還有對來自瀏覽器的不完整內容協商信息作智能處理的能力。一般說來,可以不需要。
          16. mod_dir.c:用于缺省index文件:index.php等。我們現在的應用不需要這個。看情況而定。
          17. mod_imap.c:盡量不使用CGI:一直是Apache安全問題最多的地方,建議disable it .
          18. mod_actions.c:盡量不使用CGI:一直是Apache安全問題最多的地方,建議disable it
          19. mod_userdir.c:比如:需要在~/username/下調試php.可用可不用.建議disable it .
          20. mod_alias.c:比如:需要將以前的URL進行轉向或者需要使用CGI script-alias.建議disable it .
          21. mod_so.c :如果編譯中包含有任何動態模塊,則mod_so模塊會被自動包含進核心。如果希望核心能夠裝載DSO,而不實際編譯任何動態模塊,需要明確指定--enable-so。我們的應用使用靜態編譯,不需要它。建議disable it .
          22. CC="pgcc" CFLAGS="-O2" :編譯器參數優化
          23. --profixapache的安裝目錄,默認是安裝在/usr/local/apache
          $?cd?/tools
          $?tar?–xzvf?apache
          -2.0.59.tar.gz
          $?cd?httpd2.
          0.59
          $?CC
          ="pgcc"?CFLAGS="-O2"?\
          .
          /configure?--prefix=/usr/apache-2.0.59?\
          --disable-access?\
          --disable-auth?\
          --disable-include?\
          --disable-env?\
          --disable-status?\
          --disable-autoindex?\
          --disable-asis?\
          --disable-cgi?\
          --disable-negotiation?\
          --disable-imap?\
          --disable-actions?\
          --disable-userdir?\
          --disable-alias?\
          --enable-deflate?\
          --enable-headers?\
          --enable-setenvif?\
          --enable-so
          $?make
          $?make?install

          安裝完成后,因為編譯關閉了很多默認的功能模塊,所以直接使用發布的默認配置是不能啟動服務器的,需要作調整。

          apache的安裝目錄為$APACHE_HOME

          備份默認配置文件$APACHE_HOME/conf/httpd.conf,然后使用highperformance.conf最為配置文件

          ?

          $?cd?$APACHE_HOME/conf/
          $?mv?httpd.conf?httpd.conf_bak
          $?cp?highperformance.conf?httpd.conf
          $?..
          /bin/apachectr?start

          如果啟動失敗,請屏蔽調httpd.conf中的mod_access相關命令,如Order等,關于目錄權限的控制在本例中可以使用變通方式解決,使用沒有加載目錄權限控制功能。

          啟動驗證,訪問http://$IP/,如果正常顯示頁面,表示成功。

          2.PMP

          MPMMulti-Processing Modules,多道處理模塊)

          指定MPM的方法

          $ ./configure --help|grep mpm

          顯示如下:

          --with-mpm=MPM

          Choose the process model for Apache to use.

          MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}

          主要闡述prefork,如果不用“--with-mpm”顯式指定某種MPMprefork就是Unix平臺上缺省的MPMprefork本身并沒有使用到線程,2.0版使用它是為了與1.3版保持兼容性;prefork用單獨的子進程來處理不同的請求,進程之間是彼此獨立的,這也使其成為最穩定的MPM之一。

          prefork的工作原理是,控制進程在最初建立“StartServers”個子進程后,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值為止。這就是預派生(prefork)的由來。這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。

          下面是prefork的默認配置段:

          <IfModule prefork.c>

          StartServers???????? 5?

          MinSpareServers????? 5?

          MaxSpareServers???? 10?

          MaxClients???????? 150?

          MaxRequestsPerChild? 0

          </IfModule>

          MinSpareServers

          設置了最小的空閑進程數。

          MaxSpareServers

          設置了最大的空閑進程數,如果空閑進程數大于這個值,Apache會自動kill掉一些多余進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServersMaxSpareServers

          MaxClients

          MaxClients是這些指令中最為重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那么后面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。系統管理員可以根據硬件配置和負載情況來動態調整這個值。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大于256(在2.0中源于#define DEFAULT_SERVER_LIMIT 256)。如果把這個值設為大于256,那么Apache將無法起動。事實上,256對于負載稍重的站點也是不夠的。在Apache 1.3中,這是個硬限制。如果要加大這個值,必須在“configure”前手工修改的源代碼樹下的src/include/httpd.h中查找256,就會發現“#define HARD_SERVER_LIMIT 256這行。把256改為要增大的值(如4000),然后重新編譯Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得無須重編譯Apache就可以加大MaxClientsServerLimit使用也是單獨添加一行在這就可以了。如果ServerLimit的值再這定義超過了20000,就要修改server/mpm/prefork/prefork.c? #define MAX_SERVER_LIMIT 20000。將20000改成更大的值。

          ?

          MaxRequestsPerChild

          設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求后將自動銷毀。0意味著無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:可防止意外的內存泄漏;在服務器負載下降的時侯會自動減少子進程數。

          ?

          Apache+jk2的每個進程的的大小是2M,本系統預計分配給apache的內存為400M,那么根據公式:

          apache_max_process_with_good_perfermance < (400M / 2m) * 2 = 400
          apache_max_process
          400 * 1.5 = 700

          即最佳性能設置為:400

          ?

          按照上面的分析,本系統的的prefork.c配置為:

          <IfModule?prefork.c>

          ServerLimit??????
          400

          MaxClients???????
          400

          StartServers?????
          5

          MinSpareServers??
          5

          MaxSpareServers?
          10

          </IfModule>

          3.gzip壓縮輸出

          通過加入mode_deflate模塊對服務器輸出壓縮傳輸,可以減小輸出壓力,節約帶寬。

          可以減少40%左右的流量,減少機器用于傳輸的負載.

          壓縮輸出的配置需要以下三個模塊功能支持

          mod_setenvif.c

          mod_deflate

          mod_headers

          具體說明請參考:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/

          配置

          參考:http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_deflate.html

          ?

          AddOutputFilterByType?DEFLATE?text/html?text/plain?text/xml?text/javascript?text/css

          #?Compress?everything?except?images

          <Location?/>

          #?Insert?filter

          SetOutputFilter?DEFLATE

          #?Netscape?4.x?has?some?problems

          BrowserMatch?^Mozilla/4?gzip-only-text/html

          #?Netscape?4.06-4.08?have?some?more?problems

          BrowserMatch?^Mozilla/4\.0[678]?no-gzip

          #?MSIE?masquerades?as?Netscape,?but?it?is?fine

          BrowserMatch?\bMSIE?!no-gzip?!gzip-only-text/html

          #?Don't?compress?images

          SetEnvIfNoCase?Request_URI?\

          \.(?:gif|jpe?g|png)$?no-gzip?dont-vary

          #?Make?sure?proxies?don't?deliver?the?wrong?content

          Header?append?Vary?User-Agent?env=!dont-vary

          </Location>

          ?

          ?

          主站蜘蛛池模板: 天长市| 黔江区| 宁远县| 平顺县| 定西市| 嘉鱼县| 高青县| 沙田区| 安远县| 城口县| 赤峰市| 抚顺县| 任丘市| 红桥区| 凤庆县| 宁乡县| 佛山市| 南阳市| 柳江县| 汶上县| 洛阳市| 鄂伦春自治旗| 宁南县| 凤山县| 扬州市| 枣强县| 宜城市| 邢台县| 天等县| 桓仁| 资溪县| 谢通门县| 阳信县| 汽车| 东平县| 秭归县| 平塘县| 改则县| 边坝县| 滦南县| 满洲里市|