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
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; }
static void sample_register_hooks(apr_pool_t *p) { ap_hook_handler(sample_handler, NULL, NULL, APR_HOOK_MIDDLE); }
/* 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 */ };
@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
=========================================================================
项目文件:
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/samplelinux上的apache服务器模块输出:
补充:关于调试
在linux平台上调试apache模块,需要让apache以单进程模式启动(不是daemon)
编译的时候最好使用-g选项,加入调试符号信息。
# 单进程模式启动apache,便于调试 gdb ./bin/httpd -X # 在我们的模块里面设置断点 break sample_handler
挂载一个httpd.exe的进程,设置符号表和源文件路径,开始调试。