使用动态模块支持编译Apache Web服务器

时间:2011-03-10 12:51:05

标签: apache apache-modules

我刚刚在全新安装的Ubuntu 10.04.2上编译了Apache 2.2.17。这是一个学习练习,可以在编译内容时发现实际发生的事情,而不仅仅是使用apt-get,因此避免使用apt-get来支持自己编译。

我跑了:

sudo ./configure --prefix=/etc/apache --enable-module=so --enable-rule=SHARED_CORE --enable-shared=max --enable-ssl=shared --enable-rewrite=shared

接下来是强制性的:

sudo make && sudo make install

所有似乎都顺利(Apache启动没有问题),除了在Apache模块目录中我希望看到mod_rewrite.so和mod_ssl.so,而是我看到:

#cd /etc/apache/modules
#ls -l
mod_rewrite.a
mod_rewrite.la
mod_ssl.a
mod_ssl.la

如何将这些转换为.so文件,以便将它们与Apache配置中的LoadModule链接起来?

提前致谢。

4 个答案:

答案 0 :(得分:4)

您不应该以root身份运行所有内容。 ./configuremake在没有root权限的情况下可以正常工作,make install需要root权限才能写入/etc/usr/bin等目录。

/etc不适合可执行文件,更不用说完整的Apache安装了。如果要将配置文件放在/etc/apache中,请使用--sysconfdir=/etc/apache。安装自定义构建Apache的正确位置是/usr/local

要启用共享模块,您必须传递--enable-so选项,应将编译为共享的模块添加到--enable-mods-shared

Apache {mod_ssl(共享模块)+ mod_rewrite(共享模块)的正确配置行安装在/usr/local/apache中,配置文件位于/etc/apache

./configure --prefix=/usr/local/apache --sysconfdir=/etc/apache --enable-so \
  --enable-rewrite --enable-ssl --enable-mods-shared='rewrite ssl'

成功配置Apache HTTPd后,运行make,然后运行sudo make install

有关配置选项的更多信息,请参阅Apache HTTPd documentation

答案 1 :(得分:0)

试试这个

sudo ./configure --prefix=/etc/apache --enable-so --enable-shared=max --enable-rewrite -enable-mods-shared="all ssl ldap cache proxy authn_alias mem_cache file_cache authnz_ldap charset_lite dav_lock disk_cache"
  

警告: - enable-mods-shared = all   实际上并没有构建所有模块。

- enable-shared = max无效。我想你想用“最”?

http://httpd.apache.org/docs/2.2/programs/configure.html

答案 2 :(得分:0)

优秀。谢谢你们的帮助。

尝试了几次,但我终于开始工作了。在模块正确编译而不是生成.a和.la文件之前,我最终必须下载早期版本Apache的源代码。不确定是不是因为在配置/制作/安装过程中发生了一些我不知道的缓存事情,我之前(不正确)尝试编译的某些部分正在以某种方式重新运行或者可能它与2.2.17版本的Apache有关 - 不确定。无论如何,它最终起作用了。

答案 3 :(得分:0)

我遇到了同样的问题:尝试编译apache 2.2.x,并将所有(可能的)模块编译为动态模块,而不是静态编译。

即使我使用了configure选项(--enable-mods-shared =“list,of,modules”),模块也被编译为静态而不是共享。更糟糕的是,当尝试与“* .so”文件相关的“httpd -M”或“apachectl configtest”时,出现了一些错误,即使它们已在刚安装的httpd.conf中列出(gmake install)。

我已经调查了FreeBSD ports系统,发现他们的端口确实创建了一个包含所有共享模块的apache2.2.x,正如我想的那样。我发现这是“配置”选项的一个问题。

要解决这个问题,我完全按照端口进行操作,在配置时我首先“禁用”所有模块(很难找到它们的完整列表但是得到它),并在configure中添加了许多“--disable-MODULE”条目。这是我的工作示例:

"./configure" 
"--enable-layout=FreeBSD" 
"--with-perl=/usr/local/bin/perl5.12.4" 
"--with-expat=/usr/local" 
"--with-iconv=/usr/local" 
"--with-pcre=/usr/local" 
"--disable-authn-file" 
"--disable-authn-default" 
"--disable-authz-host" 
"--disable-authz-groupfile" 
"--disable-authz-user" 
"--disable-authz-default" 
"--disable-auth-basic" 
"--disable-charset-lite" 
"--disable-include" 
"--disable-log-config" 
"--disable-env" 
"--disable-setenvif" 
"--disable-mime" 
"--disable-status" 
"--disable-autoindex" 
"--disable-asis" 
"--disable-cgid" 
"--disable-cgi" 
"--disable-negotiation" 
"--disable-dir" 
"--disable-imagemap" 
"--disable-actions" 
"--disable-userdir" 
"--disable-alias" 
"--disable-filter" 
"--disable-substitute" 
"--disable-proxy" 
"--disable-proxy-connect" 
"--disable-proxy-ftp" 
"--disable-proxy-http" 
"--disable-proxy-ajp" 
"--disable-proxy-balancer" 
"--disable-proxy-scgi" 
"--disable-reqtimeout" 
"--enable-so" 
"--enable-mods-shared=auth_basic auth_digest authn_file authn_dbm authn_anon authn_default authn_alias authz_host authz_groupfile authz_user authz_dbm authz_owner authz_default cache disk_cache file_cache dav dav_fs actions alias asis autoindex cern_meta cgi charset_lite deflate dir dumpio env expires headers imagemap include info log_config logio mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias filter version reqtimeout ssl" 
"--with-dbm=sdbm" 
"--with-ssl=/usr" 
"--disable-ipv6" 
"--with-devrandom" 
"--with-mpm=worker" 
"--prefix=/usr/local" 
"--mandir=/usr/local/man" 
"--infodir=/usr/local/info/" 

这样,所有apache2.2.x模块都构建为动态而非静态。 如果你忘了“--disable-XXX”他们并且只尝试“--enable-XXX”甚至“--enable-mods-shared = XXX,YYY,ZZZ”,它就不起作用了。您必须在设置“--enable-mods-shared”配置选项之前禁用它们。