Nginx下编写c模块来阻止HTTP代理服务器的访问
在这篇使用Apache来阻止http代理服务器的访问文章里,我们使用了Apache的mod_rewrite来判断访客的http head头,如果看到了有代理的迹象,就阻止它,能否进一步提高效率呢?于是想到了用nginx来提高效率,为了最快,编写了C模块,这样效率会达至最高。
下面简单介绍一下nginx模块的编写:
nginx模块分两种,handle和filter。handle是得到输入后,直接控制输出最终结果;而filter是得到输入后,进行变换,传递给下一个filter依次处理,两种模块稍有区别。
我们这里是对Header头进行处理,如果不是代理就放行,如果是代理就阻止,所以应该是用filter。
这篇教程很不错http://www.evanmiller.org/nginx-modules-guide.html,建议大家参看。
关键是要先吃透nginx的数据类型,多使用自带的函数,发现LXR真是一个不错的源代码浏览工具撒:
关键函数部分:
遍历整个Header:
part = &r->headers_in.headers.part;
header = part->elts;
for (i = 0; /* void */ ; i++) {
if (i >= part->nelts) {
if (part->next == NULL) {
break;
}
part = part->next;
header = part->elts;
i = 0;
}
}
比较Header头:
if (ngx_strncasecmp(header[i].key.data, (u_char *) “via”, 3) == 0
||ngx_strncasecmp(header[i].key.data, (u_char *) “forwarded”, 7) == 0
||ngx_strncasecmp(header[i].key.data, (u_char *) “useragent_via”, 13) == 0
||ngx_strncasecmp(header[i].key.data, (u_char *) “useragent-via”, 13) == 0
……
||ngx_strncasecmp(header[i].key.data, (u_char *) “mt_proxy_id”, 11) == 0
||ngx_strncasecmp(header[i].key.data, (u_char *)”mt-proxy-id”,11)== 0)
涉及的nginx相关数据结构:
ngx_str_t
ngx_table_elt_t
ngx_list_part_t
ngx_http_request_t
源代码下载:ngx_http_proxyblock_module.c.txt
编译过程:
tar zxvf nginx-0.7.58.tar.gz
cd nginx-0.7.58
mkdir mo
#把ngx_http_proxyblock_module.c放入mo目录
#在mo目录下建立config文件
vi mo/config
ngx_addon_name=ngx_http_proxyblock_module
HTTP_AUX_FILTER_MODULES=”$HTTP_AUX_FILTER_MODULES ngx_http_proxyblock_module”
NGX_ADDON_SRCS=”$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_proxyblock_module.c”
CORE_LIBS=”$CORE_LIBS”
#编译的时候加参数–add-module
./configure –without-pcre –add-module=./mo
OK,这样就搞定了,handle模块就下回再说吧……
来自:http://www.linuxboy.net/wordpress2/2009/05/22/259.html
