nginx模块开发初体验

来源:互联网 发布:史克威尔艾尼克斯 知乎 编辑:程序博客网 时间:2024/06/03 09:56

一、先来看看我们想要达到的结果

这里写图片描述

二、自定义模块首先安装好nginx,再来修改配置文件nginx.conf

    server {        listen       80;        server_name  localhost;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {            root   html;            index  index.html index.htm;        }        #加入这一段,输入后缀/hello_world是就会调用我们自定义的模块        location /hello_world {            hello_world Poechant;        }    }

然后创建一个目录写自定义的模块

mkdir ngx_http_hello_world_modulecd ngx_http_hello_world_moduletouch ngx_http_hello_world_module.ctouch config

这就是我们的目录结构
这里写图片描述

  • ngx_http_hello_world_module.c文件内容
#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>typedef struct {    ngx_str_t output_words;} ngx_http_hello_world_loc_conf_t;// To process HelloWorld command argumentsstatic char* ngx_http_hello_world(ngx_conf_t* cf, ngx_command_t* cmd, void* conf);// Allocate memory for HelloWorld commandstatic void* ngx_http_hello_world_create_loc_conf(ngx_conf_t* cf);// Copy HelloWorld argument to another placestatic char* ngx_http_hello_world_merge_loc_conf(ngx_conf_t* cf, void* parent, void* child);// Structure for the HelloWorld commandstatic ngx_command_t ngx_http_hello_world_commands[] = {    {        ngx_string("hello_world"), // The command name        NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,        ngx_http_hello_world, // The command handler        NGX_HTTP_LOC_CONF_OFFSET,        offsetof(ngx_http_hello_world_loc_conf_t, output_words),        NULL    },    ngx_null_command};// Structure for the HelloWorld contextstatic ngx_http_module_t ngx_http_hello_world_module_ctx = {    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    ngx_http_hello_world_create_loc_conf,    ngx_http_hello_world_merge_loc_conf};// Structure for the HelloWorld module, the most important thingngx_module_t ngx_http_hello_world_module = {    NGX_MODULE_V1,    &ngx_http_hello_world_module_ctx,    ngx_http_hello_world_commands,    NGX_HTTP_MODULE,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NGX_MODULE_V1_PADDING};static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t* r) {    ngx_int_t rc;    ngx_buf_t* b;    ngx_chain_t out[2];    ngx_http_hello_world_loc_conf_t* hlcf;    hlcf = ngx_http_get_module_loc_conf(r, ngx_http_hello_world_module);    r->headers_out.content_type.len = sizeof("text/plain") - 1;    r->headers_out.content_type.data = (u_char*)"text/plain";    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));    out[0].buf = b;    out[0].next = &out[1];    b->pos = (u_char*)"hello_world, ";    b->last = b->pos + sizeof("hello_world, ") - 1;    b->memory = 1;    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));    out[1].buf = b;    out[1].next = NULL;    b->pos = hlcf->output_words.data;    b->last = hlcf->output_words.data + (hlcf->output_words.len);    b->memory = 1;    b->last_buf = 1;    r->headers_out.status = NGX_HTTP_OK;    r->headers_out.content_length_n = hlcf->output_words.len + sizeof("hello_world, ") - 1;    rc = ngx_http_send_header(r);    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {        return rc;    }    return ngx_http_output_filter(r, &out[0]);}static void* ngx_http_hello_world_create_loc_conf(ngx_conf_t* cf) {    ngx_http_hello_world_loc_conf_t* conf;    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_hello_world_loc_conf_t));    if (conf == NULL) {        return NGX_CONF_ERROR;    }    conf->output_words.len = 0;    conf->output_words.data = NULL;    return conf;}static char* ngx_http_hello_world_merge_loc_conf(ngx_conf_t* cf, void* parent, void* child) {    ngx_http_hello_world_loc_conf_t* prev = parent;    ngx_http_hello_world_loc_conf_t* conf = child;    ngx_conf_merge_str_value(conf->output_words, prev->output_words, "Nginx");    return NGX_CONF_OK;}static char* ngx_http_hello_world(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_hello_world_handler;    ngx_conf_set_str_slot(cf, cmd, conf);    return NGX_CONF_OK;}
  • config文件内容
ngx_addon_name=ngx_http_hello_world_moduleHTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"

三、开始编译安装

  • 到nginx安装包目录下重新编译自定义的模块–add-module路径填你自定义模块的位置
./configure --prefix=/usr/local/nginx --add-module=/home/zzq/software/ngx_http_hello_world_module

这里写图片描述
- 编译是会有提示的,会提示你新增了哪些模块,然后

makemake install

一切执行完后,没报错一般都是成功了的,然后重启nginx,就可以输入http://你的ip:port/hello_world测试下。