Nginx 프로젝트 ngxmodule_t 인터페이스 학습

8530 단어 nginxngx_module_t
nginx 에서 기능 모듈 추상 인터페이스 (Interface), nginx 프로젝트 에 가입 할 모든 기능 모듈 은 이 인 터 페 이 스 를 실현 해 야 합 니 다. 이 인 터 페 이 스 를 실현 하 는 모듈 인 스 턴 스 는 전체 배열 ngx 로 초기 화 됩 니 다.modules [] 에서 이 배열 은 프로젝트 컴 파일 시 생 성 됩 니 다.
typedef struct ngx_module_s      ngx_module_t;
인터페이스 정의:
struct ngx_module_s {
    ngx_uint_t            ctx_index;
    ngx_uint_t            index;    

    ngx_uint_t            spare0;
    ngx_uint_t            spare1;
    ngx_uint_t            spare2;
    ngx_uint_t            spare3;

    ngx_uint_t            version;

    void                 *ctx;  
    ngx_command_t        *commands; 
    ngx_uint_t            type;

    ngx_int_t           (*init_master)(ngx_log_t *log);

    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);

    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);
    void                (*exit_thread)(ngx_cycle_t *cycle);
    void                (*exit_process)(ngx_cycle_t *cycle);

    void                (*exit_master)(ngx_cycle_t *cycle);

    uintptr_t             spare_hook0;
    uintptr_t             spare_hook1;
    uintptr_t             spare_hook2;
    uintptr_t             spare_hook3;
    uintptr_t             spare_hook4;
    uintptr_t             spare_hook5;
    uintptr_t             spare_hook6;
    uintptr_t             spare_hook7;
};
몇 가지 중요 한 매개 변수 설명:
index: 이 모듈 의 매개 변수 설정 구조 정 보 는 ngx 에 있 습 니 다.cycle_t 의 매개 변수 설정 구조 포인터 목록 confctx 의 색인.
ctx: 실현 ngxmodule_t 인터페이스의 구체 적 인 기능 모듈 인 스 턴 스 에 대응 하 는 개인 설정 매개 변수 (생 성 및 초기 화) 의 인터페이스 포인터, 구체 적 인 모듈 은 자신의 매개 변수 생 성 및 분석 을 구체 적 으로 실현 합 니 다.
commands: 구체 적 인 기능 모듈 설정 매개 변 수 는 Nginx 가 파일 에서 파 라 메 터 를 읽 는 방법 을 실 현 했 습 니 다. 마지막 으로 읽 은 매개 변 수 는 어떤 의미 와 해당 하 는 값 을 어떻게 해석 하 는 지 인터페이스 포인터 commands (형식 은 ngx command t) 에서 구체 적 으로 실현 합 니 다.
type: 이 모듈 인 스 턴 스 의 유형 표지, ngxmodules [] 배열 에서 구체 적 인 모듈 을 조회 할 때 사용 합 니 다.
다음은 Nginx 의 핵심 모듈 ngxcore_module 이 인터페이스의 예제 구현:
전역 변수 ngxcore_module 대 ngxmodule_t 인터페이스의 실현:
ngx_module_t  ngx_core_module = {
    NGX_MODULE_V1,
    &ngx_core_module_ctx,                  /* module context */
    ngx_core_commands,                     /* module directives */
    NGX_CORE_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
};

그 속
ngx_core_모듈 멤버
ctx 의 값 ngxcore_module_ctx 의 유형 정의 및 구현 은 다음 과 같 습 니 다.
typedef struct {
    ngx_str_t             name;
    void               *(*create_conf)(ngx_cycle_t *cycle);
    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);
} ngx_core_module_t;
static ngx_core_module_t  ngx_core_module_ctx = {
    ngx_string("core"),
    ngx_core_module_create_conf,
    ngx_core_module_init_conf
};

