[개발 기록] Nginx 모듈 개발 (二)
17135 단어 nginx
commands 구조의 초기 화 는 해당 명령 에 따라 리 셋 함 수 를 추가 하여 memcached 를 처리 합 니 다.pass 이 명령
1 static ngx_command_t ngx_http_memcached_commands[] = {
2
3 { ngx_string("memcached_pass"),
4 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
5 ngx_http_memcached_pass, //
6 NGX_HTTP_LOC_CONF_OFFSET,
7 0,
8 NULL },
9 .....
10 }
봐 봐 ngxhttp_memcached_pass 의 실현:
이 함 수 는 conf 에 대해 초기 화 작업 을 할 것 입 니 다.
static char *
ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_memcached_loc_conf_t *mlcf = conf;
ngx_str_t *value;
ngx_url_t u;
ngx_http_core_loc_conf_t *clcf;
if (mlcf->upstream.upstream) {
return "is duplicate";
}
value = cf->args->elts;
ngx_memzero(&u, sizeof(ngx_url_t));
u.url = value[1];
u.no_resolve = 1;
mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
if (mlcf->upstream.upstream == NULL) {
return NGX_CONF_ERROR;
}
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_http_memcached_handler; //
if (clcf->name.data[clcf->name.len - 1] == '/') {
clcf->auto_redirect = 1;
}
mlcf->index = ngx_http_get_variable_index(cf, &ngx_http_memcached_key);
if (mlcf->index == NGX_ERROR) {
return NGX_CONF_ERROR;
}
return NGX_CONF_OK;
}
전체 모듈 의 정의:
ngx_http_memcached_commands 는 들 어 오 는 변수 입 니 다.
ngx_http_memcached_module_ctx 는 모듈 의 context 구조 입 니 다.
이 구 조 는 설정 정보 초기 화 를 위 한 모든 반전 함 수 를 저장 합 니 다.
1 ngx_module_t ngx_http_memcached_module = {
2 NGX_MODULE_V1,
3 &ngx_http_memcached_module_ctx, /* module context */
4 ngx_http_memcached_commands, /* module directives */
5 NGX_HTTP_MODULE, /* module type */
6 NULL, /* init master */
7 NULL, /* init module */
8 NULL, /* init process */
9 NULL, /* init thread */
10 NULL, /* exit thread */
11 NULL, /* exit process */
12 NULL, /* exit master */
13 NGX_MODULE_V1_PADDING
14 };
1 static ngx_http_module_t ngx_http_memcached_module_ctx = {
2 NULL, /* preconfiguration */
3 NULL, /* postconfiguration */
4
5 NULL, /* create main configuration */
6 NULL, /* init main configuration */
7
8 NULL, /* create server configuration */
9 NULL, /* merge server configuration */
10
11 ngx_http_memcached_create_loc_conf, /* create location configration */
12 ngx_http_memcached_merge_loc_conf /* merge location configration */
13 };
반전 ngxhttp_memcached_create_loc_conf 는 정 보 를 설정 하기 위해 저장 공간 을 할당 하고 초기 화 합 니 다.
앞으로 정 보 를 설정 하 는 매개 변 수 를 사용 해 야 할 때 사용 하 는 방식 은 다음 과 같 습 니 다.
ngx_http_memcached_loc_conf_t *mlcf;
mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
그 중 ngxhttp_memcached_loc_conf_t 는 자신 이 정의 한 설정 정보의 구조 입 니 다.
memcached 모듈 의 정 의 는 다음 과 같 습 니 다.
1 typedef struct {
2 ngx_http_upstream_conf_t upstream;
3 ngx_int_t index;
4 } ngx_http_memcached_loc_conf_t;
이것들 은 모두 초기 화 된 작업 입 니 다. 핵심 함 수 를 보십시오.
ngx_http_memcached_handler
1 static ngx_int_t
2 ngx_http_memcached_handler(ngx_http_request_t *r)
3 {
4 ngx_int_t rc;
5 ngx_http_upstream_t *u;
6 ngx_http_memcached_ctx_t *ctx;
7 ngx_http_memcached_loc_conf_t *mlcf;
8
9 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
10 return NGX_HTTP_NOT_ALLOWED;
11 }
12
13 rc = ngx_http_discard_request_body(r);
14
15 if (rc != NGX_OK) {
16 return rc;
17 }
18
19 if (ngx_http_set_content_type(r) != NGX_OK) {
20 return NGX_HTTP_INTERNAL_SERVER_ERROR;
21 }
22 // upstream
23 if (ngx_http_upstream_create(r) != NGX_OK) {
24 return NGX_HTTP_INTERNAL_SERVER_ERROR;
25 }
26 // upstream
27 u = r->upstream;
28
29 ngx_str_set(&u->schema, "memcached://");
30 u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module;
31
32 ngx_http_memcached_loc_conf_t *mlcf;
33 mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
34
35 u->conf = &mlcf->upstream;
36 // upstream
37 u->create_request = ngx_http_memcached_create_request; // upstream
38 u->reinit_request = ngx_http_memcached_reinit_request; //
39 u->process_header = ngx_http_memcached_process_header; //
40 u->abort_request = ngx_http_memcached_abort_request; //
41 u->finalize_request = ngx_http_memcached_finalize_request; //
42
43 ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));
44 if (ctx == NULL) {
45 return NGX_HTTP_INTERNAL_SERVER_ERROR;
46 }
47
48 ctx->rest = NGX_HTTP_MEMCACHED_END;
49 ctx->request = r;
50
51 ngx_http_set_ctx(r, ctx, ngx_http_memcached_module);
52
53 u->input_filter_init = ngx_http_memcached_filter_init;
54 u->input_filter = ngx_http_memcached_filter;
55 u->input_filter_ctx = ctx;
56
57 r->main->count++;
58
59 ngx_http_upstream_init(r);
60
61 return NGX_DONE;
62 }
그 중에서 볼 수 있 듯 이 대부분의 반전 은 매개 변수 ngx 입 니 다.http_request_t *r
1 static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r);
2 static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r);
3 static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r);
4 static ngx_int_t ngx_http_memcached_filter_init(void *data);
5 static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes);
6 static void ngx_http_memcached_abort_request(ngx_http_request_t *r);
7 static void ngx_http_memcached_finalize_request(ngx_http_request_t *r,
8 ngx_int_t rc);
함수 처리 시 r 를 통 해 upstream 을 얻 고 '가공' 을 합 니 다.
create request 에 r - > upstream = u 가 있 습 니 다.
이 몇 개의 리 셋 함 수 를 설정 한 후에 해당 하 는 요청 에 이 리 셋 을 추가 합 니 다. 하류 에서 온 서버 의 요청 은 upstream 에 배 포 됩 니 다. 그러나 Nginx 는 자체 리 트 윗 과정 에서 막 히 지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.