데이터 파일에서 일부 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 객체에 액세스 할 수 없으므로 파일 이름을 읽을 수 없습니다.
내 질문은, 처리기 또는 단계에서 초기화 코드를 연결해야 서버 구성에서 파일 이름을 읽고 공유 메모리를 초기화하는 데 사용할 수 있습니까?
구성 파일을 파싱 한 후 및 공유 메모리를 만든 후 실제 요청 처리를하기 전에 어딘가에 있어야합니다. 예를 여기를 참조하십시오 ...
공유 메모리를 변경하지 않고 시작시에만 데이터를 읽는 이유는 무엇입니까? 아니면 내가 잘못되어 요청을 처리하는 동안 rbtree가 변경 되었습니까? – VBart
시작과 동시에 파일에서 읽은 리디렉션 목록과 모든 요청을 일치시켜야합니다. 다시 시작/다시로드 할 때까지 수정이 필요하지 않습니다. 나는 그것을 공유 메모리로 읽는 것이 유일한 선택 일 것이라고 생각했다. 이것을 할 수있는 더 좋은 방법이 있을까? (편집 : 수천 개의 가능한 리디렉션과 같이 목록이 큽니다.) – scb
공유 메모리가 필요하지 않습니다. 구성 단계에서 힙 메모리에서 읽을 수 있으며 conf 구조 (기본, loc 또는 serv는 중요하지 않음)에 포인터를 저장할 수 있습니다. ['fork()'] (http://en.wikipedia.org/wiki/Fork_%28operating_system%29)와 ['COW'] (http://en.wikipedia.org/wiki/Copy - 쓰지 않는다). Nginx는 구성을 읽고 초기화 한 후에 많은 작업자 프로세스를 포크합니다. – VBart