ngx_core_module 모듈 은 위의 두 인터페이스 ngx 를 호출 합 니 다.core_module_create_conf&ngx_core_module_init_conf 는 자신의 설정 매개 변 수 를 가 져 오고 자신의 설정 매개 변수 구 조 를 초기 화 합 니 다 ngxcore_conf_t.
ngx_core_conf_t 매개 변수 구 조 는 다음 과 같이 정의 합 니 다 (구체 적 으로 대응 하 는 설정 파일 의 값).
typedef struct {
     ngx_flag_t               daemon;
     ngx_flag_t               master;

     ngx_msec_t               timer_resolution;

     ngx_int_t                worker_processes;
     ngx_int_t                debug_points;

     ngx_int_t                rlimit_nofile;
     ngx_int_t                rlimit_sigpending;
     off_t                    rlimit_core;

     int                      priority;

     ngx_uint_t               cpu_affinity_n;
     uint64_t                *cpu_affinity;

     char                    *username;
     ngx_uid_t                user;
     ngx_gid_t                group;

     ngx_str_t                working_directory;
     ngx_str_t                lock_file;

     ngx_str_t                pid;
     ngx_str_t                oldpid;

     ngx_array_t              env;
     char                   **environment;

#if (NGX_THREADS)
     ngx_int_t                worker_threads;
     size_t                   thread_stack_size;
#endif

} ngx_core_conf_t;

그 속
ngx_core_모듈
구성원
commands
의 값 ngxcore_commands 의 실현 은 다음 과 같다.
static ngx_command_t  ngx_core_commands[] = {

    { ngx_string("daemon"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      0,
      offsetof(ngx_core_conf_t, daemon),
      NULL },

    { ngx_string("master_process"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      0,
      offsetof(ngx_core_conf_t, master),
      NULL },

    { ngx_string("timer_resolution"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_msec_slot,
      0,
      offsetof(ngx_core_conf_t, timer_resolution),
      NULL },

    { ngx_string("pid"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_str_slot,
      0,
      offsetof(ngx_core_conf_t, pid),
      NULL },

    { ngx_string("lock_file"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_str_slot,
      0,
      offsetof(ngx_core_conf_t, lock_file),
      NULL },

    { ngx_string("worker_processes"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_set_worker_processes,
      0,
      0,
      NULL },

    { ngx_string("debug_points"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_enum_slot,
      0,
      offsetof(ngx_core_conf_t, debug_points),
      &ngx_debug_points },

    { ngx_string("user"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12,
      ngx_set_user,
      0,
      0,
      NULL },

    { ngx_string("worker_priority"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_set_priority,
      0,
      0,
      NULL },

    { ngx_string("worker_cpu_affinity"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE,
      ngx_set_cpu_affinity,
      0,
      0,
      NULL },

    { ngx_string("worker_rlimit_nofile"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
      offsetof(ngx_core_conf_t, rlimit_nofile),
      NULL },

    { ngx_string("worker_rlimit_core"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_off_slot,
      0,
      offsetof(ngx_core_conf_t, rlimit_core),
      NULL },

    { ngx_string("worker_rlimit_sigpending"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
      offsetof(ngx_core_conf_t, rlimit_sigpending),
      NULL },

    { ngx_string("working_directory"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_str_slot,
      0,
      offsetof(ngx_core_conf_t, working_directory),
      NULL },

    { ngx_string("env"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_set_env,
      0,
      0,
      NULL },

#if (NGX_THREADS)

    { ngx_string("worker_threads"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      0,
      offsetof(ngx_core_conf_t, worker_threads),
      NULL },

    { ngx_string("thread_stack_size"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_size_slot,
      0,
      offsetof(ngx_core_conf_t, thread_stack_size),
      NULL },

#endif

      ngx_null_command
};
즉, 설정 파일 의 매개 변 수 는 하나의 ngx 에 대응 합 니 다.command_s 인 터 페 이 스 를 통 해 값 을 가 져 옵 니 다 (예 를 들 어).
ngx_command_s 구조 정 의 는 다음 과 같다.
struct ngx_command_s {
    ngx_str_t             name;
    ngx_uint_t            type;
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
    ngx_uint_t            conf;
    ngx_uint_t            offset;
    void                 *post;
};
즉 매개 변수 에 하나의 ngx 를 실현 하 는 것 이다.command_s 인 터 페 이 스 를 통 해 구체 적 으로 참조 할 수 있 습 니 다.
ngx_core_commands 의 각 매개 변수 분석 인터페이스 구현.

좋은 웹페이지 즐겨찾기