apache 静态编译和动态编译参考
apache-2.2.22?編譯安裝筆記
一、靜態編譯
????在使用./configure?編譯的時候,即沒有使用--enable-mods-shared=[module]或者--enable-[module]=shared這2個中的一個,那么所有的默認模塊為靜態。何謂靜態??其實就是編譯的時候所有的模塊自己編譯進httpd?這個文件中,啟動的時候這些模塊就已經加載進來了,也就是可以使用了,通常:<ifmodule> </ifmodule>?來配置。所以大家看到的配置都是<ifmodule??module.c>??,很顯然,module.c這個東西已經存在httpd這個文件中了。
?
第一次安裝不帶任何參數,只是指定一個安裝目錄
./configure --prefix=/app/apache2
我們來看看默認靜態編譯安裝有哪些模塊
二、動態編譯
就是編譯的時候,使用--enable-mods-shared=[module]或者--enable-[module]=shared?來動態編譯。?那么什么是動態??靜態是直接編譯進httpd中,?那么動態顯然就不編譯進去了,也就是你啟動的時候根本不會加載這個模塊,?而是給你一個module.so?文件,你一定要使用?loadmodule?這個語法來加載,這個模塊才有效。
?????那么區別就出來了:靜態的模塊通常是在httpd.conf文件中使用<ifmodule></ifmodule>?來配置,?動態使用loadmoule來加載,然后再配置。
?
第二次安裝使用動態編譯安裝,參數也只是多了一個
./configure --prefix=/app/apache2?--enable-mods-shared=all
?
1)?可以看到默認被編譯進httpd主文件只有幾個核心的模塊,也就是說這4個被靜態編譯進httpd主文件,隨著主進程的開啟就直接啟動模塊了。
?
2)?再查看httpd.conf配置文件中包含了以下LoadModule?模塊的行,共有51個,這些模塊的路徑都在modules/目錄下,這些就是被動態加載的模塊,如果你不需要某個模塊,只要在行首加#就可以。但這51個模塊并不是apache的所有模塊,這一點需要搞清楚,在這51個模塊之外的其他所有模塊都需要在編譯參數中明確指定,后面會講到這一點。
| LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_anon_module modules/mod_authn_anon.so LoadModule authn_dbd_module modules/mod_authn_dbd.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_dbm_module modules/mod_authz_dbm.so LoadModule authz_owner_module modules/mod_authz_owner.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule dbd_module modules/mod_dbd.so LoadModule dumpio_module modules/mod_dumpio.so LoadModule reqtimeout_module modules/mod_reqtimeout.so LoadModule ext_filter_module modules/mod_ext_filter.so LoadModule include_module modules/mod_include.so LoadModule filter_module modules/mod_filter.so LoadModule substitute_module modules/mod_substitute.so LoadModule deflate_module modules/mod_deflate.so LoadModule log_config_module modules/mod_log_config.so LoadModule log_forensic_module modules/mod_log_forensic.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule cern_meta_module modules/mod_cern_meta.so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so LoadModule ident_module modules/mod_ident.so LoadModule usertrack_module modules/mod_usertrack.so LoadModule unique_id_module modules/mod_unique_id.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule version_module modules/mod_version.so LoadModule mime_module modules/mod_mime.so LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so LoadModule asis_module modules/mod_asis.so LoadModule info_module modules/mod_info.so LoadModule cgi_module modules/mod_cgi.so LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module?modules/mod_dir.so LoadModule imagemap_module modules/mod_imagemap.so LoadModule actions_module modules/mod_actions.so LoadModule?speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule rewrite_module modules/mod_rewrite.so |
?
./configure --prefix=/app/apache2 --enable-so --enable-mods-shared=all
結果:同上(只要--enable-mods-share=all,可以不用加--enable-so)
說明:
--enable-mods-shared=all?意思是動態加載所有模塊(并不是說apache所有的模塊都已經通過這條命令被加載進來了),--enable-mods=all表示靜態加載所有模塊(后面會有舉例)。由于編譯參數中使用了動態加載所有模塊,所以其它需要被編譯進來的模塊都會以動態加載模塊方式進行編譯。
?
三、通過舉例驗證
例舉1??我們來看以下這個編譯參數
./configure --prefix=/app/apache2
--enable-mods-shared=all
--enable-cache
--enable-mem-cache
--enable-file-cache
--enable-disk-cache
--enable-mods-shared=all?動態加載所有模塊,httpd.conf中默認會動態加載51個模塊(以LoadModule?開始的方式)。
--enable-cache --enable-mem-cache --enable-file-cache --enable-disk-cache?而這四個相關cache模塊會以動態模塊方式被加載,也就是httpd.conf中以LoadModule的模塊會多這4個,那就是共有55個動態模塊了。
從以上編譯參數可以看出只要編譯中有--enable-mods-shared=all?這個參數,那么之后所有你想要增加的模塊都會以動態模式來安裝,也就是最終在?httpd.conf?中以LoadModule形式來加載模塊。
有的朋友說還有一條?--enable-mods-shared=most?意思是動態加載大多數模塊,這個大多數其實就是在上面51個模塊中少了的那幾個模塊(用紅色表示出來了)。我個人覺得這個--enable-mods-shared=most?就是少了幾個模塊,并無實際什么特別,如果編譯參數中有這條,那么其他所有指定的模塊也都會以動態模塊來安裝。
?
例舉2??剛剛上面提到了--enable-mods=all,我們來看看這個編譯參數
./configure --prefix=/app/apache2
--enable-mods=all
--enable-cache
--enable-mem-cache
--enable-file-cache
--enable-rewrite
--enable-mods=all?靜態編譯所有模塊,很明顯這個編譯參數是把所有的模塊將會以靜態方式來編譯,編譯好后,我們來看看結果
我們可以看到除了默認模塊,指定的幾個模塊(mod_file_cache.c??mod_cache.c??mod_mem_cache.c?mod_rewrite.c)都被靜態編譯進來了。
?
例舉3?這個參數跟例舉2的參數很相似,只是我指定幾個為動態加載模塊
./configure --prefix=/app/apache2
--enable-mods=all
--enable-cache=shared
--enable-mem-cache=shared
--enable-file-cache
--enable-rewrite=shared
其結果就是--enable-file-cache?是靜態編譯,其他3個有shared的都是動態編譯,在httpd.conf中以LoadModule?開頭的行。
?
例舉4
./configure --prefix=/app/apache2
--enable-modules=all
結果如下,有55個靜態模塊
| core.c | mod_dbd.c | mod_expires.c | mod_info.c |
?
例舉5
./configure --prefix=/app/apache2
--enable-modules=all
--enable-mods-shared=all
--enable-cache=static
--enable-disk-cache=static
--enable-mem-cache=static
--enable-file-cache
--enable-ssl
結果是指定--enable-[module]=static的模塊為靜態編譯,其他都是動態編譯
?
總結三點:
1)?如果編譯參數中有--enable-mods-shared=all?或者--enable-mods-shared=most,那么所有--enable-[module]都將會以動態模式來編譯,除非特別指定--enable-[module]=static?為靜態編譯?。
2)如果編譯參數中有--enable-mods=all?指定所有靜態方式的話,還可以用--enable-[module]=shared來動態加載模塊。
3)特別注意如果編譯參數中既有--enable-mods=all靜態編譯又有--enable-mods-shared=all動態編譯,那么最終會使用動態編譯。
官方說是靜態編譯比動態編譯性能要好5%左右,具體沒有驗證過。
推薦編譯安裝參數,以下是靜態編譯所有模塊,但保留動態加載選項--enable-so,之后還是可以在配置文件中動態加載自己編譯的模塊。
./configure --prefix=/app/apache2
--enable-modules=all
--enable-cache=static
--enable-mem-cache=static
--enable-file-cache=static
--enable-disk-cache=static
--enable-ssl=satic
--enable-so
?
apache編譯配置參數:
http://blog.snsgou.com/post-240.html
http://blog.chinaunix.net/uid-20784749-id-1844507.html
?
關于動態編譯和靜態編譯的比方說明:
好比有兩個人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)編譯了.
參考:http://httpd.apache.org/docs/2.4/
?
轉載于:https://www.cnblogs.com/Alight/p/4707100.html
總結
以上是生活随笔為你收集整理的apache 静态编译和动态编译参考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Echart..js插件渲染报错 dat
- 下一篇: 开发文档收集