注:
路径为:/home/xxx/
工具为:apxs
1、准备工作:安装apache对应的httpd-devel,主要是为了安装apxs。
2、生成一个apache的模块框架:cd /home/xxx/; apache module:apxs -g -n mytest
这里的mytest就是apache模块的名字,但是实际生成的so名为:mod_mytest.so
3、编译apache模块:使用c++语言编写apache模块,网上有说使用extern"C"的方法(见http://hi.baidu.com/zhangsilly/blog/item/a43fa11f869f4efae1fe0bf3.html),但是没有实验成功。extern"C"会有警告,而且编译不过~!
最后,将我的所有后台处理程序做成了一个liblogic.so,然后apache的模块mytest加载这个liblogic.so,而apache模块mytest中只是接收请求,传递参数给liblogic.so进行处理!而在mytest的模块编译时,使用apxs的参数-S进行CC重命名,如下:
apxs -c -a -S CC=g++ -I./src -I./src/common/ -llogic -L./src/ mod_mytest.c -Wl,-rpath=/home/xxx/mytest/src/
这里需要注意,即使你的mod_mytest.c中使用c++语言来编写,但是这个文件不能使用mod_mytest.cpp来进行命名,必须使用.c的后缀,否则不能编译!具体原因不明,待查!在使用-Wl,-rpath的时候,应用程序对实际的动态库路径寻找,需要注意!
可以通过/usr/lib64/apr-1/build/libtool --silent --mode=link g++ ...... 这里的silent去掉,看到具体的编译命令,前面有-Wl,--rpath -Wl,...可以看看!~
编译链接成功以后,在.libs/下会生成我们所用的mod_mytest.so
4、修改httpd.conf,添加:
LoadModule mytest_module /home/xxx/mytest/.libs/mod_mytest.so
<Location /index>
SetHandler mytest
</Location>
这里的index,表示index所对应的请求,比如:http://www.baidu.com/index?a=1&b=2 --- 这里的index将会使用module mytest去处理@!
经常会看的一个头文件:/usr/include/httpd/httpd.h
我们需要从哪儿入手:
打开mod_mytest.c文件,找到:static int mytest_handler(request_rec *r)这行!
这个函数就是我们需要修改的函数!
这里需要指出,对于所有的请求信息,都在这个r参数里!
apache 提供了很多的输出函数,都是使用ap_打头的,在/usr/include/httpd/http_protocol.h中可以看到。下面摘录几个:
AP_DECLARE(int) ap_rputc(int c, request_rec *r);
AP_DECLARE(int) ap_rputs(const char *str, request_rec *r);
AP_DECLARE(int) ap_rwrite(const void *buf, int nbyte, request_rec *r);
AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r,...);
AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list vlist);
……
需要注意,对于ap_rputs,str不可为NULL,否则会引起core!
还有更多的说明,可以参考头文件:/usr/include/httpd/httpd.h
或者下面的网址对你有帮助:
对apache的一些常见问题说明:http://blog.sina.com.cn/s/blog_5bf18faf0100aph8.html
一个helloworld的例子:http://andrew913.javaeye.com/blog/398648
reqeust_rec的结构说明:http://hi.baidu.com/start_and_end/blog/item/f344224ecadcc9c1d0c86a79.html
server_rec的结构说明:http://book.51cto.com/art/200805/72067.htm
apxs工具简介:http://lamp.linux.gov.cn/Apache/ApacheMenu/programs/apxs.html
关于filter模块的一个实例:http://www.cnblogs.com/ithurricane/archive/2009/01/01/1366312.html
1.对于apache的输出压缩需要考虑(使用mod_deflate.so),可以参考http://www.bestchao.net/archives/134
比较重要的一段:
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
</IfModule>