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

tengrid發表於2009-05-18

http://space.itpub.net/16555225/viewspace-495942

以前編譯apache的時候
都是google搜尋到的直接拿來用

這次自己編譯mod_rewrite和ssl遇到了問題
又不知道問題出在哪裡
一個是mod_rewrite模組沒有起作用
一個是以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

後來經過查詢
明白了問題出在哪裡

當時我是這麼編譯apache的

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


而問題就出在–enable-so
現在知道了–enable-so的意思是說
讓apache 核心裝載DSO,但是不實際編譯任何動態模組
–enable-ModuleName的意思是說 編譯幷包含模組ModuleName
而 –enable-ModuleName=shared 的意思是說將這個模組編譯成動態的.

明白了這幾個選項的意思,感覺就水落石出了
根據上面的總結
我應該去掉–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的動態與靜態編譯的理解
好比有兩個人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)編譯了

> ldd httpd
libz.so.1 => /lib64/libz.so.1 (0x00002b6414c22000)
libaprutil-0.so.0 => /usr/local/apache2/lib/libaprutil-0.so.0 (0x00002b6414d36000)
libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00002b6414e4d000)
libapr-0.so.0 => /usr/local/apache2/lib/libapr-0.so.0 (0x00002b6414f71000)
librt.so.1 => /lib64/librt.so.1 (0x00002b6415097000)
libm.so.6 => /lib64/libm.so.6 (0x00002b64151a0000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00002b64152f6000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00002b641542f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b6415545000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b641565d000)
libc.so.6 => /lib64/libc.so.6 (0x00002b6415761000)
/lib64/ld-linux-x86-64.so.2 (0x00002b6414b06000)

能否在編譯時指定所用到的庫進行靜態編譯?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/94384/viewspace-600258/,如需轉載,請註明出處,否則將追究法律責任。

相關文章