技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Apache --> 搭好了apache模块的开发环境

搭好了apache模块的开发环境

浏览:3473次  出处信息

    经过几个小时的折腾终于把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. 在Apache2.2.XX下安装Mod-myvhost模块    (阅读:11720)
  2. Nginx模块开发入门    (阅读:9888)
  3. nginx模块开发    (阅读:4628)
  4. CommonJS 的模块系统,AMD 和 Wrappings, 以及 RequireJS    (阅读:4188)
  5. PHP 模块编写需要注意的一个问题---- php模块及函数名都定义成小写吧    (阅读:3374)
  6. 使用 Perl 来开发 Nginx 的模块    (阅读:3307)
  7. FarmVille(美版开心农场)谈架构:所有模块都是一个可降级的服务    (阅读:3287)
  8. php无法加载pcre.so的解决办法    (阅读:3023)
  9. mysql 的模块不能安装的解决方法    (阅读:2595)
  10. Perl的English模块    (阅读:2499)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1