安装apachen分为动态、静态两种方式。
动态编译,只需要在以后的使用中在配置文件中调整配置文件就可以调整加载模块;静态则相反,在编译中就决定了相应的模块。
./configure
--prefix=/usr/local/apache2
--enable-so
--enable-mods-shared=most
--enable-rewrite
--enable-speling
--enable-forward
--enable-ssl
--with-ssl=/usr/local/openssl
会导致,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
解释:
问题出在–enable-so,–enable-so表示让apache核心装载DSO,但是不实际编译任何动态模块;
–enable-ModuleName表示,编译并包含模块ModuleName;
–enable-ModuleName=shared表示,将这个模块编译成动态的。
正确方式:
搞清除上面所述的内容,就ok了:
应该去掉–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编译安装的方式的区别。静态编译,就是将 module直接在安装的过程中防盗apache中,当apache使用module的时候,就可以直接使用了。而,动态编译安装,只是将module引入到apache之中,在使用的时候才会真正的去寻找。但是在动态中必须有正确额地址,否则就会出现上文提到的错误。
./configure --prefix=/usr/local/apache --enable-mods-shared=all --enable-so |
解释
--prefix=/usr/local/apache apache的安装目录 --enable-mods-shared=all 动态加载所有的模块 --enable-so 核心装载dso |
但是,在实际配置的httpd.conf中,发现,按照以前在本地测试环境中配置的加载模块语句:
LoadModule rewrite_module libexec/mod_rewrite.so AddModule mod_rewrite.c |
这样的形式会报错误。
但是,修改之后:
LoadModule rewrite_module modules/mod_rewrite.so |
就没有错误了。
分析一下,这里肯定是静态加载,也就是只有地址,在用的时候再获取。那么就不能加上AddModule。为什么呢?
那换个说法,只要静态编译所有的模块就可以使用上面的方式么?没有测试所以不能妄言。如果我的假设是正确的,那么针对动态编译和动态编译,rewrite模块的配置是不同的么?
那么上面文章中提到的就是错误的了。
还是有很多疑问,继续考虑吧。
以上引用自:http://blog.sina.com.cn/s/blog_47243df301000239.html
结合我的经验:
今天重新编译httpd目的有三个:1、加载rewrite模块 2、采用ProxyPass的方式整合apache和tomcat 3、编译进php模块
我的环境是CentOS 64位操作系统,apache是httpd-2.2.4,tomcat5.5,jdk1.5。
第一步:
最初尝试了很多configure的参数组合,都没达到目的。索性把大多数共享模块都加进来。使用了以下参数,达到了加载rewrite、proxy、proxy-ajp模块的目的:
./configure --prefix=/usr/local/httpd2/ --enable-mods-shared=most --enable-proxy=shared --enable-proxy-ajp=shared --enable-forward=shared --enable-proxy-connect=shared --enable-proxy-http=shared --enable-so --enable-deflate=shared --enable-headers=shared --enable-include=shared --enable-rewrite=shared
在apache的modules目录下生成了大多数以及我想要的so,这下放心了。
第二步:
配置ProxyPass以及ProxyPassReverse规则,实现apache和tomcat的整合。
关于这部分的规则也可以写不少文字了,以下就把当前应用的配置留下。具体的规则另开文章来描述。
在httpd.conf最后加上:
ProxyPass /images/ !
ProxyPass /js/ !
ProxyPass /css/ !
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
前三行是表示禁止转发该路径的请求,一般来说是静态的。后两行自然是转发所有的访问至8009也就是tomcat的ajp端口。
这样则完成了同tomcat的整合。
值得注意的是,同tomcat的整合还有一种tomcat-connector的方式,也就是mod_jk,那种的配置更灵活,适用性更高。但是由于其复杂性(目前已经没有更新版本),同时apache2.2版本开始,自身整合了mod_proxy和mod_proxy_ajp模块,实现了更简单的同tomcat的整合,所以建议采用这种方式了。
第三步:
编译进php5模块。php版本为5.2.0。解压之后,使用编译选项:./configure --prefix=/usr/local/php --with-mysql-dir=/usr/local/mysql --with-apxs2=/usr/local/httpd/bin/apxs --enable-trace-vars --with-zlib --enable-sockets
顺利完成安装,在httpd的modules目录下生成了libphp5.so模块,同时在httpd.conf配置中也加上了LoadModule modules/libphp5.so。
cp php.ini-dist /usr/local/php/lib/php.ini
增加AddType把php加到httpd的配置中:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
此时可正常启动httpd
写了一个简单的phpinfo测试,却提示下载.......这是怎么回事呢?记得上面的ProxyPass配置不?就是这个地方了,它将所有的/的访问转到了tomcat,自然是没办法处理php的了。
在网上也搜了一下相关的处理办法,我的想法是能够做到*.php的都不转发,然而ProxyPass好像只支持url的方式,不支持正则匹配,一般的解决办法是比如建一个php的目录,那么在ProxyPass /php !来实现对php的处理。很明显不是一个好的解决办法,如果我的php和jsp混和在一起的,从url上就不能控制了。既便分开,始终要加上一个不必要的路径以区分对php的处理,实在不爽。
经过一番google,找到一种解决办法,那就是配置虚拟主机。在conf最下面加:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName a.test.com
DocumentRoot /php
DirectoryIndex index.html index.php
<Directory "/php">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.test.com
DocumentRoot /www
DirectoryIndex index.html index.jsp
<Directory "/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ProxyPass /images/ !
ProxyPass /js/ !
ProxyPass /css/ !
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
</VirtualHost>
这样就实现了当访问a.test.com时,apache解析php那个目录,而访问www.test.com时,解释www那个目录,并转发至tomcat。运行测试成功!