Linux环境下源码编译的Apache安装扩展模块

Linux环境下源码编译的Apache安装扩展模块


一般在使用的 Apache 时,我们会存在需要使用到一些扩展模块的情况。

官方文档实际上已经有了描述,如果你还不了解 Apache(DSO) ,可以参看我的另一篇博客:点击查看,简单 用法概要 说明如下:

Apache2.x 的DSO功能简要说明:


编译并安装已发布的Apache模块,比如编译mod_foo.c为mod_foo.so的DSO模块:

$ ./configure --prefix=/path/to/install --enable-foo=shared
$ make install

编译并安装第三方模块,比如编译mod_foo.c为mod_foo.so的DSO模块:

$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
$ make install

配置Apache以便以后安装共享模块:

$ ./configure --enable-so
$ make install

用apxs在Apache源码树以外编译并安装第三方模块,比如编译mod_foo.c为mod_foo.so的DSO模块:

$ cd /path/to/3rdparty
$ apxs -c mod_foo.c
$ apxs -i -a -n foo mod_foo.la

共享模块编译完毕后,必须在httpd.conf中用LoadModule指令使Apache启用该模块。

实际上,上面已经描述的很清楚了。但初看总让人一脸懵逼,没关系,接下来就按照安装第三方模块的扩展进行详细说明。

首先 ,请确认你是否加载了 mod_so 模块,在你编译参数配置的时候需要添加 --enable-so(启用 DSO )。如果你未安装该模块的话,是无法额外编译扩展模块的。但是,在我使用的 Apache 2.4 版本中,就算首次安装Apache时未指定参数,默认配置 configure 已经自动指定启用。

查看是否已经安装 mod_so ,本人 Apache 安装在该目录 /usr/local/apache2.4,需要根据每个人自己安装的实际路径去对应,执行以下命令:

$ /usr/local/apache2.4/bin/apachectl -l //查看静态编译入程序的模块,跟下面的命令一样,二者选一个调用
$ /usr/local/apache2.4/bin/httpd -l //查看静态编译入程序的模块,跟上面的命令一样,二者选一个调用
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c

从上面输出的信息中看到,我们已经加载了该模块。
这里顺便说一下,若你要调用 查看列出基于当前配置加载的所有模块 ,执行该命令:

$ /usr/local/apache2.4/bin/httpd -M //列出基于当前配置加载的所有模块

安装扩展模块用到的管理工具就是 apxs ,这是官方提供的。是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。更多有关的信息文档:点击查看

一般自己编译 Apache 的情况下,apxs 位于安装目录 bin 文件夹下:

$ ls /usr/local/apache2.4/bin/
ab         apr-1-config  apxs      dbmmanage  envvars-std  htcacheclean  htdigest  httpd      logresolve
apachectl  apu-1-config  checkgid  envvars    fcgistarter  htdbm         htpasswd  httxt2dbm  rotatelogs

可以看到 apxs 模块已经存在,如果未查找到,可以尝试使用 findlocatewhichwhere 等命令查找位置。

请注意,想要源码编译拓展模块,需要 Apache源码 ,即安装前的文件。我这里直接放在了家目录 /home/centos/httpd-2.4.43 下。一般额外的模块扩展即在 Apache 源码中,找到对应的 C 文件,位于 modules 文件夹下,路径为 /home/centos/httpd-2.4.43/modules 。例如:扩展 mod_status ,找到里面的 generators 文件下的 mod_status.c 文件即可;如果要扩展 mod_rewrite 模块,则要到文件夹 mappers 里查找 mod_rewrite.c 文件;如果要扩展 mod_headers 模块,则要到 metadata 里查找 mod_headers.c 文件。这里需要以你要扩展的模块进行搜索查找,来确定位置。

这里以扩展反向代理 mod_proxy 模块为例:

$ cd /home/centos/httpd-2.4.43/modules
$ ls
aaa      config7.m4  debugging     filters     ldap      Makefile.in  NWGNUmakefile  slotmem
arch     core        echo          generators  loggers   mappers      proxy          ssl
cache    database    examples      http        lua       md           README         test
cluster  dav         experimental  http2       Makefile  metadata     session
$ cd proxy/

安装扩展 mod_proxy.so

[centos@localhost proxy]$ /usr/local/apache2.4/bin/apxs -i -c -a mod_proxy.c

