`
andrew913
  • 浏览: 187470 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

apache模块开发之helloworld

阅读更多
学习apache模块开发已经快两个星期了,感觉搞apache模块开发挺有意思的,下面来讲讲apache模块开发的helloworld,非常简单。
Apache  模块开发主要采用挂钩子的方法来实现模块开发的,这和linux内核模块开发有点像,说白了就是加一个回调函数。下面我们来讲 这个例子吧。
首先来介绍下apache的一个工具apxs。apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。

1.apxs -g -n helloworld

上面的命令可以帮助我们产生一个模块名字为helloworld的模板。
上面的命令会产生以下代码

#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"

/* The sample content handler */
static int helloworld_handler(request_rec *r)
{
    if (strcmp(r->handler, "helloworld")) {
        return DECLINED;
    }
    r->content_type = "text/html";      

    if (!r->header_only)
        ap_rputs("The sample page from mod_helloworld.c\n", r);
    return OK;
}

static void helloworld_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA helloworld_module = {
    STANDARD20_MODULE_STUFF, //用于编译后的模块产生版本信息
    NULL,                  /* 创建目录配置结构*/
    NULL,                  /* 合并目录配置结构 */
    NULL,                  /* 创建主机配置结构 */
    NULL,                  /* 合并主机配置结构 */
    NULL,                  /* 为模块配置相关指令       */
    helloworld_register_hooks  /* 注册模块的钩子函数                      */
};

我们来看下helloworld_module这个结构体,它没个成员的具体作用请看注释。
它最关键的参数为最后一个,这个参数是一个注册钩子函数指针,也就是说当我们把模块加入到apache里面去的时候,他会执行这个注册函数。在这个函数里面我们将会注册我们所要添加的钩子。
本例子中我们用的是

ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);


这个处理函数,这个处理函数注册了helloworld_handler这个函数。这个函数用于处理我们的请求。
我们来讲下执行的顺序,模块加载-》执行helloworld_register_hooks函数-》注册helloworld_handler这个函数到钩子上去。
这样一来:当一个http请求来的时候,我们就会自动去执行helloworld_handler这个函数。本例子是一个非常简单的内容生成器。

if (strcmp(r->handler, "helloworld")) {//判断是否是这个helloworld  handler
        return DECLINED;//
    }
    r->content_type = "text/html";      
    if (!r->header_only)
        ap_rputs("The sample page from mod_helloworld.c\n", r);//内容生成
    return OK;



下面我们将来进行编译
执行:apxs -c mod_helloworld.c
执行成功以后我们可以发现在.libs下面会出现mod_helloworld.so这个模块文件。这就是我们所需要的,对于apache一些自带的模块一般都放在安装目录的modules/下面。

下面我们来对其进行配置
打开httpd.conf文件,添加以下信息
LoadModule helloworld_module   *****// 指定.so文件的路径。

<Location /helloworld>
	setHandler helloworld
</Location>


Ok ,重启apache 然后输入 http://loacalhost/helloworld 就可以看到
The sample page from mod_helloworld.c

当然这里这里只是输出一句话,我们也可以打印很多html信息,就类似于servlet一样。

这样一来一个简单的apache内容生成器模块已经开发好了,当然应用比较广泛的是过滤器模块的开发,最近项目主要也是用过滤器来实现的。

apache 可以开发出一些功能非常强大的模块来,可以为我们定制更好的apache,比如容器中应用的流量统计,cpu统计等。

才学不久,还不怎么懂,欢迎大家交流。

4
0
分享到:
评论
9 楼 andrew913 2009-06-02  
anry513 写道

www.loveopensource.com上有些apache module的开发文章,你可以看看,希望对你有帮助

非常感谢
8 楼 andrew913 2009-06-02  
annoation可以不可以看出hook?
rrsy23 写道

看了哈 不错;不过 很有感触;其实我们开发servlet也一样;只是apache通过hook,servlet通过xml配置文件;还有annoation可以不可以看出hook?

工作层次不一样,apache模块开发主要应用于一些服务器端开发,比如 流量限制,监控等,我也是最近才开始接触,这边要做一个类似于goole app的东西,所以需要开发一些apache模块。
7 楼 rrsy23 2009-06-02  
看了哈 不错;

不过 很有感触;

其实我们开发servlet也一样;

只是apache通过hook,servlet通过xml配置文件;

还有annoation可以不可以看出hook?
6 楼 anry513 2009-06-01  
www.loveopensource.com上有些apache module的开发文章,你可以看看,希望对你有帮助
5 楼 buluzhai 2009-05-31  
google_fans 写道

有一本叫apache 模块开发指南的书,我现在在看。这东西主要靠自己去琢磨。

谢谢,有空找来看一下
4 楼 jindw 2009-05-31  
看上去真的不错,呵呵,学习了
3 楼 google_fans 2009-05-31  
有一本叫apache 模块开发指南的书,我现在在看。
这东西主要靠自己去琢磨。
2 楼 buluzhai 2009-05-30  
请问在哪儿可以找到apache 核心机制的文章呢
1 楼 lmxbitihero 2009-05-30  
挺有意思。

相关推荐

    apache扩展模块开发工具apxs

    apache扩展模块开发工具,可以在Windows平台下生成并编译模块文件(*.so)。将文件放在apache的bin目录下。 生成一个模块文件命令语法: apxs -g -n helloworld。 该命令会自动生成一个文件夹helloworld,并含有mod_...

    The Apache Modules Book Application Development with Apache

    记得刚开始的时候想进行apache模块开发的时候找了好多资料,不过大都是英文文档,几乎没有做系统讲解的。国内的图书更是没有这方面的,在Amozon搜索了下,找到了《Writing Apache Modules with Perl and C》和《The ...

    Jetty中文手册

    Jetty和Maven HelloWorld教程 Jetty(6)入门 (www.itjungle.com) Jetty Start.jar 配置Jetty 如何设置上下文(Context Path) 如何知道使用了那些jar包 如何配置SSL 如何使用非root用户监听80端口 如何配置连接器...

    stripes:用于构建前端FOLIO模块的UI框架

    背景-Stripes框架包的简要概述-指导条纹设计的概念-与条带有关的事物的术语条纹显影入门和新环境设置-更详细的概述 World-使用Stripes CLI为FOLIO创建一个hello world应用程序开发和测试指南-如何将现有应用程序迁移...

    cody-cli:Web开发环境

    我认为这些人需要一种工具,使他们能够专注于完成Hello World ,而不是在计算机上执行练习!特征通过本地HTTP服务器运行html 透明的翻译器: 写CSS,Less或Sass 编写ES6甚至是ES7 * 使用ES6模块*将Javascript包含在...

    iuhyiuhkjh908u0980

    Buildfile: G:\eclipseEjb3\Ejb_HelloWorld_02\build.xmlprepare: [mkdir] Created dir: G:\eclipseEjb3\Ejb_HelloWorld_02\buildcompile: [javac] Compiling 3 source files t ... by caizhongda 2009-02-28 回复 ...

    新版Android开发教程.rar

    � 源代码完全开放,便于开发人员更清楚的把握实现细节,便于提高开发人员的技术水平,有利于开发 出 更具差异性的应用。 � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要...

    php网络开发完全手册

    1.6 几种开发工具的介绍 20 1.6.1 Vi及Vim 20 1.6.2 Eclipse+PHPEclipse插件 21 1.6.3 UltraEdit 21 1.6.4 EditPlus 22 1.6.5 支持PHP的IDE环境 22 1.7 小结 23 第2章 PHP的基础语法 24 2.1 语言构成与工作原理 24 ...

    MySQL5 权威指南第3版中文版_part1

     18.2 Hello,World  18.3 与MySQL服务器建立连接  18.4 执行SQL命令  18.5 处理二进制数据和特殊字符  18.6 出错处理  第19章 Visual Basic 6/VBA  19.1 基础知识和术语  19.2 Connector/ODBC选项  19.3 ...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    MySQL 5权威指南(第3版) 中文版 下载地址

     18.2 Hello,World  18.3 与MySQL服务器建立连接  18.4 执行SQL命令  18.5 处理二进制数据和特殊字符  18.6 出错处理  第19章 Visual Basic 6/VBA  19.1 基础知识和术语  19.2 Connector/ODBC选项 ...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    # 产生 Hello World $full2 = '$first $second';# 产生 $first $second 可以将字符和数字利用运算符号连接起来。字符被转化成数字,利用其最初位置。在PHP手册中有详细的例子。 数组与哈希表 数组与哈希表以同样...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

Global site tag (gtag.js) - Google Analytics