运行过滤器模块
对过滤器的配置与前几个小节略有差异,在 httpd.conf 中,不但要使用 LoadModule 指令加载过滤器模块,还要使用 SetOutputFilter 指令来指定过滤器的应用场景:
LoadModule filter_echo_post_module modules/mod_filter_echo_post.so AddOutputFilter CaseFilter .cf |
我们在指令中指定,CaseFilter 这个过滤器仅对扩展名为 .cf 的 URL 请求做过滤,其他请求则不过滤。然后,在 DocumentRoot 中创建一个文件,名为 casetest.cf 的文件,内容如下:
$ cat casetest.cf This line should be upcased. So does this line. |
然后重启 Apache,并使用 curl 测试该过滤器,可以得到以下结果:
$ curl http://10.111.43.145:9527/casetest.cf THIS LINE SHOULD BE UPCASED. SO DOES THIS LINE. |
即,将该文件中的字符串转换为大写字母输出。
实际开发过程中,代码很难一次性通过所有的应用场景,可能会有各种考虑不到的边界问题发生,因此需要一个方便的调试方式做支持。本文仅讨论在 Linux 操作系统环境下的调试。Apache 的开发者为此预留了一个入口,当启动 Apache 时,加入选项 (-X) 表示进入调试模式。
首先启动 gdb(Gnu Debugger),gdb 是 Linux 下调试的工具,调试程序非常方便。可以通过 gdb 以调试模式启动 httpd,设置断点,进行调试 ( 部分 gdb 冗余的输出已经被删除 ):
$ gdb -q apache/bin/httpd (gdb) break cust_echo_post_handler Function "cust_echo_post_handler" not defined. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 1 (cust_echo_post_handler) pending. (gdb) run -X -d apache Starting program: /home/pts/juntao/cprog/idp/apache/bin/httpd -X -d apache Breakpoint 2 at 0x416a4a: file mod_cust_echo_post.c, line 122. [Switching to Thread -1208781120 (LWP 23658)] |
break 是 gdb 中设置断点的命令,run 是 gdb 程序的命令,表示启动应用程序。run 之后,gdb 停留在控制台上,Apache 进入 main-loop。 这时候我们即可通过客户端发送请求到 Apache httpd:
$ curl -F "file=@Makefile" http://10.111.43.145:9527/cust_echo_post httpd 接受到请求之后,会进入我们预设的断点处,这样就可以开始调试: |
Breakpoint 2, cust_echo_post_handler (req=0x8e1fad8) at mod_cust_echo_post.c:122 (gdb) |
这时候我们可以使用 next( 单步 )/step( 步入 )/print( 查看变量 ) 等命令来调试自己的模块。调试结束后,通过 quit 命令退出 gdb。gdb 本身功能非常强大,有兴趣的读者可以参考“参考资料”小节的资料。
本文介绍了 Apache httpd 开发平台的运行方式,请求处理流程。并将一个最简单的模块模板逐步扩展,形成一个可以使用的模块,该模块将根据配置信息,将客户端 POST 的数据进行大 / 小写转化。最后是一个简单的过滤器示例,通过对整个开发流程的熟悉,读者可以开始开发自己的 Apache 模块,以适应不同的实际开发场景。
描述 | 名字 | 大小 | 下载方法 |
---|---|---|---|
样例代码 | apache_mod_tour.tar.gz | 77KB | HTTP |