nginx 모듈 개발 (1)

5964 단어 nginx
더 읽 기
nginx 모듈 개발 재 정리 하기
helloworld
config

ngx_addon_name=ngx_http_mytest_module
HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"

ngx_http_mytest_module.c

#include 
#include 
#include 
#define HELLO 42
static char * ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);
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,/* preconfiguration */
    NULL,/* 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_mytest_module =
{
    NGX_MODULE_V1,
    &ngx_http_mytest_module_ctx,/* module context */
    ngx_http_mytest_commands,   /* 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 char * ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_core_loc_conf_t  *clcf;
    //    mytest         ,clcf   location     
    //  ,    ,    main、srv  loc     ,       
    //http{} server{}      ngx_http_core_loc_conf_t   
    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    //http            NGX_HTTP_CONTENT_PHASE   ,  
    //       、URI mytest            ,      
    //   ngx_http_mytest_handler        
    clcf->handler = ngx_http_mytest_handler;
    return NGX_CONF_OK;
}
static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
{
    int watchpoint = 12;
    printf("this is ngx_hello %d 
",HELLO); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0," haoning error
"); // GET HEAD , 405 Not Allowed if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) { return NGX_HTTP_NOT_ALLOWED; } // ngx_int_t rc = ngx_http_discard_request_body(r); if (rc != NGX_OK) { return rc; } // Content-Type。 ,ngx_str_t //ngx_string, ngx_str_t data len ngx_str_t type = ngx_string("text/plain"); // ngx_str_t response = ngx_string("Hello World!"); // r->headers_out.status = NGX_HTTP_OK; // , Content-Length r->headers_out.content_length_n = response.len; // Content-Type r->headers_out.content_type = type; // http rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { return rc; } // ngx_buf_t ngx_buf_t *b; b = ngx_create_temp_buf(r->pool, response.len); watchpoint = 42; if (b == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } // Hello World ngx_buf_t ngx_memcpy(b->pos, response.data, response.len); // , last b->last = b->pos + response.len; // b->last_buf = 1; // ngx_chain_t ngx_chain_t out; // ngx_buf_t out.buf = b; // next NULL out.next = NULL; // ,http ngx_http_finalize_request // return ngx_http_output_filter(r, &out); }

./configure --prefix=/usr/local/nginx --add-module=/opt/chapter3/helloworld
make
./configure --prefix=/usr/local/nginx --add-module=/opt/chapter3/helloworld
#./configure --with-debug --prefix=/usr/local/nginx --add-module=/opt/chapter3/helloworld
#CFLAGS="-g3 -O0" ./configure  --prefix=/usr/local/nginx --with-debug --add-module=/opt/chapter3/helloworld
#./configure --with-cc-opt='-ggdb3 -O0' --prefix=/usr/local/nginx  --with-debug
make
#make CFLAGS="-ggdb3 -O0"
grep -nR hello *
/opt/nginx-1.13.3/objs/addon/helloworld
vim /usr/local/nginx/conf/nginx.conf
location /hello {
    mytest;
}
###########
curl localhost/hello
하면, 만약, 만약...
info macro
하면, 만약, 만약...
gdb /usr/local/nginx/sbin/nginx
gdb - p 'nginx 의 worker 프로 세 스'

set args -c /usr/local/nginx/conf/nginx.conf
b ngx_cycle.c:1264
b ngx_http_mytest_module.c:63
set follow-fork-mode child

하위 프로 세 스 로 전환
r
info macro
nginx 워 커 프로 세 스 찾기
gdb -q -p `pidof nginx`

좋은 웹페이지 즐겨찾기