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

2021-05-21 21:15:49 字數 3865 閱讀 5570

在使用

./configure編譯的時候,如果不指定某個模組為動態,即沒有使用:

enable-mods-shared=module

或者enable-module=shared這個2

個中的乙個,那麼所有的預設模組為靜態。

那麼何謂靜態?

其實就是編譯的時候所有的模組自己編譯進

這個檔案中(我們啟動可以使用這個執行檔案,如:

),啟動的時候這些模組就已經載入進來了,也就是可以使用了,

通常為:

來配置。所以大家看到的配置都是

,很顯然,

module.c

這個東西已經存在

這個檔案中了。

動態:就是編譯的時候,使用

enable-module=shared

或者enable-modules-shared=module

來動態編譯。

那麼什麼是動態?

靜態是直接編譯進

中,那麼動態顯然就不編譯進去了,也就是你啟動的時候根本不會載入這個模組,

而是給你乙個

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 /

對於apache 2.0.x

./configure --prefix=/usr/local/apache2/

--enable-modules=most /

--enable-mods-shared=all /

--enable-so /

--enable-rewrite

對於apache2.2.0

./configure --prefix=/usr/local/apache2 /

--enable-mods-shared=all /

--enable-so /

--enable-rewrite

--enable-module=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...

apache動態編譯和靜態編譯區別

apache的動態和靜態編譯區別 一 含義 動態意味著不用此模組的時候就不需要load進來,使用的時候需要顯示的load進來 靜態意味著先把模組load進來,想用的時候直接使用.二 編譯 靜態編譯 當只需要靜態編譯module的時候,語法應寫成 enable ssl或 enable ssl stat...