apache模块入门

1, 简介

apache的模块是各平台上本质是一个dso文件,*nix上的so或者windows上的dll等等。

运行时,apache的一个内置模块mod_so会家在这些外置的so文件

模块文件放在modules文件夹下, 配置在httpd.conf的loadModule和ifmodule指令。


2,编写模块需要下载一个perl脚本apxs

下载地址:

http://www.apachelounge.com/download/apxs_win32.zip

编译apxs脚本需要perl解释器,windows可以用activeperl。

下载地址:

http://www.activestate.com/activeperl/downloads


build-apxs.bat

@echo off

%~d0 && cd %~dp0

call "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

perl Configure.pl --with-apache2=F:\Apache2.2 --with-apache-prog=httpd.exe

@echo on

可以在apache根目录的bin文件夹下生成apxs.bat apxs.pl等脚本


3, 生成sample模块需要的源文件和Makefile

gen-sample.bat

@echo off

%~d0 && cd %~dp0

set path=F:\Apache2.2\bin;%path%

apxs -n sample -g

@echo on



生成的mod_sample.c主要又3个部分:

a, 处理句柄

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

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

b, 注册句柄
static void sample_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(sample_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

c, 导出module结构
/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA sample_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 */
    NULL,                  /* table of config file commands       */
    sample_register_hooks  /* register hooks                      */
};


4, 编译,重启apache

@echo off

%~d0 && cd %~dp0

set path=F:\Apache2.2\bin;%path%

call "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

nmake -f sample\Makefile stop

nmake -f sample\Makefile 

nmake -f sample\Makefile install

nmake -f sample\Makefile start

pause

@echo on

注意:Makefile的all和install目标没有实现,自己实现:

#   the default target
all: local-shared-build
	$(APXS) -c -llibhttpd.lib -llibaprutil-1.lib -llibapr-1.lib sample\mod_sample.c
	
#   install the shared object file into Apache 
install: install-modules
	xcopy /Y /e /s mod_sample.so F:\Apache2.2\modules

5:,修改httpd.conf

LoadModule sample_module modules/mod_sample.so
<Location /sample>
        SetHandler sample
</Location>

6, 再次重启apache,打开网址:

http://localhost/sample

apache模块入门_第1张图片

=========================================================================

项目文件:

apxs-sample.zip

http://hi.csdn.net/attachment/201112/25/0_1324809733u69O.gif



补充:

如果是在linux下,apxs已经附带在安装中(源文件方式安装)

# 生成sample目录
./bin/apxs -n sample -g

#编译安装
cd sample && make && make install 

#修改配置
LoadModule sample_module modules/mod_sample.so
<Location /sample>
SetHandler sample
</Location>

#重启apache
cd .. && ./bin/apachectl -k restart

#测试
curl http://localhost/sample
 
linux上的apache服务器模块输出:

apache模块入门_第2张图片


补充:关于调试

在linux平台上调试apache模块,需要让apache以单进程模式启动(不是daemon)

编译的时候最好使用-g选项,加入调试符号信息。

# 单进程模式启动apache,便于调试
gdb ./bin/httpd -X

# 在我们的模块里面设置断点
break sample_handler

windows平台上的调试应该是类似的,编译的时候需要生成pdb文件,然后用windbg(推荐用)

挂载一个httpd.exe的进程,设置符号表和源文件路径,开始调试。


你可能感兴趣的:(apache,Microsoft,Module,makefile,apache模块)