纸上得来终觉浅,绝知此事要躬行。
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(); ?>