Apache2.0模块开发基础

apache模块开发指南(中文版) Apache的开发人员认识到Apache 最初的架构具有局限性,比较粗糙,于是在2000年开始建立新的代码仓库(codebase)主分支,并在此代码仓库的基础上于2002年4月创建了Apache2.0的第一个发布版本。Apache 2包括以下优良特性: 原生API得到很大幅度改进,使APR库成为单独的实体。这在很大程度上帮助开发人员克服了C语言编程的缺陷,特别是交叉编译平台和资源管理方面的缺陷。通过使用Apache 2,C程序员可以达到通常被认为是高层次语言和脚本语言才能达到的高效率。 新的拓展架构带来了全新层次的应用程序开发,同时也为以前的模块和应用程序提供了更为简洁的实现方法。本书将会详细介绍如何利用这个新的拓展架构。 新的内核架构让Apache 2成为真正的跨平台服务器。操作系统层自身成为一个模块(MPM),使得该模块可以被各种操作系统装载。Apache 1是一个UNIX应用程序,移植到其他平台上会受到很多的限制,一些UNIX特性使得Apache 1在其他平台(如Windows和Netware)上性能较差,而Apache 2摆脱了这些特性的限制,使其成为一个真正的跨平台服务器。基于线程的MPM模块的引入也增强了UNIX上很多应用程序的可扩展性。 Apache 2的缺点在于它的API不能向前兼容Apache 1,因此一些第三方的模块和应用程序需要缓慢地升级到Apache 2。 立即下载

本博文是总结《Apache模块开发》中的第5章

基本说明

mod_helloworld是一个非常简单的模块,仅仅完成内容展示工作。但是它却可以展示编写Apache模块的基本框架。

基本开发环境及说明

我的开发环境是ubuntu 10.04 amd64 server,apache版本是2.2.15

1、源码安装apache 
解压
tar zvxf httpd-2.2.15.tar.gz

配置
./configure --prefix=/usr/local/apache2 --enable-module=so --enable-module=rewrite  --enable-module=env --enable-shared=max

编译安装
make; make install

2、功能
当用户在浏览器中输入http://www.xxx.com/hellworld/时,helloworld模块会在浏览器上显示一个大大的Hello Apache module的字样。

编写模块

