Welcome! 登入 註冊
美寶首頁 美寶百科 美寶論壇 美寶部落格 美寶地圖

Advanced

有關 Apache HTTP Server 系統限制與設定的討論

Posted by HP 
底下是一些相關討論與說明的文章:

1. 修正 Apache Worker MPM 與 APC 設定 (阿駕零零壹 © 學習筆記, 2007/04/22)

2.
Apache Prefork 和 Worker 模式 (黑族論壇 Linux 伺服器討論版, 2009/01/09)

3. Apache服务器的配置 详解 (56CTO.com, 2008/08/8)



Edited 1 time(s). Last edit at 08/05/2009 03:39PM by HP.
(編輯記錄)

Apache 實際的運作,其實都是以可同時「多 process」執行的程式模組進行,稱為 MPM (Mutil-Processing Module)。

MPM 有兩種:prefork 和 worker。

所以我們在看系統狀態(top)時,看到的 httpd2-prefork 或 worker 其實就是 apache 的執行程式。

在本文我們針對 prefork 的 performance tuning 作討論。

Apache 效能設定檔在不同的 Linux distribution 可能會不同。一般設定檔(可能)是在 /etc/httpd/conf/httpd.conf ,而 openSUSE / Linux SUSE 則是在 /etc/apache2/server-tuning.conf


以 prefork MPM 的原始設定為例:

<IfModule prefork.c>
ServerLimit 150 (ServerLimit 的設定應「大於等於」底下的 MaxClients)
StartServers 5 (apache 一執行時的 process數,也就是可同時處理的 request 數)
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 (官方的定義就是「最大可同時處理的 connection 數」)
MaxRequestsPerChild 10000 (一個「Apache sever」在處理該數目後,會自動中止並重啟,以防 memory leakage。)
</IfModule>

簡而言之,提升效能限制主要是調 ServerLimit 和 MaxClients。而且筆者覺得很妙的是,這裡的 Server、Client、Child,其實指的都是同一件事。亦即,一個 Apache Process。

提升效能限制,可以提高成以下設定:

<IfModule prefork.c>
# number of server processes to start
# http://httpd.apache.org/docs/2.2/mod/mpm_common.html#startservers
StartServers 128
# minimum number of server processes which are kept spare
# http://httpd.apache.org/docs/2.2/mod/prefork.html#minspareservers
MinSpareServers 16
# maximum number of server processes which are kept spare
# http://httpd.apache.org/docs/2.2/mod/prefork.html#maxspareservers
MaxSpareServers 64
# highest possible MaxClients setting for the lifetime of the Apache process.
# http://httpd.apache.org/docs/2.2/mod/mpm_common.html#serverlimit
ServerLimit 2048
# maximum number of server processes allowed to start
# http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients
MaxClients 2048
# maximum number of requests a server process serves
# http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxrequestsperchild
MaxRequestsPerChild 10000
</IfModule>

重啟 apache 請先 stop 再 start。

例如:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start


此外,針對 SUSE Linux 還有一個可以降低負載的大絕招:不要引入 aod_module。

AOD 是 Art of Defense 的意思。如果您的 web server 程式在撰寫的時候就有注意 SQL injection 或 Cross-Stie Scripting 等攻擊的話,同時又沒有什麼攻擊事件的疑慮(而且「效能需求」非常高)。可以考慮不要 load AOD 這個 module。

AOD 設定檔在 /etc/apache2/conf.d/aod.conf 。

簡單來說把 aod.conf 的內容都 mark 起來就好了。或者看一下 aod.conf 的內容,其實滿好懂的。

筆者的個人經人,不執行 aod module ,效能幾乎快了十倍。

以 ab2 -c 1000 -n 10000 http://localhost/index.html 這個測試為例。

原本的平均反應時候是 1-3 秒。不執行 aod 後,平均反應時間只要 300~400 ms 左右。可以接受的 concurrent request 也大幅升。(大致就是依 Apache 的 MaxClients 的設定)

最後也是一樣,重啟 apache server 請先 stop 再 start。


參考文章:
Apache MPM prefork (官方文件)
Apache的PreFork MPM功能 (2008)

相關文章:
修正 Apache Worker MPM 與 APC 設定 (2007)



Edited 3 time(s). Last edit at 04/25/2010 02:50AM by HP.
(編輯記錄)