IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

搭好了apache模块的开发环境

方糖气球 2010-03-10 16:27:59 累计浏览 4,464 次
本机暂存

    经过几个小时的折腾终于把apache module的开发环境搞好了.其实很简单,但是网上很多过时的资料误导性还是很强.很容易上钩的说.

    首先把apache源码下载下来,解包.

    wget http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz

    tar xzvf httpd-2.2.14.tar.gz

    wget http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz

    然后编译安装,指定了路径和启用了so.

    ./configure --prefix=/home/easy/dev/apache2 --enable-so

    make

    make install

    安装完apache应该就能用.启动下试试

    ./bin/apachectl start

    Oh yeah . It works.

    接下来另起一个目录,存放我们的模块源代码:

    mkdir source

    vim mod_myvar.c

    mod_myvar.c 是一个从网上顺手扒拉下来的示范模块.代码如下:

    // 加载头文件

    #include "httpd.h"

    #include "http_config.h"

    #include "http_protocol.h"

    #include "http_log.h"

    #include "ap_config.h"

    // 声明模块

    module AP_MODULE_DECLARE_DATA myvar_module;

    // API hooks

    module AP_MODULE_DECLARE_DATA myvar_module =

    {

    STANDARD20_MODULE_STUFF,

    NULL, /* create per-dir config structures */

    NULL, /* merge per-dir config structures */

    NULL, /* create per-server config structures */

    NULL, /* merge per-server config structures */

    myvar_cmds, /* table of config file commands */

    myvar_register_hooks /* register hooks */

    };

    // 对应的回调函数和实现

    static const command_rec myvar_cmds[] = {

    AP_INIT_FLAG( "MyVarEnable", set_myvar_enable, NULL, OR_FILEINFO, "Turn on mod_myvar"),

    {NULL}

    };

    static void myvar_register_hooks(apr_pool_t *p) {

    ap_hook_post_read_request( myvar_post_read_request, NULL, NULL, APR_HOOK_MIDDLE );

    ap_hook_child_init( myvar_child_init, NULL, NULL, APR_HOOK_MIDDLE );

    }

    static apr_status_t myvar_cleanup(void *cfgdata) {

    // cleanup code here, if needed

    return APR_SUCCESS;

    }

    // 以下是两个回调接口内用到的函数

    static void myvar_child_init(apr_pool_t *p, server_rec *s) {

    apr_pool_cleanup_register(p, NULL, myvar_cleanup, myvar_cleanup);

    }

    static int myvar_post_read_request(request_rec *r) {

    char myvar[16] = "CAPTAIN WAS HERE";

    apr_table_set(r->notes, "myvar", myvar); // PHP: apache_notes

    apr_table_set( r->subprocess_env, "myvar", myvar ); // PHP: HTTP_SERVER_VARS

    return OK;

    }

    static const char *set_myvar_enable(cmd_parms *cmd, void *dummy, int arg) {

    ap_get_module_config(cmd->server->module_config, &myvar_module);

    return NULL;

    }

    关于模块文件的结构,这里有详细的教程.

    然后直接通过apache的bin目录下apxs就可以直接编译并安装module了.

    ../apache2/bin/apxs -c -i mod_myvar.c

    编译完成后,apxs还会自己帮你把so文件复制到apache的moudle目录下.只需要修改httpd.conf加载模块就可以了.

    vim apache2/conf/httpd.conf

    添加上模块,并激活它

    LoadModule myvar_module modules/mod_myvar.so

    MyVarEnable On

    然后重启apache.graceful木有用,先stop再start

    ./bin/apachectl stop

    ./bin/apachectl start

    然后就可以从环境变量里边看到myvar的值了.

    不过我们还没安装PHP呢.还是装一个吧.php本身也是一个apache module,php的安装过程和上边差异并不大.

    下载PHP源代码,解压

    wget http://cn2.php.net/get/php-5.3.1.tar.gz/from/cn.php.net/mirror

    tar xzvf php-5.3.1.tar.gz

    安装PHP的时候也用到了apxs.

    cd php-5.3.1

    ./configure --with-apxs2=/home/easy/dev/apache2/bin/apxs --with-mysql

    kao,报错了.原来是没装libxml2,通过apt-get装一个.

    sudo apt-get install libxml2-dev

    再配置

    ./configure --with-apxs2=/home/easy/dev/apache2/bin/apxs --with-mysql

    安装

    make

    sudo make install

    安装完成后,发现apache的httpd中,php已经自动帮我们加上了

    LoadModule php5_module modules/libphp5.so

    接下来添加.php文件的handle.这里有个需要注意的地方,之前我们习惯用的addType方式是存在安全问题的.会让apache把ftqq.php.jpg的文件当成php执行.这里改用filesMatch来搞定

    SetHandler application/x-httpd-php

    然后重启apache,仍然不要graceful.

    ./bin/apachectl stop

    ./bin/apachectl start

    写一个php

    print_r( $_SERVER );

    模块已经生效了

    Array

    (

    [myvar] => CAPTAIN WAS HERE

    )

    今天就先搞到这里.明天看看如何加载其他的lib,时间多的话,再试试编译mod_myvhost.

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,308)
  2. 我的 RHCA 之路 (累计阅读 14,013)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,230)
  4. 给程序员新手的一些建议 (累计阅读 13,089)
  5. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  6. 关于linux内存free的一些事情 (累计阅读 12,867)
  7. ps - 按进程消耗内存多少排序 (累计阅读 12,688)
  8. Google怎么用linux (累计阅读 12,581)
  9. Linux Used内存到底哪里去了? (累计阅读 11,868)
  10. find命令的一点注意事项 (累计阅读 11,866)