该扩展将被安装到 modules 文件夹下。 实际上 ,在别的版本安装时,可能会出现各种错误。这是因为,安装该模块,还需要以下编译支持 proxy_util.cmod_proxy_http.cmod_proxy_ajp.cajp*.c 等文件编译成 mod_proxy_http.somod_proxy_ajp.so 等模块。如果是这样,你可以尝试以下命令:

$:<<!
这里需要注意proxy_util.c是基础模块,必须安装,也可以独立出来单独安装:/usr/local/apache2.4/bin/apxs -i -c -a proxy_util.c
!
$ /usr/local/apache2.4/bin/apxs -i -c -a mod_proxy.c proxy_util.c //添加mod_proxy.so
$ /usr/local/apache2.4/bin/apxs -i -c -a mod_proxy_http.c //添加mod_proxy_http.so
$ /usr/local/apache2.4/bin/apxs -i -c -a  mod_proxy_ajp.c ajp*.c //添加mod_proxy_ajp.so

在你未安装 proxy_util.c 基础模块,而在重新启动 httpd 时可能会产生以下错误:

httpd: Syntax error on line 117 of /usr/local/apache2.4/conf/httpd.conf: Cannot load modules/mod_proxy.so into server: /usr/local/apache2.4/modules/mod_proxy.so: undefined symbol: ap_proxy_strmatch_domain

错误 undefined symbol: ap_proxy_strmatch_domain ,这是因为缺少基础及其他相关依赖的模块,只要安装相关依赖模块即可。但我在其他版本测试安装 proxy_util.c 模块,会报以下错误,暂未找到解决办法,可能要重新下载 Apache 版本重装解决。

proxy_util.c:27:57: 致命错误:mod_http2.h:没有那个文件或目录
 #include "mod_http2.h" /* for http2_get_num_workers() */
                                                         ^
编译中断。
apxs:Error: Command failed with rc=65536
.

如果你知道解决办法,希望你可以在留言中提出。
但在我目前使用的 2.4 版本,会把依赖相关一次性给你安装起来。

[centos@localhost proxy]$ ls /usr/local/apache2.4/modules/mod_proxy*
/usr/local/apache2.4/modules/mod_proxy_ajp.so       /usr/local/apache2.4/modules/mod_proxy_hcheck.so
/usr/local/apache2.4/modules/mod_proxy_balancer.so  /usr/local/apache2.4/modules/mod_proxy_http.so
/usr/local/apache2.4/modules/mod_proxy_connect.so   /usr/local/apache2.4/modules/mod_proxy_scgi.so
/usr/local/apache2.4/modules/mod_proxy_express.so   /usr/local/apache2.4/modules/mod_proxy.so
/usr/local/apache2.4/modules/mod_proxy_fcgi.so      /usr/local/apache2.4/modules/mod_proxy_uwsgi.so
/usr/local/apache2.4/modules/mod_proxy_fdpass.so    /usr/local/apache2.4/modules/mod_proxy_wstunnel.so
/usr/local/apache2.4/modules/mod_proxy_ftp.so

请注意 ,一般安装成功之后,需要在 httpd.conf 文件内加入以下语句 LoadModule proxy_module modules/mod_proxy.so ,如果已经存在,将注释 “#” 去掉以启用:

[centos@localhost proxy]$ ls /usr/local/apache2.4/conf/
extra  httpd.conf  httpd.conf.bak  magic  mime.types  original
[centos@localhost proxy]$ vim /usr/local/apache2.4/conf/httpd.conf
LoadModule proxy_module       modules/mod_proxy.so

但实际上 由于我们使用 apxs 工具指定了参数 -c ,所以系统会自己自动添加,无需手动处理。

重新启动 Apache 服务:

$ /usr/local/apache2.4/bin/apachectl start

上面使用到的 apxs 工具的参数的进行简要说明。如果你要更加具体了解 apxs 工具,请参考该文档:点击查看

-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-c 此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile 。如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mod_name.so 。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-A 与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
-e 表示需要执行编辑操作,它可以与 -a 和 -A 选项配合使用,与 -i 操作类似,修改Apache的httpd.conf文件,但是并不安装此模块。

文件后缀说明:

.c 源文件, .o 目标文件, .a 静态库, .so 动态库, .h 就是 header file 头文件;其中定义了对函数的声明,全局变量,数据类型等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值