纸上得来终觉浅,绝知此事要躬行。

1. 模块类型
Apache的模块分为三大类:核心模块、标准模块、第三方模块
核心模块
- 核心模块是无法模块化的模块,它们是
Apache服务器的基础模块 - 必须始终静态链接到
Apache内核的模块并且无法删除,提供的指令在Apache服务中始终是可用的
# CentOS6上mpm模块是静态编译的
[root@MiWiFi-R3-srv ~]# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
# CentOS7上mpm模块是动态编译的
[escape@MiWiFi-R3-srv ~]$ httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
标准模块
- 标准模块作为
Apache的一部分,是由Apache软件基金会发布和维护 - 与核心模块不同的是标准模块可以安全的删除和加载
- 动态加载
Apache标准模块的前提是核心模块mod_so.c必须静态编译到Apache中
# CentOS7上mpm模块是动态编译的
[escape@MiWiFi-R3-srv ~]$ httpd -M
Loaded Modules:
core_module (static) # 静态编译的模块
so_module (static)
http_module (static)
alias_module (shared) # 动态编译的模块
actions_module (shared)
mpm_prefork_module (shared)
access_compat_module (shared)
第三方模块
- 第三方模块是由非
Apache团队所写 - 用户可以在
http://modules.apache.org网站获取
2. apxs 编译安装模块
apxs(Apache扩展)其实是一个Perl脚本,你可以使用它来为Apache服务器编译和安装模块。不使用APACI cofngure脚本进行编译,是因为configure无法处理多个模块源代码文件,因此使用apxs更为方便一些。
apxs命令参数
-n- 用来设置模块名,这个名字可以与
DSO文件名不同 - 与
-g参数使用时,必须指定 - 与
-i参数使用时,apxs会自己根据源代码判断
- 用来设置模块名,这个名字可以与
-g- 为模块生成一个临时文件夹,文件名称有参数
-n指定 - 同时会产生两个文件:
mod_name.c样板模块源程序;Makefile用于编译和安装这个模块 - 产生两个文件对于学习
apxs很有帮助
- 为模块生成一个临时文件夹,文件名称有参数
-i- 将已编译好的
DSO模块安装到服务器的modules目录中
- 将已编译好的
-q- 查看某种
apxs设置的信息 - 信息可以使
CC、CFLAGS、LD_SHLIB等
- 查看某种
-a- 为安装的模块生成一个新的
LoadModule行到Apache的配置文件中,并自动启用它
- 为安装的模块生成一个新的
-A- 与
-a类似,只是在LoadModule行前加入#注释,并不启用
- 与
-c- 编译生成
DSO模块 - 可以使用的参数
-o dosfile、-I incdir、-L libdir、-D name=value等
- 编译生成
[root@MiWiFi-R3-srv bin]# /usr/local/apache/bin/apxs --help
apxs:Error: Unknown option: -.
apxs:Error: Unknown option: h.
Usage: apxs -g [-S <var>=<val>] -n <modname>
apxs -q [-v] [-S <var>=<val>] [<query> ...]
apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
[-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
[-Wl,<flags>] [-p] <files> ...
apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
注意事项
- 自行编译才会有提供
apxs命令,使用二进制包并没有(反正我没有找到) - 要使用
apxs模块需要将mod_so模块静态编译到Apache程序中,否则即便成功编译出了模块,Apache也无法加载
2.1 安装 mod_log_access 模块
mod_log_access模块是一个可以让你自动旋转日志的小模块,方便处理日志。
- 使用
make命令安装
# 网站地址已经失效了
$ wget http://www.gjvc.com/software/Apache/modules/mod_log_access-1.03.tar.gz
$ tar -zxcf mod_log_access-1.03.tar.gz
$ cd mod_log_access-1.03
# 查看README文件得知需要修改Makefile文件
APACHE_PREFIX=/usr/local/apache2 # Apache的安装根目录
APACHE_VERSION=2.2.21 # Apache的版本号
# 编译,其实make底层调用的也是apxs
$ make && make install
2.2 安装 mod_tex 模块
mod_tex模块是实现了文本的输出过滤器,它可以指定类型的网页上将指定的txt文件显示在网页的头部和尾部
- 使用
apxs模块安装
# 编译安装
$ wget http://apache.webthing.com/mod_txt/mod_txt.c
$ /usr/local/apache2/bin/apxs -c -i -a mod_txt.c
# 修改httpd.conf文件,添加如下命令
AddOutputFilter text-filter .txt # AddOutputFilter表示需要使用mod_tex过滤模块的文件类型
AddType text/html .txt # AddType增加的文件类型
TextHeader /path/to/header-file # TextHeader定义显示在网页首部的文件内容
TextFooter /path/to/footer-file # TextFooter定义显示在网页尾部的文件内容
3. 静态链接模块
- 所谓静态链接是指将模块直接编译进
Apache服务器中,不使用DSO模块的加载方式 - 最典型的例子就是
core.c,由于模块无法动态加载,所以只能手动的静态编译到Apache中去 - 使用
--enable-modules将模块直接编译到Apache程序中,就不需要使用LoadModule指令加载即可使用 - 编译进
Apache程序中,可以让模块的调用速度变快,缺点是占用更多的内存空间
$ ./configure --enable-modules=most
$ ./configure --enable-modules=mpm_prefork_module
4. 动态链接模块
特点
- 在
Apache中使用DSO动态共享对象可以使得服务器有更大的灵活性 - 使用
DSO的前提就是必须加载核心模块mod_so到Apache中才能使用
$ ./configure --enable-mods-shared=mpm_prefork_module
LoadModule指令
- 用来加载
Apache模块或指定库件 - 只能用来加载
Apache根目录下的模块,也就是ServerRoot目录下modules目录中指定模块,所以不能使用绝对路径
LoadModule ssl_module modules/mod_ssl.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadFile指令
- 用来加载
Apache模块或指定库件 - 可以加载本机任何位置的文件
LoadFile /usr/Apache/libexec/libxmlparse.so
5. 手动增加新模块
虽然
Apache服务器功能强大,但是毕竟不是万能的,需要我们自己为其安装其他的脚本编译工具。
5.1 Perl
传统的CGI方式运行脚本时,总会遇到运行速度慢、服务器负载高等问题。mod_perl模块是解决这个问题的方法之一。将perl和Apache服务器进行结合。使用mod_perl可以让用户不需要或者少量修改他们编写的perl代码就可以在服务器上执行并提升运行速度。项目主页上说,比传统的CGI提升了100倍之多。
# 【方式1】使用二进制包安装
$ yum install mod_perl
# 【方式2】以DSO方式安装mod_perl到Apache 2.x服务器上
# 下载并解压缩
$ wget http://perl.apche.org/dist/mod_perl-2.0.tar.gz
$ tar -zxvf mod_perl-2.0.tar.gz
$ cd mod_perl-2.0.5
$ perl Makefile.PL
# 编辑httpd.conf文件,添加如下内容
$ LoadModule perl_module modules/mod_perl.so
# 编译安装
$ make && make install
# 【方式3】以静态方式安装mod_perl到Apache 2.x服务器上
# 下载并解压缩
$ wget http://perl.apche.org/dist/mod_perl-2.0.tar.gz
$ tar -zxvf mod_perl-2.0.tar.gz
$ cd mod_perl-2.0.5
# 编译安装
$ perl Makefile.PL MP_USE_STATIC=1 \
MP_AP_PREFIX=/usr/local/apache2 \
MP_AP_CONFIGURE="--with-mpm=prefork \
--prefix=/usr/local/apache2 -enable-so --enable-mods-shared='all'"
$ make && make install
5.2 php
LAMP(Linux+Apache+MySQL+PHP/Perl/Python)
# 【方式1】使用二进制包安装
$ yum install php
# 【方式2】以DSO方式安装mod_perl到Apache 2.x服务器上
$ wget http://cn.php.net/get/php-5.2.6.tar.gz2/from/this.mirror
$ tar -zxvf php-5.2.6.tar.gz2
$ cd php-5.2.6
$ ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs
$ make && make install
# 配置httpd.conf文件,增加对php程序的处理
LoadModule php_mudule libexec/libphp.so
DirectoryIndex index.php
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# 测试是否安装成功
<?php phpinfo(); ?>