200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 自定义模块_Nginx自定义模块开发

自定义模块_Nginx自定义模块开发

时间:2019-03-02 17:10:16

相关推荐

自定义模块_Nginx自定义模块开发

/video/1048730832663040000

环境:Ubuntu14.04 x86_64

Nginx:Nginx-1.13.10

编译安装Nginx

安装必要的库:apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl

Nginx源代码位置:/home/nginx/nginx-1.13.10

wget /download/nginx-1.13.10.tar.gztar -xvzf nginx-1.13.10.tar.gz

自定义模块位置:/home/nginx/mytest

编译干净的Nginx:

./configuremakemake install

验证是否成功:浏览器访问waf.hackbiji.top,看到欢迎页面即表示成功。PS:这里的URL或IP地址换成自己的,另外如果你的端口被占用,请修改自己的nginx.conf配置文件。

开发步骤:

定义配置项

static ngx_command_t ngx_http_mytest_commands[] = { { ngx_string("mytest"), NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LMT_CONF | NGX_CONF_NOARGS, ngx_http_mytest, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, ngx_null_command};

实现ngx_http_mytest函数

static char* ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_core_loc_conf_t *clcf;clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);clcf->handler = ngx_http_mytest_handler;return NGX_CONF_OK;}

定义ngx_http_module_t的8个回调函数

static ngx_http_module_t ngx_http_mytest_module_ctx = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };

定义mytest模块

ngx_module_t ngx_http_mytest_module = { NGX_MODULE_V1, &ngx_http_mytest_module_ctx, ngx_http_mytest_commands, NGX_HTTP_MODULE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NGX_MODULE_V1_PADDING };

定义处理函数

static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r) { if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) { return NGX_HTTP_NOT_ALLOWED; }// Discard request body ngx_int_t rc = ngx_http_discard_request_body(r); if (rc != NGX_OK) { return rc; } // Send response header ngx_str_t type = ngx_string("text/plain"); ngx_str_t response = ngx_string("Hello World!"); r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = response.len; r->headers_out.content_type = type; rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { return rc; } // Send response body ngx_buf_t *b; b = ngx_create_temp_buf(r->pool, response.len); if (b == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } ngx_memcpy(b->pos, response.data, response.len); b->last = b->pos + response.len; b->last_buf = 1; ngx_chain_t out; out.buf = b; out.next = NULL; return ngx_http_output_filter(r, &out); }

开发自定义模块

自定义模块:mytest

mytest/├── config└── ngx_http_mytest_module.c

添加config文件添加ngx_http_mytest_modul.c文件修改nginx.conf文件

# configngx_addon_name=ngx_http_mytest_moduleHTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"

// cat ngx_http_mytest_module.c #include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r) { if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) { return NGX_HTTP_NOT_ALLOWED; }// Discard request body ngx_int_t rc = ngx_http_discard_request_body(r); if (rc != NGX_OK) { return rc; } // Send response header ngx_str_t type = ngx_string("text/plain"); ngx_str_t response = ngx_string("Hello World!"); r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = response.len; r->headers_out.content_type = type; rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { return rc; } // Send response body ngx_buf_t *b; b = ngx_create_temp_buf(r->pool, response.len); if (b == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } ngx_memcpy(b->pos, response.data, response.len); b->last = b->pos + response.len; b->last_buf = 1; ngx_chain_t out; out.buf = b; out.next = NULL; return ngx_http_output_filter(r, &out); } static char* ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); clcf->handler = ngx_http_mytest_handler;return NGX_CONF_OK; } static ngx_command_t ngx_http_mytest_commands[] = { { ngx_string("mytest"), NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LMT_CONF | NGX_CONF_NOARGS, ngx_http_mytest, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, ngx_null_command}; static ngx_http_module_t ngx_http_mytest_module_ctx = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; ngx_module_t ngx_http_mytest_module = { NGX_MODULE_V1, &ngx_http_mytest_module_ctx, ngx_http_mytest_commands, NGX_HTTP_MODULE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NGX_MODULE_V1_PADDING };

# modify nginx.conflocation / {mytest;#root html;#index index.html index.htm;}

编译自定义Nginx

编译自定义模块的Nginx:

./configure --add-module=/home/nginx/mytestmakemake install

验证是否成功:浏览器访问waf.hackbiji.top,看到hello world页面即表示成功。

参考文献:

《深入理解Nginx》第3章 如何编写HTTP模块

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。