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 */
};
@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,打开网址:
=========================================================================
项目文件:
apxs-sample.zip
http://hi.youkuaiyun.com/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服务器模块输出:
补充:关于调试
在linux平台上调试apache模块,需要让apache以单进程模式启动(不是daemon)
编译的时候最好使用-g选项,加入调试符号信息。
# 单进程模式启动apache,便于调试
gdb ./bin/httpd -X
# 在我们的模块里面设置断点
break sample_handler
windows平台上的调试应该是类似的,编译的时候需要生成pdb文件,然后用windbg(推荐用)
挂载一个httpd.exe的进程,设置符号表和源文件路径,开始调试。