登 录
以前一直写的都是nginx的handler模块,包括线上服务器都是handler模块,还没有真正写过filter模块,这里就张贴一个filter模块的骨架,方便自己以后查阅。这个入门级的filter只是简单的在响应body尾添加上字符串“Nginx”。
#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static ngx_int_t ngx_http_test_filter_init(ngx_conf_t *cf); static ngx_http_module_t ngx_http_test_filter_module_ctx = { NULL, /* preconfiguration */ ngx_http_test_filter_init, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ NULL, /* create location configuration */ NULL /* merge location configuration */ }; ngx_module_t ngx_http_test_filter_module = { NGX_MODULE_V1, &ngx_http_test_filter_module_ctx, /* module context */ NULL, /* module directives */ NGX_HTTP_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; static ngx_http_output_header_filter_pt ngx_http_next_header_filter; static ngx_http_output_body_filter_pt ngx_http_next_body_filter; static ngx_int_t ngx_http_test_header_filter(ngx_http_request_t *r) { if (r != r->main) { return ngx_http_next_header_filter(r); } r->headers_out.content_length_n += sizeof("Nginx") - 1; return ngx_http_next_header_filter(r); } static ngx_int_t ngx_http_test_body_filter(ngx_http_request_t *r, ngx_chain_t *in) { if (r != r->main) { return ngx_http_next_body_filter(r, in); } ngx_chain_t *chain_link; int chain_contains_last_buffer = 0; for ( chain_link = in; chain_link != NULL; chain_link = chain_link->next ) { if (chain_link->buf->last_buf) { chain_contains_last_buffer = 1; break; } } if (!chain_contains_last_buffer) return ngx_http_next_body_filter(r, in); ngx_buf_t *b; b = ngx_calloc_buf(r->pool); if (b == NULL) { return NGX_ERROR; } b->pos = (u_char *) "Nginx"; b->last = b->pos + sizeof("Nginx") - 1; b->memory = 1; b->last_buf = 1; ngx_chain_t *added_link; added_link = ngx_alloc_chain_link(r->pool); if (added_link == NULL) return NGX_ERROR; added_link->buf = b; added_link->next = NULL; chain_link->next = added_link; chain_link->buf->last_buf = 0; added_link->buf->last_buf = 1; return ngx_http_next_body_filter(r, in); } static ngx_int_t ngx_http_test_filter_init(ngx_conf_t *cf) { ngx_http_next_header_filter = ngx_http_top_header_filter; ngx_http_top_header_filter = ngx_http_test_header_filter; ngx_http_next_body_filter = ngx_http_top_body_filter; ngx_http_top_body_filter = ngx_http_test_body_filter; return NGX_OK; }
config内容:
ngx_addon_name=ngx_http_test_filter_module HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_test_filter_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_test_filter_module.c"
抱歉!评论已关闭.