1、模块框架
module AP_MODULE_DECLARE_DATA some_module = {
    STANDARD20_MODULE_STUFF,
    some_dir_cfg,           /* create per-directory config struct */
    some_dir_merge,      /* merge per-directory config struct */
    some_svr_cfg,        /* create per-host config struct */
    some_svr_merge, /* merge per-host config struct */
    some_cmds,           /* configuration directives for this module */
    some_hooks            /* register module's hooks/etc. with the core */
};
STANDARD20_MODULE_STUFF宏展开,它提供了模块的版本信息。在这里我们不对他做深入的研究,有兴趣了解的可以阅读Apache的源代码。
对于helloworld模块,我们这里只考虑模块的最后一个字段,他注册模块个钩子(hooks)。helloworld模块的module结构如下:
module AP_MODULE_DECLARE_DATA helloworld_module = {
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    helloworld_hooks
};
现在我们来写钩子注册函数,它会在Apache服务启动时调用。它的用途是把我们的处理函数注册给服务器核心(server core),这样模块的函数就会在适当的时机得到调用。对于helloworld来说,我们这样仅仅注册一个”内容生成“类型的钩子(Apache有很多类型的钩子)
static void helloworld_hooks(apr_pool_t *pool)
{
    ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
最后当然是实现处理函数helloworld_handler啦。它是一个回调函数,他会在Apache处理HTTP请求的适当时机调用。处理函数可以选择处理或是忽略这个请求。
static int helloworld_handler(request_rec *r)
{
    if (!r->handler || strcmp(r->handler, "helloworld")) {
        return DECLINED;
    }

    if (r->method_number != M_GET) {
        return HTTP_METHOD_NOT_ALLOWED;
    }
    ap_set_content_type(r, "text/html;charset=ascii");
    ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n", r);
    ap_rputs("<html><head><title>Hello Apache Module</title></head>", r);
    ap_rputs("<body><h1>Hello Apache Module</h1>", r);
    ap_rputs("</body></html>", r);
    return OK;
} 
我们开始做一些检查,来决定模块是处理这个请求还是忽略它。返回DECLINED表示忽略,OK表示成功处理,也可返回HTTP状态代码(HTTP status code)表示错误处理。

2、完整代码
/* The simplest HelloWorld module */
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>

static int helloworld_handler(request_rec *r)
{
    if (!r->handler || strcmp(r->handler, "helloworld")) {
        return DECLINED;
    }

    if (r->method_number != M_GET) {
        return HTTP_METHOD_NOT_ALLOWED;
    }
    ap_set_content_type(r, "text/html;charset=ascii");
    ap_rputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n", r);
    ap_rputs("<html><head><title>Hello Apache Module</title></head>", r);
    ap_rputs("<body><h1>Hello Apache Module</h1>", r);
    ap_rputs("</body></html>", r);
    return OK;
}

static void helloworld_hooks(apr_pool_t *pool)
{
    ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

module AP_MODULE_DECLARE_DATA helloworld_module = {
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    helloworld_hooks
}; 

注意:helloworld_hooks和helloworld_handler都是static的。一般来说,只有模块结构被导出,其他的都是模块自己私有的。这是一个好的实践

3、编译安装模块
/usr/local/apache2/bin/apxs -iac mod_helloworld.c
这样我们的modules目录中就多了一个mod_helloworld.so的文件

4、运行
要运行我们还要修改配置文件httpd.conf
添加如下:
LoadModule helloworld_module modules/mod_helloworld.so
<Location /helloworld>
    SetHandler helloworld
</Location>
第一行是让Apache动态的载入这个模块。
第二行设置浏览器的请求url的路径。
SetHandler helloworld其实是设置r->handler的值。

重启apache
最后在浏览器中敲入http://localhost/hellworld,就可以看到模块的效果了。







 


APACHE2.0_MOD_模块开发(C语言) 写一个APACHE2.0的MOD模块,读取配置,并对所有后缀为.hello的请求进行处理。 立即下载

相关推荐

Apache 2.0.39源代码

著名WEB服务器Apache的源代码。

apache模块开发之helloworld

学习apache模块开发已经快两个星期了,感觉搞apache模块开发挺有意思的,下面来讲讲apache模块开发的helloworld,非常简单。 Apache 模块开发主要采用挂钩子的方法来实现模块开发的,这和linux内核模块开发有点像,说白了就是加一个回调函数。下面我们来讲 这个例子吧。 首先来介绍下apache的一个工具apxs。apxs是一个为Apache HTTP服务器编译和安装扩...

xuyong913的专栏 293

HWSD2.0土壤数据处理实战:从下载到属性提取全流程解析

本文详细解析了HWSD2.0全球土壤数据库从数据下载、属性筛选到GIS空间连接与提取的全流程实战方法。重点介绍了如何利用ArcGIS Pro等工具,将土壤单元编码与黏粒含量等属性表关联,最终生成全球土壤属性专题栅格图,为农业规划与生态研究提供关键数据支撑。

weixin_29214691的博客 610

apache2 module

LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-3.0.17/ext/apache2/mod_passenger.so    PassengerRoot /var/lib/gems/1.9.1/gems/passenger-3.0.17    PassengerRuby /usr/bin/ruby1.9.1

天地无用 406

5分钟搞懂MSDNet:用Transformer实现小样本语义分割的保姆级教程

本文详细介绍了MSDNet(Multi-Scale Decoder Network)如何利用Transformer架构实现小样本语义分割。通过多尺度解码器和空间Transformer解码器,MSDNet能够在仅有1-5张标注图像的情况下完成精确分割任务。文章提供了PyTorch代码实例和优化技巧,帮助开发者快速掌握这一前沿技术。

weixin_30832143的博客 506

英飞凌TC397芯片时钟树详解:从EB-tresos配置到PLL锁相环实战避坑

本文详细解析了英飞凌TC397芯片的时钟树架构,从EB-tresos配置到PLL锁相环的实战应用,帮助工程师避免常见配置陷阱。文章深入探讨了时钟源层、频率转换层和分配网络层的设计原理,提供了PLL配置的数学公式和EB-tresos关键容器的配置要点,并分享了调试技巧与性能优化实践,适用于MCU开发中的时钟管理需求。

weixin_42524226的博客 212

Apache模块开发/用C语言扩展apache(3:一个非常简单的apache module)

Apache模块开发/用C语言扩展apache(3:一个非常简单的apache module)本文转自: http://www.loveopensource.com/?p=18 原文如下: Apache模块开发/用C语言扩展apache(3:一个非常简单的apache module)by linux_prog    有了上面几篇文

xiaodong liang 1561

一定能解决ROS系统 rosdep update超时问题de简单方法

rosdep update命令使用 1.首先将下面仓库的内容clone到本地 git clone https://github.com/ros/rosdistro.git 记录rosdistro存放地址,例如/home/gec/rosdistro 如果是自己的改成/home/user/rosdistro,其中user表示用户名 2.修改/usr/lib/python2/dist-packages/rosdep2/rep3.py文件 cd /usr/lib/python2/dist-packages/ros

努力是明天快乐的源泉 5万+

Cadence IC617仿真实践:有源电流镜的共模抑制比优化策略

本文基于Cadence IC617平台,详细介绍了有源电流镜共模抑制比(CMRR)的仿真与优化全流程。从电路搭建、DC工作点分析到AC仿真获取差模/共模增益,逐步解析CMRR计算方法。核心优化策略包括提升电流镜输出阻抗、优化差分对匹配性及调整晶体管尺寸,并探讨了与电源抑制比(PSRR)的权衡,为模拟集成电路设计提供实用指南。

weixin_29313817的博客 183

[华中科技计组实验]logisim完成单周期5级流水MIPS CPU

[华中科技计组实验]logisim完成单周期5级流水MIPS32 CPU hu~,终于完成了,真是费劲呐 支持24条指令,5级流水线,可以对分支指令处理,寄存器冲突处理,指令ROM为1K,数据RAM为1M,32位MIPS指令集CPU 但是… 大量使用比较器造成硬件开销巨大,测试一下发现这尼玛真是个老爷车还没单周期跑的快,自己电脑cpu占百分之八九十只能跑到20多赫兹,一个走马灯跑了半天,可优化空间太大了,写了那么多天造成这个破样,有点悲剧。。。 先放个图大伙参考就行了,要是有人想听思路的话接下来再更 .

zrc的博客 1万+

Apache HTTP/2 模块 mod_h2 安装与使用指南

Apache HTTP/2 模块 mod_h2 安装与使用指南 项目概述 mod_h2 是一个专为 Apache HTTP 服务器设计的 HTTP/2 模块,它允许服务端在 HTTPS 连接上提供 HTTP/2 协议支持。此模块作为 Apache 的扩展,自 2.4.17 版本起成为官方模块的一部分,并且 mod_proxy_http2 也在稍后的版本中被引入,以支持反向代理下的 HTTP/2 连...

gitblog_00079的博客 492

(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3)

Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、.

JunLeon的博客 3万+

《Apache源代码全景分析》 ----Apache源代码分析必备

书中详细讲解了Apache的基础体系结构和核心模块的实现机制,包括配置文件、模块化结构、多任务并发,以及网络连接和请求读取,其中多任务并发体系结构是本书分析的重点,讨论了Prefork、Worker及WinNT3种MPM。 本书还重点介绍了Apache 2.0新引入的过滤器,包括过滤器的使用、实现,以及其中的数据组织形式——存储段和存储段组,剖析了Apache中常用的过滤器。 本书深...

199

LeetCode --- 937. Reorder Data in Log Files 解题报告

You are given an array oflogs. Each log is a space-delimited string of words, where the first word is theidentifier. There are two types of logs: Letter-logs: All words (except the identifier) consist of lowercase English letters. Digit-logs: All word..

杨鑫newlife的专栏 426

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

php-4.4.0,winxp+apache_2+php-4.4.0+mysql+ZendOptimizer安装

winxp_sp2+apache_2.0.54-win32-x86-no_ssl.msi+php-4.4.0-Win32+ xmysql-4.0.26-win32+ZendOptimizer-2.5.10a-Windows-i386.exe安装日志2005-10-08##########################################建立一个文件夹[D:servers]专放置apa...

weixin_39918928的博客 129

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

APACHE2.0 MOD 模块开发 STEP 1

APACHE2.0  MOD 模块开发 STEP  1一.目的写一个APACHE2.0的MOD模块,读取配置,并对所有后缀为.hello的请求进行处理。二.步骤创建一个mod_hello.c文件1.  定义一个模块。#include "httpd.h"#include "http_config.h"module AP_MODULE_DECLARE_DATA hell

江南事 1887

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

DSO开发指南晋级(APACHE2.0 MOD 模块开发)

APACHE2.0 MOD 模块开发 STEP 1  一.目的写一个APACHE2.0的MOD模块,读取配置,并对所有后缀为.hello的请求进行处理。二.步骤创建一个mod_hello.c文件1.  定义一个模块。#include "httpd.h"#include "http_config.h"module AP_MODULE_DECLARE_DATA he

LaoChai的专栏 1978

Apache 模块开发

 APACHE2.0 MOD 模块开发 STEP 1 一.目的写一个APACHE2.0的MOD模块,读取配置,并对所有后缀为.hello的请求进行处理。二.步骤创建一个mod_hello.c文件1.  定义一个模块。#include "httpd.h"#include "http_config.h"module AP_MODULE_DECLARE_DATA

jianguoliusheng的专栏 1464

Apache2.0过滤器开发

Apache 2.0提供了许多 API 改进。本文将给出一个 Apache 2.0 过滤器模块示例,并将用示例说明新的 API。

风信子的专栏 1393

开源协议:在项目中使用Apache License 2.0

Apache License 2.0的使用限制有很多介绍,这篇文章说明一下在项目中使用Apache License 2.0的步骤和注意事项。

知行合一 止于至善 3万+

apache2+php7.0安装

1 sudo apt-get install apache2 php7.0 php7.0-json php7.0-gd php7.0-sqlite curl libcurl3 libcurl4-openssl-dev 2 如果1中命令执行报错:未找到对应的安装包,可以先执行以下命令查询可用的安装包版本: “sudo apt-cache search php”查询软件仓库中的php版本号,然...

lixiaotao_1的博客 2483

apache2 php模块,Apache2与PHP的模块化安装

技术文章系统环境:操作系统win2k/nt安装软件:Apache2.0.44 、PHP4.3.1安装PHP1. 把下载下来的PHP安装包解压到你的C盘根目录(这里选择C根目录盘是为了以后修改调试方便用,你也可以选择不同的目录),解压后应该能得到一个类似于"php-4.2.3-Win32"的目录,把目录名称改成"PHP"。2. 打开刚才解压的PHP目录,你会发现有一个叫做"php.ini-dist"...

weixin_39835147的博客 323

开源项目加Apache License2.0不会用,看看Apache Ant怎么做

之前介绍过在项目中“如何添加Apache License2.0授权证书”,可能一些小伙伴还是无感,真正在项目中使用时还是有些晕。来看个实例好了,Apache Ant很多人应该熟悉,它用的正式是Apace License 2.0开源授权证书,看看它是怎么做的呢? 一、安装包中有3个文件“LICENSE”,“NOTICE”,“README”,而且都是文本文件。 下面依次打开看一下三个文件都是什...

AliveCode,Code Life 2543

用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)

三、常见问题1、常见错误apxs:Error: Sorry, cannot determine bootstrap symbol name. apxs:Error: Please specify one with option `-n'.加个-n参数,给模块起个名字apxs2 -iacn mod_helloworld.cpp ./mod_helloworld.so2、带库模块的编译a、库编译仍然采...

weixin_33044131的博客 312
上一篇: lucene多个域排序
下一篇: Hadoop+hive+sqoop环境部署
reesun
博客等级 码龄19年 12粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值