Apache服务之httpd的模块


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

Apache服务之httpd的模块


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设置的信息
    • 信息可以使CCCFLAGSLD_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_soApache中才能使用
$ ./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模块是解决这个问题的方法之一。将perlApache服务器进行结合。使用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(); ?>

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录