問一個老問題,apache的動態編譯.

火星人 @ 2014-03-04 , reply:0


問一個老問題,apache的動態編譯.

在apache編譯模塊這方面,有動態編譯和靜態編譯,靜態編譯暫先不研究,動態編譯中1.*版本的和2.* 版本的編譯參數還不一樣.
這讓我很迷糊決定花時間把他弄明白.還請各位大哥幫我解惑.

在網上看到千篇一律的文檔中的一篇文檔這樣寫
舉例說明,mod_rewrite模塊為例:
錯誤方式:
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl

會導致,ssl啟動apache的時候報告:
apachectl startssl
Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_free

解釋:

問題出在–enable-so,–enable-so表示讓apache核心裝載DSO,但是不實際編譯任何動態模塊;
–enable-ModuleName表示,編譯並包含模塊ModuleName;
–enable-ModuleName=shared表示,將這個模塊編譯成動態的。

正確方式:

搞清除上面所述的內容,就ok了:
應該去掉–enable-so這行;
如何希望動態編譯模塊:比如:–enable-rewrite應該替換為: –enable-rewrite=shared

最後,我將要編譯的應該為:
./configure
--prefix=/usr/local/apache2
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
解釋:
–enable-mods-shared=most表示,動態的編譯進來大多數的模塊。那麼,–enable-mods-shared=all是指動態的編譯所有的模塊。如果把-shared去掉,就是靜態的編譯了。

總結一下,動態、靜態apache編譯安裝的方式的區別。靜態編譯,就是將 module直接在安裝的過程中防盜apache中,當apache使用module的時候,就可以直接使用了。而,動態編譯安裝,只是將module引入到apache之中,在使用的時候才會真正的去尋找。但是在動態中必須有正確額地址,否則就會出現上文提到的錯誤。



我對這篇文檔不明白的問題是
1. –enable-so表示讓apache核心裝載DSO,但是不實際編譯任何動態模塊;
這句話的意思是說 只要有這條語句 apache  就把DSO裝載進核心. 也就是把mod_so模塊靜態編譯進apache 中,又
因為單個模塊的動態載入,是基於mod_so的模塊來實現的.那這麼說–enable-so 就是動態載入模塊的前題了?

2. –enable-ModuleName=shared表示,將這個模塊編譯成動態的。
我在http://hedong.3322.org/archives/000366.html這篇文檔中看到.
創建和安裝一個 Apache發布的(distributed) 模塊,比方說將mod_foo.c編譯成mod_foo.so:

$ ./configure --prefix=/path/to/install --enable-foo=shared
$ make install

這樣直接就能編譯成apache  能載入的模塊了?為什麼沒有–enable-so  參數呢?

3. –enable-ModuleName表示,編譯並包含模塊ModuleName;
編譯並包含模塊 難道這個參數是用到靜態編譯當中嗎?他到底在什麼時候需要用呢?

4. –enable-mods-shared=most表示,動態的編譯進來大多數的模塊。

他說的這個大多數的模塊,到底都是哪些模塊.有沒有一篇文檔規定apache 使用–enable-mods-shared=most 參數的時候 都把哪些模塊動態編譯進去了?為什麼不直接讓他等於個all 把所有模塊動態編譯進去 那多省事啊?


還請大家抽出時間幫我解答一下.謝謝!
《解決方案》

為什麼大家點了。都不留點什麼呢:em16: 我問題描述的不清楚嗎??
《解決方案》

:em17: 我的理解:
1、--enable-modules用來指定系統允許使用的功能擴展的類型,這裡指定為so類型,--enable-so用來指定允許DSO(動態共享對象)
這麼做可以讓apache可以動態載入MOD而不需要重新編譯。 也正如你所說是動態MOD的前提。

2、--enable-ModuleName=shared  只是說你載入這個MOD后可以在httpd.conf文件中用mod_so的LoadModule命令,告訴伺服器在啟動或重新啟動時將此模塊載入
   --enable-so 是說可以載入新的MOD 或這裡是啟動或重新啟動時將此模塊載入

3、我的理解為靜態。你用loadmodule 的時候就用

4、不知道

如有錯誤,一起討論
《解決方案》

正確方式:

搞清除上面所述的內容,就ok了:
應該去掉–enable-so這行;
如何希望動態編譯模塊:比如:–enable-rewrite應該替換為: –enable-rewrite=shared

最後,我將要編譯的應該為:
./configure
--prefix=/usr/local/apache2
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
解釋:
–enable-mods-shared=most表示,動態的編譯進來大多數的模塊。那麼,–enable-mods-shared=all是指動態的編譯所有的模塊。如果把-shared去掉,就是靜態的編譯了。

我理解您解釋的第一個問題了,謝謝。那在他那篇文章看來。
他把-enable-so 去掉后這就說明,他把 rewrite speling forward ssl 等 模塊靜態編譯進apache 中了?

如果想進行動態編譯,則要把 --enable-rewrite 等替換為 -enable-rewrite=shared 並且在 httpd.conf 中加上 LoadModule 語句。


錯誤方式:
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl

會導致,ssl啟動apache的時候報告:
apachectl startssl
Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf:
Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_fre

上面apache啟動的時候報錯。是因為他沒在 httpd.conf 中沒加 LoadModule 語句吧?



我的第二個問題,我的理解是。他雖然用了--enable-foo=shared 參數是動態編譯,要在httpd.conf 中添加LoadModule 語句,但沒有-enable-so 參數所以以後他在需要什麼模塊就只能重新編譯apache了對嗎?


蘭色字體是我 的一些看法。哪錯了。請大家多多指正。

我一樓的第四個問題還請大家幫幫忙,謝謝啦!

[ 本帖最後由 confuseding 於 2008-7-1 11:47 編輯 ]
《解決方案》

模塊選項
有兩種使用模塊的方法:一是靜態連接進核心,二是作為DSO模塊動態載入;如果編譯中包含任何DSO模塊,則mod_so會被自動包含進核心。如果希望核心能夠裝載DSO,但不實際編譯任何DSO模塊,則需明確指定"--enable-so=static"。

一般語法
一般情況下你可以使用如下語法啟用或者禁用某個模塊:

--disable-MODULE
禁用MODULE模塊(僅用於基本模塊)
--enable-MODULE=shared
將MODULE編譯為DSO(可用於所有模塊)
--enable-MODULE=static
將MODULE靜態連接進核心(僅用於擴展和實驗模塊)
--enable-mods-shared=MODULE-LIST
將MODULE-LIST中的所有模塊都編譯成DSO(可用於所有模塊)
--enable-modules=MODULE-LIST
將MODULE-LIST靜態連接進核心(可用於所有模塊)
上述 MODULE-LIST 可以是:
(1)用引號界定並且用空格分隔的模塊名列表

--enable-mods-shared='headers rewrite dav'
(2)"most"(大多數模塊[遇見錯誤模塊時忽略該模塊而不中斷配置過程])
(3)"all"(所有模塊[遇見錯誤模塊時中斷配置過程並報錯])

--enable-mods-shared=most
注意

configure將忽略MODULE和MODULE-LIST中的拼寫錯誤,注意仔細拼寫。用於MODULE和MODULE-LIST中的名稱是"mod_NAME"中去掉"mod_"並將剩餘部分中的下劃線"_"替換為連字元"-"以後的結果,比如"mod_log_config"模塊應當表示為"log-config"。

我的帖子 沒有小於2個字元。




[火星人 via ] 問一個老問題,apache的動態編譯.已經有209次圍觀

http://www.coctec.com/docs/service/show-post-18469.html