2009年9月26日 星期六

[轉貼]apache動態編譯/靜態編譯問題

出處: apache動態編譯/靜態編譯問題 - 城市胡同
以前編譯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)編譯了

沒有留言: