设为首页 收藏本站
查看: 856|回复: 0

[经验分享] 动态加载apache模块

[复制链接]

尚未签到

发表于 2018-11-24 09:16:29 | 显示全部楼层 |阅读模式
动态加载apache模块

  

  工作中往往随着业务的改变和新功能的添加,会使用到不同的模块,但是我们编译apache的时候却没有指定。我们可以重新编译apache指定相应模块,可是大多数情况是不允许重新编译的,也很麻烦。所以大部分人都会使用动态加载模块,下面来说一下apache如何动态添加模块。
  

  一、环境介绍

  想要动态加载模块,必须要有同一版本的apache源码包

  可以使用
  /usr/local/apache/bin/apachectl -v 查看当前版本
  Server version: Apache/2.2.22 (Unix)
  我的版本为2.2.22,那么就需要apache2.2.22 版本的源码包 httpd-2.2.22.tar.gz
  源码包中有一个modules目录,里面放着各种未编译的源码程序
  编译这些程序的时候需要 gcc 支持,可以使用
  rpm -qa | grep gcc 命令查看是否已经安装
  gcc-4.1.2-54.el5
  libgcc-4.1.2-54.el5
  gcc-gfortran-4.1.2-54.el5
  gcc-c++-4.1.2-54.el5
  我这里已经装过了,没有安装可使用
  yum install gcc* -y 进行安装
  如果安装mod_rewrite模块,是需要gdb支持的,可以使用下面命令安装
  yum install gdb* -y 进行安装
  二、编译模块

  对apache的模块如果动态编译通常可以使用 /path/apxs -c *.c来完成
  下面以mod_rewrite和mod_ssl模块为例,讲解下安装过程

  首先安装mod_rewrite模块,我们进入源码包的modules/mappers/目录,因为mod_rewrite模块的源码在这个目录下面,注意不是安装目录

  cd httpd-2.2.22/modules/mappers/
  查看里面是否包含mod_rewrite模块源码
  ls | grep mod_rewrite
  mod_rewrite.c
  mod_rewrite.dep
  mod_rewrite.dsp
  mod_rewrite.exp
  mod_rewrite.h
  mod_rewrite.mak
  果然在这里,使用下面命令编译
  /usr/local/apache/bin/apxs -c mod_rewrite.c -lgdbm (如果不是mod_rewrite模块不需要加 -lgdbm)
  gcc -shared -o mod_rewrite.so mod_rewrite.o
  这样在当前目录下(即:httpd-2.2.22/modules/mappers/)就会生成一个名为mod_rewrite.so的模块
  我们可以手动将这个模块移动到apache默认的模块目录下

  mv mod_rewrite.so /usr/local/apache/modules/
  然后修改httpd.conf文件,加入下面内容

  LoadModule rewrite_module     modules/mod_rewrite.so
  当然也可以使用命令直接将mod_rewrite.so添加到/usr/local/apache/modules/目录下,并且在httpd.conf中写入
  LoadModule rewrite_module     modules/mod_rewrite.so
  使用下面命令即可

  /usr/local/apache/bin/apxs -i -a -n rewrite /http-2.2.22/modules/mappers/mod_rewrite.so 
  检测下语法,可使用命令
  /usr/local/apache/bin/apachectl -t

  如果返回值为Syntax OK,那么恭喜添加成功
  如果返回值为不能定位API”之类的错误,那就是说明LoadModule后面的模块名的语法要根据您的apache版本加以改变。一般apache的配置文件中会写一个例子,按照它的格式写就好。
  例如这种格式

  #LoadModule mod_rewrite_module     modules/mod_rewrite.so
  如果没有错误重启apache

  /usr/local/apache/bin/apachectl restart
  查看是否加载成功,可使用下面的命令

  /usr/local/apache/bin/apachectl  -M
  如果显示内容中包含rewrite_module 则成功,不包含则失败。
  其他模块也可按同一方法编译安装,但不包括mod_ssl模块,我在编译mod_ssl模块时遇到了其他问题
  

  再来看一下mod_ssl模块
  先进入mod_ssl模块所在目录

  cd httpd-2.2.22/modules/ssl/
  使用下面命令编译
  /usr/local/apache/bin/apxs -c mod_rewrite.c
  报错
  mod_ssl.c:553: 错误:expected ‘{’ at end of input
  apxs:Error: Command failed with rc=65536
  谷歌之后加上了-DHAVE_OPENSSL参数
  /usr/local/apache/bin/apxs -c -DHAVE_OPENSSL mod_ssl.c
  没有报错,继续执行

  gcc -shared -o mod_ssl.so mod_ssl.o
  /usr/local/apache/bin/apxs -i -a -n ssl /httpd-2.2.22/modules/ssl/mod_ssl.so
  

  检测语法

  /usr/local/apache/bin/apachectl -t
  出现undefined symbol: ssl_cmd_SSLMutex错误
  谷歌了一下,搜到下面内容
          undefined symbol: ssl_cmd_SSLMutex
        或
        undefined symbol: X509_free
        通产是由于静态连接了 openssl的库照成的(默认)。
        需要使用 -lcrypto -lssl -ldl
        命令如下:
        /path/apxs -I/path/openssl/include -L/path/openssl/lib -c *.c -l crypto -l ssl -l dl
        openssl 编译的时候需要增加 shared参数

        /usr/local/apache/bin/apxs -a -i -c -D HAVE_OPENSSL=1 -I /usr/include/openssl/ -L /usr/lib/openssl/engines/lib ./mod_ssl.c
    于是重新编译,问题依旧。

    搞了两天,还是同样的错误,没有办法,最后在虚拟机上重新编译了相同版本的apache,并且使用了--enable-mods-shared=all参数,动态编译了所有的模块。
    这样在apache的modules目录下就生成了所有的apache模块,也就包括了mod_ssl模块,复制到线上服务器
    检测语法OK,问题解决

    /usr/local/apache/bin/apachectl -t
    Syntax OK
    虽然这不是一个好方法,但也算是一个办法,也希望直接编译成功的大神不吝指点。
    重启apache

    /usr/local/apache/bin/apachectl restart

  查看是否加载成功

  /usr/local/apache/bin/apachectl  -M
  显示内容中包含ssl_module
  

  三、大功告成






  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-638884-1-1.html 上篇帖子: apache prefork模式优化错误 下篇帖子: Linux Centos 6.2 装好PHP启动Apache错误libmysqlclient.so.18:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表