apache動靜態編譯

2021-09-20 22:20:17 字數 4156 閱讀 6089

為了使apache支援https訪問,系統需要安有apache、openssl、mod_ssl.so

1、安裝openssl:

2、安裝mod_ssl.so:

現在apache都自帶了這個模組,預設是不安裝的。安裝方式有兩種:靜態編譯和動態載入。

靜態編譯:即在編譯安裝apache的時候,在./configure的時候新增--enable--ssl,這樣mod_ssl.so模組就載入進了apache。(如果已經static編譯過的模組,再次修改httpd.conf方式用loadmodule命令,在啟動apache時會報"模組名" is built-in and can't be loaded.的錯誤。)

動態編譯:無需重新編譯apache,直接進入[source]/modules/ssl;執行[apache]/bin/apxs -a -i -c -l/usr/lib/openssl/engines/lib -c *.c -lcrypto -lssl -ldl;這種方式載入之後,在apache的安裝目錄下的modules目錄會生成乙個mod_ssl.so,同時httpd.conf中會增加一行loadmodule php5_module modules/libphp5.so([apache]表示apache的安裝目錄,[source]表示apache原始碼目錄)注:

apxs命令引數說明:

-i  此選項表示需要執行安裝操作,以安裝乙個或多個動態共享物件到伺服器的modules目錄中。

-a  此選項自動增加乙個loadmodule行到httpd.conf檔案中,以啟用此模組,或者,如果此行已經存在,則啟用之。

-a  與 -a 選項類似,但是它增加的loadmodule命令有乙個井號字首(#),即此模組已經準備就緒但尚未啟用。

-c  此選項表示需要執行編譯操作。它首先會編譯c源程式(.c)files為對應的目標**檔案(.o),然後連線這些目標**和files中其餘的目標**檔案(.o和.a),以生成動態共享物件dsofile 。如果沒有指定 -o 選項,則此輸出檔名由files中的第乙個檔名推測得到,也就是預設為mod_name.so

靜態: 

在使用./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...

Linux 下編譯鏈結動靜態庫

linux 版本是 red hat 9 核心版本是 2.4.18 輸入 which gcc 檢視 gcc 的位置在 usr bin gcc gcc v 檢視 gcc 編譯前的配置資訊 prefix usr 說明了安裝目錄 沒有 with headers 說明預設的 include 就在安裝目錄下 所...