2012-11-19 4 views
1

데이터 파일에서 일부 URL 쌍을 읽고 nginx의 공유 메모리에있는 rb-tree에 해당 내용을 저장하는 작은 nginx 모듈을 작성하고 있습니다. 핸들러의 코드에서 트리 내용은 요청 uri와 일치하고 특정 조건에 따라 리디렉션이 수행됩니다.
이것은 현재 정상적으로 작동합니다. 모듈은 공유 메모리를 추가하고 나중에 nginx에서 호출 할 init 함수를 할당하는 ngx_http_mymodule_init 함수에서 사후 구성 단계에서 실행됩니다.서버 구성 지시어에 따라 nginx 모듈의 공유 메모리를 초기화하십시오.

ngx_http_mymodule_init(ngx_conf_t *cf) { 
    [...] 
    ngx_http_mymodule_shm_zone = ngx_shared_memory_add(...); 
    [...] 
    ngx_http_mymodule_shm_zone->init = ngx_http_mymodule_init_shm_zone;   
    return NGX_OK; 
} 

init_shm_zone 함수는 트리를 만들고 데이터 파일을 읽고 트리 내용을 초기화하는 함수입니다.
그러나이 각 가상 서버에 하나 개의 데이터 파일, 그래서 나는이 같은 nginx를 구성 지시어에서 입력 데이터 파일의 경로를 읽을 필요합니다

static ngx_command_t ngx_http_mymodule_commands[] = { 
    [...] 
    { ngx_string("mymodule_input_filepath"), 
    NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, 
    ngx_conf_set_str_slot, // should be ngx_conf_set_path_slot i guess... 
    NGX_HTTP_SRV_CONF_OFFSET, 
    offsetof(ngx_http_mymodule_srv_conf_t, input_filepath), 
    NULL }, 
    ngx_null_command 
}; 

을 ... 그리고 그 파일 경로를 사용 파일을 열고 내용을 공유 메모리에 저장합니다. 그러나 ngx_http_mymodule_init 함수에서 config 객체에 액세스 할 수 없으므로 파일 이름을 읽을 수 없습니다.
내 질문은, 처리기 또는 단계에서 초기화 코드를 연결해야 서버 구성에서 파일 이름을 읽고 공유 메모리를 초기화하는 데 사용할 수 있습니까?
구성 파일을 파싱 한 후 및 공유 메모리를 만든 후 실제 요청 처리를하기 전에 어딘가에 있어야합니다. 예를 여기를 참조하십시오 ...

+1

공유 메모리를 변경하지 않고 시작시에만 데이터를 읽는 이유는 무엇입니까? 아니면 내가 잘못되어 요청을 처리하는 동안 rbtree가 변경 되었습니까? – VBart

+0

시작과 동시에 파일에서 읽은 리디렉션 목록과 모든 요청을 일치시켜야합니다. 다시 시작/다시로드 할 때까지 수정이 필요하지 않습니다. 나는 그것을 공유 메모리로 읽는 것이 유일한 선택 일 것이라고 생각했다. 이것을 할 수있는 더 좋은 방법이 있을까? (편집 : 수천 개의 가능한 리디렉션과 같이 목록이 큽니다.) – scb

+1

공유 메모리가 필요하지 않습니다. 구성 단계에서 힙 메모리에서 읽을 수 있으며 conf 구조 (기본, loc 또는 serv는 중요하지 않음)에 포인터를 저장할 수 있습니다. ['fork()'] (http://en.wikipedia.org/wiki/Fork_%28operating_system%29)와 ['COW'] (http://en.wikipedia.org/wiki/Copy - 쓰지 않는다). Nginx는 구성을 읽고 초기화 한 후에 많은 작업자 프로세스를 포크합니다. – VBart

답변

1
mmcf = (ngx_my_module_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_my_module); 

을 은 내가 init_master 및 INIT_PROCESS 핸들러에 훅을 시도했지만, 나는 그 핸들러가 매개 변수로받을 수 사이클 개체의 설정 개체를 찾을 수 없습니다 : http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_regex.c#L316

+0

입력 해 주셔서 감사합니다.하지만 여전히 내 ngx_my_module_srv_conf 개체가 NULL입니다. 어쩌면이 메서드는 MAIN 개체에 대해서만 유효할까요? 또는 init 모듈이 너무 빠르면 액세스 할 수 없습니까? 나는 여기에서 찾아 내고, 게시하려고 노력할 것이다. ... – scb

+0

물론 그것은 NULL 다. "서버"conf는 요청이 수신 된 후에 만 ​​선택됩니다. 서버 수준에서 공유 메모리 영역을 구성하려고하면 문제가 발생할 수 있습니다. shm을 사용하는 nginx 모듈을 살펴 본다면 항상 메인 레벨에 있다는 것을 알게 될 것입니다. – VBart

+0

http://nginx.org/r/limit_req_zone, http://nginx.org/r/limit_conn_zone, http://nginx.org/r/proxy_cache_path 등을 참조하십시오. – VBart