Compiling Apache web server with dynamic module support
I have just compiled Apache 2.2.17 on a fresh install of Ubuntu 10.04.2. It's a learning exercise to discover what actually goes on when you compile something rather than just using apt-get hence the avoidance of using apt-get in favour of compiling the thing myself.
I ran:
sudo ./configure --prefix=/etc/apache --enable-module=so --enable-rule=SHARED_CORE --enable-shared=max --enable-ssl=shared --enable-rewrite=shared
followed by the obligatory:
sudo make && sudo make install
All seemed to go well (Apache starts up no problems) except that in the Apache modules directory where I would have expected to see mod_rewrite.so and mod_ssl.so, instead I see:
#cd /etc/apache/modules
#ls -l
mod_rewrite.a
mod_rewrite.la
mod_ssl.a
mod_ssl.la
How can I turn these into .so开发者_开发知识库 files so I can link them with LoadModule in the Apache config?
Thanks in advance.
You should not run everything as root. ./configure
and make
will work fine without root permissions, make install
requires root permissions for writing to directories like /etc
and /usr/bin
.
/etc
is not suitable for executables, let alone a full Apache installation. If you want to put your configuration files in /etc/apache
, use the --sysconfdir=/etc/apache
. The correct place to install a custom-build Apache is /usr/local
.
To enable shared modules, you have to pass the --enable-so
option, the modules which should be compiled as shared should be added to --enable-mods-shared
.
The correct configure line for Apache + mod_ssl (shared module) + mod_rewrite (shared module) is, installed in /usr/local/apache
with configuration files in /etc/apache
:
./configure --prefix=/usr/local/apache --sysconfdir=/etc/apache --enable-so \
--enable-rewrite --enable-ssl --enable-mods-shared='rewrite ssl'
After successful configuring Apache HTTPd, run make
followed by sudo make install
.
More information about the configure options can be found at the Apache HTTPd documentation.
I have suffered the same problem: tried to compile apache 2.2.x with all (possible) modules compiled as dynamic modules and not statically.
Even though I have used the configure option (--enable-mods-shared="list,of,modules") the modules were compiled as static and not as shared. And worse, some errors appeared when trying to "httpd -M" or "apachectl configtest" related to "*.so" files not being found even though they are listed in the httpd.conf just installed (gmake install).
I have investigated the FreeBSD ports system and found that their port indeed create an apache2.2.x with all shared modules, as I wanted. I have found that it is an issue with the "configure" options.
To solve, I have done exactly as the ports, when configuring I have first "disabled" all modules (hard to find the complete list of them but got it) with many "--disable-MODULE" entries in configure. Here is my working example:
"./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/"
This way, all the apache2.2.x modules were built as dynamic instead of static. If you forget to "--disable-XXX" them and only try to "--enable-XXX" or even "--enable-mods-shared=XXX,YYY,ZZZ", it does not work. You have to disable them before setting the "--enable-mods-shared" configure option.
Try this
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"
Caveat: --enable-mods-shared=all does not actually build all modules.
--enable-shared=max is invalid. I think you wanted to use "most"?
http://httpd.apache.org/docs/2.2/programs/configure.html
Fantastic. Thank you both for your help.
It took a couple of attempts but I finally got it working. I ended up having to download the source for an earlier version of Apache before the modules would compile correctly instead of producing the .a and .la files. Not sure if that was because there is some kind of caching thing going on during the configure/make/install process that I'm not aware of and some part of my previous (incorrect) attempts at compiling were being re-run somehow or maybe it was something to do with the 2.2.17 version of Apache - not sure. Anyway, it worked in the end.
精彩评论