nginx 소스 코드 학습 노트 (1) - nginx helloworld 모듈

최근 에 책 한 권 을 읽 었 는데 저 와 같은 학교 사람들 이 쓴 nginx 에 관 한 내용 입 니 다. 개인 적 으로 내용 이 좀 더 충실 할 수 있다 고 생각 합 니 다. 전체 책의 후반 부 를 포함 하여 큰 가치 가 없 지만 전체적으로 좋 습 니 다. 하하!(자기 애가 좀 없 는 것 같 아 요) 말 도 안 돼 요. 오늘 제 가 방금 쓴 nginx hello 를 기록 해 주세요.World 모듈 내용, 인터넷 에 소스 코드 도 없 는데 완전히 손 으로 두 드 렸 어 요. 힘 들 어 요!
 
1. nginx 모듈
먼저 nginx 와 apache 의 가장 큰 차이 점 은 nginx 의 모듈 이 동적 으로 추가 할 수 없다 는 것 입 니 다. 컴 파일 할 때 추가 할 모듈 경 로 를 지정 하고 nginx 소스 코드 와 함께 컴 파일 해 야 합 니 다.
nginx 모듈 의 처리 절차:
a. 클 라 이언 트 가 http 요청 도 nginx 서버 를 보 냅 니 다.
b. nginx 설정 파일 의 위 치 를 기반 으로 적합 한 처리 모듈 을 선택 하 십시오.
c. 부하 균형 모듈 백 엔 드 서버 선택 (역방향 프 록 시 상황 에서)
d. 처리 모듈 을 처리 하고 출력 버퍼 를 첫 번 째 필터 모듈 에 놓 습 니 다.
e. 첫 번 째 필터 모듈 처리 후 두 번 째 필터 모듈 에 출력
f. 그리고 두 번 째 여과 모듈 에서 세 번 째 여과 모듈 까지
g. N 번 째 필터 모듈...
h. 처리 결 과 를 클 라 이언 트 에 게 발송
 
2. nginx 모듈 작성
a. 모듈 폴 더 만 들 기
mkdir -p /opt/nginx_hello_world
cd /op/nginx_hello_word

b. 모듈 프로필 생 성
vi /opt/nginx_hello_word/config

다음 내용 을 기록 합 니 다:
ngx_addon_name=ngx_http_hello_world_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
CORE_LIBS="$CORE_LIBS -lpcre"

 
c. 모듈 메 인 파일 만 들 기
vi /opt/nginx_hello_world/ngx_http_hello_world_module.c

다음 내용 을 기록 합 니 다:
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);


/* Commands */
static ngx_command_t  ngx_http_hello_world_commands[] = {
    { ngx_string("hello_world"),
      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
      ngx_http_hello_world,
      0,
      0,
      NULL },
    ngx_null_command
};

static u_char ngx_hello_world[] = "hello world";

static ngx_http_module_t  ngx_http_hello_world_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 */
};
/* hook */
ngx_module_t  ngx_http_hello_world_module = {
    NGX_MODULE_V1,
    &ngx_http_hello_world_module_ctx,              /* module context */
    ngx_http_hello_world_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 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;
    /* Http Output Buffer */
    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.buf = b;
    out.next = NULL;
    
    b->pos = ngx_hello_world;
    b->last = ngx_hello_world + sizeof(ngx_hello_world);
    b->memory = 1;
    b->last_buf = 1;
    
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = sizeof(ngx_hello_world);
    ngx_http_send_header(r);
    
    return ngx_http_output_filter(r, &out);
}
static char *
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_core_loc_conf_t *clcf ;
    /* register hanlder */
    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    clcf->handler = ngx_http_hello_world_handler;
    return NGX_CONF_OK;
}

 
d. nginx 소스 패 키 지 를 다운로드 합 니 다. 저 는 nginx - 1.0.13. tar. gz 를 다운로드 합 니 다.
helloworld 모듈 을 컴 파일 하기 전에 먼저 nginx 가 독립 적 으로 컴 파일 에 성공 할 수 있 는 지, 필요 한 모든 모듈 이 설치 되 어 있 는 지 확인 하 십시오.
helloworld 모듈 과 함께 nginx 를 컴 파일 합 니 다:
./configure --prefix=/usr/local/nginx --add-module=/opt/nginx_hello_world/
make
make install

 
e, nginx. conf 설정
location= /hello {
    hello_world;
}

 
f. nginx 시작, 접근
http://localhost/hello
작성 한 helloworld 모듈 에서 출력 한 문 자 를 볼 수 있 습 니 다.
 
3. hello World 모듈 분석
a.ngx_command_t 함 수 는 모듈 명령 을 포함 하 는 정적 배열 ngx 를 정의 하 는 데 사 용 됩 니 다.http_hello_world_commands
static ngx_command_t  ngx_http_hello_world_commands[] = {
    { ngx_string("hello_world"),  //         ,        ,    ngx_str_t       。
      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, //         ,    :location    ,        。
      ngx_http_hello_world,//    ,    (ngx_conf_t *cf,ngx_command_t *cmd, void *conf)
      0,//         ,      
      0,
      NULL },
    ngx_null_command
};

b.static u_char ngx_hello_World [] = "hello World" 는 화면 에 출력 되 는 문자열 입 니 다.
c.ngx_http_module_t 구조 체 ngx 정의http_hello_world_module_ctx:
static ngx_http_module_t  ngx_http_hello_world_module_ctx = {
    NULL,                                  /*        */
    NULL,                                     /*        */
    NULL,                                  /*             */
    NULL,                                  /*              */
    NULL,                                  /*               */
    NULL,                                  /*              */
    NULL,                                  /*              */
    NULL                                   /*             */
};

d.ngx_module_t 정의 구조 체 ngxhttp_hello_world_module
ngx_module_t  ngx_http_hello_world_module = {
    NGX_MODULE_V1,
    &ngx_http_hello_world_module_ctx,              /* module context */
    ngx_http_hello_world_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
};

 
그 는 모듈 의 주요 내용 과 명령 의 집행 부분 을 포함 하고 있 으 며, 다음 절 에 상세 하 게 설명 할 것 이다.
e. 처리 함수, ngxhttp_hello_world_handler 도 hello World 모듈 의 핵심 부분 입 니 다.
static ngx_int_t
ngx_http_hello_world_handler(ngx_http_request_t *r)//ngx_http_request_t *r                       
{
    ngx_int_t     rc;
    ngx_buf_t    *b;
    ngx_chain_t   out;
    /* Http Output Buffer */
    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.buf = b;
    out.next = NULL;
    
    b->pos = ngx_hello_world;
    b->last = ngx_hello_world + sizeof(ngx_hello_world);
    b->memory = 1;
    b->last_buf = 1;
    
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = sizeof(ngx_hello_world);
    ngx_http_send_header(r);
    
    return ngx_http_output_filter(r, &out);
}

 
 
 

좋은 웹페이지 즐겨찾기