靜態:
在使用./configure 編譯的時候,如果不指定某個模組為動態,即沒有使用:enable-mods-shared=module或者enable-module=shared 這個2個中的乙個,那麼所有的預設模組為靜態。 那麼何謂靜態? 其實就是編譯的時候所有的模組自己編譯進 httpd 這個檔案中(我們啟動可以使用這個執行檔案,如: ./httpd & ) ,啟動的時候這些模組就已經載入進來了,也就是可以使用了, 通常為: 來配置。所以大家看到的配置都是 ,很顯然,module.c這個東西已經存在 httpd這個檔案中了。
動態:
就是編譯的時候,使用enable-module=shared 或者enable-modules-shared=module 來動態編譯。 那麼什麼是動態? 靜態是直接編譯進httpd中, 那麼動態顯然就不編譯進去了,也就是你啟動的時候根本不會載入這個模組, 而是給你乙個module.so 檔案,你一定要使用 loadmodule 這個語法來載入,這個模組才有效。
那麼區別就出來了:靜態的模組通常是 來配置, 動態使用loadmoule來載入,然後再配置。
至於效能方面我沒怎麼關注, 官方說靜態的比動態的在效能方面多5%左右。
動態相對方便一點, 如果你編譯完後,發現有些需要的模組你沒編譯進去(預設編譯多少模組呢?你用./configure --help | grep disable檢視, 會讓你去disable表示缺省會編譯進去,否者disable有什麼用呢?)你可以動態的載入, 只要你有module.so檔案。
首先看看編譯apache的選項含義
對於apache 1.3.x
./configure --prefix=/usr/local/apache \
--enable-module=so \
--enable-module=most \
--enable-shared=max \
--enable-module=rewrite
對於apache 2.0.x
./configure --prefix=/usr/local/apache2 \
--enable-modules=most \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite
對於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
--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)編譯了.
apache動態編譯 靜態編譯區別
以前編譯apache的時候 都是google搜尋到的直接拿來用 這次自己編譯mod rewrite和ssl遇到了問題 又不知道問題出在 乙個是mod rewrite模組沒有起作用 乙個是以ssl啟動apache的時候報告如下錯誤 後來經過查詢 明白了問題出在 當時我是這麼編譯apache的 conf...
apache動態編譯 靜態編譯問題
以前編譯apache的時候 都是google搜尋到的直接拿來用 這次自己編譯mod rewrite和ssl遇到了問題 又不知道問題出在 乙個是mod rewrite模組沒有起作用 乙個是以ssl啟動apache的時候報告如下錯誤 後來經過查詢 明白了問題出在 當時我是這麼編譯apache的 conf...
靜態聯編與動態聯編
在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...