Apache靜態編譯和動態編譯詳解

靜態:
在使用./configure 編譯的時候,若是不指定某個模塊爲動態,即沒有使用:enable-mods-shared=module或者enable-module=shared 這個2箇中的一個,那麼全部的默認模塊爲靜態。 那麼何謂靜態?  其實就是編譯的時候全部的模塊本身編譯進 httpd 這個文件中(咱們啓動可使用這個執行文件,如: ./httpd & ) ,啓動的時候這些模塊就已經加載進來了,也就是可使用了, 一般爲:<ifmodule> </ifmodule> 來配置。因此你們看到的配置都是 <ifmodule  module.c>  ,很顯然,module.c這個東西已經存在 httpd這個文件中了。
apache

動態:
就是編譯的時候,使用enable-module=shared 或者enable-modules-shared=module 來動態編譯。  那麼什麼是動態?  靜態是直接編譯進httpd中, 那麼動態顯然就不編譯進去了,也就是你啓動的時候根本不會加載這個模塊, 而是給你一個module.so 文件,你必定要使用 loadmodule 這個語法來加載,這個模塊纔有效。
服務器

那麼區別就出來了:靜態的模塊一般是<ifmodule></ifmodule> 來配置, 動態使用loadmoule來加載,而後再配置。
至於性能方面我沒怎麼關注, 官方說靜態的比動態的在性能方面多5%左右。
動態相對方便一點, 若是你編譯完後,發現有些須要的模塊你沒編譯進去(默認編譯多少模塊呢?你用./configure --help | grep disable查看, 會讓你去disable表示默認會編譯進去,否者disable有什麼用呢?)你能夠動態的加載, 只要你有module.so文件。
性能

首先看看編譯apache的選項含義spa

對於apache 1.3.x
./configure --prefix=/usr/local/apache \
--enable-module=so \
--enable-module=most  \
--enable-shared=max \
--enable-module=rewrite
server

對於apache 2.0.x
./configure --prefix=/usr/local/apache2 \
--enable-modules=most \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite
ip

對於apache 2.2.0
./configure --prefix=/usr/local/apache2 \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite
內存

舉例一:編譯一個apache2.2.8版本
# ./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared=most --enable-rewrite --enable-forward
說明:
so模塊用來提供 DSO 支持的 apache 核心模塊.
--enable-so 選項:讓 Apache 能夠支持DSO模式,注意,這裏採用的是 Apache2.0 的語法。若是你的Apache 是1.3版本,應改成--enable-module=so
ssl

--enable-mods-shared=most選項:
告訴編譯器將全部標準模塊都動態編譯爲DSO模塊。
若是用的是 Apache1.3, 改成--enable-shared=max就能夠。
資源

-enable-rewrite選項:支持地址重寫功能,使用1.3版本的朋友請將它改成--enable-module=rewrite
--enable-module=most
用most能夠將一些不經常使用的,不在缺省經常使用模塊中的模塊編譯進來.
--enable-mods-shared=all意思是動態加載全部模塊,若是去掉-shared話,是靜態加載全部模塊.
編譯器

舉例二:
執行 ./configure --prefix=/server/apache/ \
--enable-deflate=shared \
--enable-headers=shared \
--enable-rewrite=shared \
--enable-mods-shared=most 

--enable-mods-shared=all意思是動態加載全部模塊,若是去掉-shared話,是靜態加載全部模塊。
--enable-mods-shared=most則是動態編譯大部分經常使用的模塊,固然,也能夠有選擇的加載一些模塊,most意思是隻包含一般用的模塊,而且以動態加載模式加載. 記住apache1.xx和apache2.xx的模塊編譯寫法是不同的.

下面我來講說上面幾種模塊的做用:
deflate模塊做用爲讓服務器實現gzip功能,能夠大大下降服務器的帶寬消耗。(爲何這麼說,我來講給你聽,好比一個大小爲700KB的網頁,可是經過壓縮功能,咱們把壓縮到70KB,而後吧壓縮到的70KB傳到WEB客戶端,實際上這不就是下降帶寬的消耗嗎?)可是卻有個致命的缺點,那是以消耗服務器的CPU,內存資源爲代價的。
注:
apache1.xx版本中這個模塊名叫mod_gzip模塊,在apache2.xx中才被deflate模塊所替代。
headers功能如上,跟deflate配套使用。
rewrite這個模塊的做用很重要,防盜鏈幾乎全靠它了。
爲了有什麼這麼一條,我前面還要加載那3個模塊呢,其實也沒什麼,當時只是擔憂那3個模塊不在「通用」範疇內,全部手動添加了。就加着吧,反正沒任何問題。
這裏我來解釋下什麼叫動態加載和靜態加載?
說簡單,並用打比喻的方式來解釋.

比如有兩我的a和m
a表明apache,m表明module
要想讓a使用m的東西
一個方法是把m的東西都放到a那裏去,a使用的時候就是現成的了
就是所謂的靜態編譯

還有一個方法,就是告訴a, m的住址,當a要使用m的東西的時候,a去找m,而後使用不過,這種方法要注意的一個問題就是:m必需要有實際的住址,不然a會找不到m而產生錯誤的,我此文開始提到的 apachectl startssl產生的錯誤就是這個緣由,應該再編譯好ssl才能夠的.這種方法也就是apache 的動態(DSO)編譯了

相關文章
相關標籤/搜索