nginx 0 에서 1 까지 모듈 정리

목표.
      nginx 소스 코드 를 보 여 드릴 때 간단 한 안내 입 니 다.이 글 은 nginx 모듈 을 중심 으로 전개 되 었 으 며 모듈 구조 에 대해 대체적으로 알 게 해 주 었 을 뿐 소스 코드 분석 과정 과 관련 되 지 않 았 다.
1, 고도 모듈 화 된 디자인 은 nginx 의 구조 적 기반 으로 nginx 에서 소량의 핵심 코드 를 제외 하고 모든 것 이 모듈 입 니 다.
       고도 추상 적 인 모듈 인터페이스, 모든 모듈 은 같은 ngx 를 따른다.module_t 인터페이스 디자인 규범, 그 도 모든 모듈 의 유 니 버 설 인터페이스 이다.
        보고 있어 ngxmodule_t 구조 체 시 다음 네 멤버 에 게 중점 을 둔다.
* ctx 포인터, type 멤버, ctxindex 멤버, index 멤버
        1) * ctx 지침 은 모든 데 이 터 를 가리 킬 수 있 고 모든 유형의 모듈 을 가리 킬 수 있 습 니 다.
       HTTP 형식의 모듈 에 있어 서 ngxmodule_t 의 ctx 지침 은 ngx 를 가리 켜 야 합 니 다.http_module_t (ngx http config. h) 인터페이스, 예 를 들 어 ngxhttp_core_module.c、ngx_http_header_filter_module.c、ngx_http_realip_module. c 등.
        EVENT 유형의 모듈 에 있어 서 ngxmodule_t 의 ctx 지침 은 ngx 를 가리 켜 야 합 니 다.event_module_t 인터페이스, 예: ngxepoll_module.c、ngx_poll_module.c、ngx_select_module. c 등.
        MAIL 유형의 모듈 에 대해 말하자면, ngxmodule_t 의 ctx 지침 은 ngx 를 가리 켜 야 합 니 다.mail_module_t 인터페이스, 예: ngxmail_auth_http_module.c、ngx_mail_core_module.c,ngx_mail_pop3_module. c 등.
        핵심 모듈 에 대해 ngxmodule_t 중 ctx 포인터 가 ngx 를 가리 키 고 있 습 니 다.core_module_t 인터페이스, 예 를 들 어 ngix. c (ngx core module), ngxlog.c(ngx_errlog_module)、ngx_event.c (ngx_events_module)、ngx_event_openssl.c(ngx_openssl_module)、ngx_http.c(ngx_http_module)、ngx_mail. c (ngx mail module) 는 현재 공식 적 인 6 대 핵심 유형 모듈 입 니 다.그리고 비교적 특수 한 설정 유형 모듈 ngxconf_file. c 는 유일 하 게 1 개의 모듈 만 있 는 모듈 형식 입 니 다.
        2) type 구성원, 현재 모듈 을 그 유형의 모듈 로 정의 합 니 다.
          NGXHTTP_MODULE、NGX_EVENT_MODULE、NGX_MAIL_MODULE、NGX_CORE_MODULE、NGX_CONF_MODULE, 공식 적 으로 이 5 개의 모듈 을 지정 합 니 다.
         3)ctx_index 구성원 은 현재 모듈 이 같은 모듈 에 있 는 번 호 를 표시 합 니 다.처리 요청 순서 이기 도 합 니 다.
        이 구성원 은 항상 이러한 모듈 을 관리 하 는 핵심 모듈 설정 이 있다.예: HTTP 모듈, ctxindex 는 핵심 모듈 ngxhttp. c (ngx http module) 가 설정 한 것 으로 관심 이 있 는 학생 은 147 줄 코드 를 참고 할 수 있 습 니 다.ngx_event.c (ngx_events_module),ngx_mail. c (ngx mail module) 이 모듈 들 은 같 습 니 다.nginx.c(ngx_core_module)、ngx_log.c(ngx_errlog_module)、ngx_event_openssl. c (ngx openssl module) 이 세 모듈 의 수량 이 고정 되 어 있 으 며 동적 으로 지정 할 필요 가 없습니다.
         4) index 멤버, 현재 모듈 은 ngxmodules 배열 의 번 호 는 모든 모듈 의 번호 라 도.
        관심 있 는 학생 은 ngix. c 의 main (int argc, char * const * argv) 방법 263 줄 을 볼 수 있 습 니 다.
2. nginx 모듈 개발 에서 대부분 http 모듈 입 니 다. http 모듈 의 구조 체 ngx 를 살 펴 보 겠 습 니 다.http_module_t 
       HTTP 프레임 워 크 는 설정 을 읽 고 다시 불 러 올 때 ngx 를 정의 합 니 다.http_module_t, 이 구조 체 는 현재 HTTP 모듈 시작 과정의 8 단계 에 대응
typedef struct {
//         
    ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);
//            
    ngx_int_t   (*postconfiguration)(ngx_conf_t *cf);
//         main         。(       http{...})
    void       *(*create_main_conf)(ngx_conf_t *cf);
//   main     
    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);
//         srv       。(       server{...})
    void       *(*create_srv_conf)(ngx_conf_t *cf);
//  main   srv      
    char       *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
//         loc       。(   location{...})
    void       *(*create_loc_conf)(ngx_conf_t *cf);
//  srv   loc      
    char       *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

3. commands 배열 은 모듈 의 설정 파일 인 자 를 정의 하 는 데 사 용 됩 니 다. 모든 배열 요 소 는 ngx 입 니 다.command_t 형식
struct ngx_command_s {
//     ,   nginx.conf       。  :gzip  upstream
    ngx_str_t             name;
//     ,     :1,             (http server location ),2,         ,3,       。 “|”  。
    ngx_uint_t            type;
//          。         ,      。
//cf:                               。
//cmd:          ngx_command_t  。
//conf:                 
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
//              ,  http     http           ,   main, server location        ,             ,       。        NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET NGX_HTTP_LOC_CONF_OFFSET。         0,  NGX_HTTP_MAIN_CONF_OFFSET。
    ngx_uint_t            conf;
//              ,                  。           ,                。              A,                b  。           offsetof(A, b)。       ,                         ,       0。    nginx         ,     offset
    ngx_uint_t            offset;
//     ,    ,       0  
    void                 *post;
};

type 매개 변수 사전 테이블:
    첫 번 째 역할:
    NGX_DIRECT_CONF: 설정 파일 의 가장 바깥쪽 에 나타 날 수 있 습 니 다.예 를 들 어 이미 제 공 된 설정 명령 어 daemon, masterprocess 등.
    NGX_MAIN_CONF: http、mail、events、error_로그 등.
    NGX_ANY_CONF: 이 설정 명령 은 임의의 설정 단계 에 나타 날 수 있 습 니 다.
    우리 가 작성 한 대부분의 모듈 에 있어 http 와 관련 된 일 을 처리 하고 있 습 니 다. 즉, NGX 라 는 것 입 니 다.HTTP_MODULE, 이러한 유형의 모듈 에 대해 그 설정 이 나타 날 수 있 는 위치 도 http 에 직접 나타 나 고 다른 위치 로 나 뉜 다.
    NGX_HTTP_MAIN_CONF: http 설정 명령 에 직접 나타 날 수 있 습 니 다.
    NGX_HTTP_SRV_CONF: http 에 있 는 server 설정 명령 에 나타 날 수 있 습 니 다.
    NGX_HTTP_LOC_CONF: http server 블록 에 있 는 location 설정 명령 에 나타 날 수 있 습 니 다.
    NGX_HTTP_UPS_CONF: http 에 있 는 upstream 설정 명령 에 나타 날 수 있 습 니 다.
    NGX_HTTP_SIF_CONF: http 에 있 는 server 설정 명령 에 있 는 if 문장 이 있 는 block 에 나타 날 수 있 습 니 다.
    NGX_HTTP_LMT_CONF: http 에 나타 날 수 있 는 limitexcept 명령 의 block 중.
    NGX_HTTP_LIF_CONF: http server 블록 에 있 는 location 설정 명령 에 있 는 if 구문 이 있 는 block 에 나타 날 수 있 습 니 다.
    두 번 째 역할:
    NGX_CONF_NOARGS: 설정 명령 은 인 자 를 받 아들 이지 않 습 니 다.
    NGX_CONF_TAKE 1: 설정 명령 은 1 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 2: 명령 을 설정 하여 두 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 3: 설정 명령 은 3 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 4: 명령 을 설정 하여 4 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 5: 명령 을 설정 하여 5 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 6: 명령 을 설정 하여 6 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 7: 명령 을 설정 하여 7 개의 인 자 를 받 습 니 다.
    여러 개의 속성 을 조합 할 수 있 습 니 다. 예 를 들 어 하나의 명령 은 파 라 메 터 를 채 우지 않 아 도 되 고 1 개 또는 2 개의 파 라 메 터 를 받 아들 일 수 있 습 니 다.그럼 NGXCONF_NOARGS|NGX_CONF_TAKE1|NGX_CONF_TAKE2。위 에 세 개의 속성 이 함께 쓰 여 있 으 면 귀 찮 습 니 다. 괜 찮 습 니 다. nginx 는 정 의 를 제 공 했 고 사용 하기에 더욱 간결 합 니 다.
    NGX_CONF_TAKE 12: 설정 명령 은 1 개 또는 2 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 13: 설정 명령 은 1 개 또는 3 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 23: 명령 을 설정 하여 2 개 또는 3 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 123: 설정 명령 은 1 개 또는 2 개 또는 3 개의 인 자 를 받 습 니 다.
    NGX_CONF_TAKE 1234: 설정 명령 은 1 개 또는 2 개 또는 3 개 또는 4 개의 인 자 를 받 습 니 다.
    세 번 째 역할:
    NGX_CONF_1more: 최소한 하나의 인 자 를 받 아들 일 수 있 도록 명령 을 설정 합 니 다.
    NGX_CONF_2MORE: 설정 명령 은 최소 두 개의 인 자 를 받 아들 입 니 다.
    NGX_CONF_MULTI: 설정 명령 은 개수 가 정 해 지지 않 은 여러 개의 인 자 를 받 아들 일 수 있 습 니 다.
    NGX_CONF_BLOCK: 설정 명령 이 받 아들 일 수 있 는 값 은 설정 정보 블록 입 니 다.한 쌍 의 대괄호 로 묶 은 내용 이다.안에 많은 배치 명령 을 포함 할 수 있다.예 를 들 어 흔히 볼 수 있 는 server 명령 이 바로 이 속성 입 니 다.
    NGX_CONF_FLAG: 설정 명령 이 받 아들 일 수 있 는 값 은 "on" 또는 "off" 입 니 다. 마지막 으로 bool 값 으로 전 환 됩 니 다.
    NGX_CONF_ANY: 명령 이 받 아들 일 수 있 는 임의의 매개 변수 값 을 설정 합 니 다.하나 이상, 또는 "on" 또는 "off" 또는 설정 블록.
 *(* set) (ngx conf t * cf, ngx command t * cmd, void * conf) 미리 설정 한 리 셋 방법:
    ngx_conf_set_flag_slot: NGX 읽 기CONF_FLAG 형식의 인자 입 니 다.
    ngx_conf_set_str_slot: 문자열 형식의 인 자 를 읽 습 니 다.
    ngx_conf_set_str_array_slot: 문자열 배열 형식의 인 자 를 읽 습 니 다.
    ngx_conf_set_keyval_slot: 키 값 이 형식 에 대한 인 자 를 읽 습 니 다.
    ngx_conf_set_num_slot: 정수 형식 (기호 정수 ngx int t 가 있 음) 의 인 자 를 읽 습 니 다.
    ngx_conf_set_size_slot: size 읽 기t 형식의 매개 변 수 는 기호 가 없 는 것 입 니 다.
    ngx_conf_set_off_slot: 읽 기 offt 형식의 인자.
    ngx_conf_set_msec_slot: 밀리초 값 형식의 인 자 를 읽 습 니 다.
    ngx_conf_set_sec_slot: 초 값 형식의 인 자 를 읽 습 니 다.
    ngx_conf_set_bufs_slot: 읽 는 매개 변수 값 은 2 개, 하 나 는 buf 의 개수, 하 나 는 buf 의 크기 입 니 다.outputbuffers 1 128k;
    ngx_conf_set_enum_slot: 매 거 진 형식의 인 자 를 읽 고 정수 ngx 로 변환 합 니 다.uint_t 타 입.
    ngx_conf_set_bitmask_slot: 매개 변수의 값 을 읽 고 이 매개 변수의 값 을 bit 비트 비트 로 저장 합 니 다.예 를 들 어 HttpDavModule 모듈 의 davmethods 명령.
4, HTTP 요청 의 11 단계
    nginx 모듈 디자인 은 모든 HTTP 모듈 이 자신 이 수행 한 작업 에 만 집중 하도록 합 니 다.하나의 HTTP 요청 은 수많은 HTTP 모듈 이 공동으로 작업 해 야 할 수도 있 습 니 다.각 모듈 은 언제 처리 요청 에 개입 합 니까? 그 모듈 앞, 그 모듈 뒤에 있 습 니 다.이 때 nginx 는 HTTP 의 전체 요청 을 우선 순위 로 나 누 어야 합 니 다.이 는 HTTP 처리 의 11 단계 가 있 는데 이 11 단 계 는 시스템 모듈 단계 와 사용자 개발 모듈 처리 단 계 를 포함한다.시스템 의 안정성 을 방지 하기 위해 nginx 가 제3자 모듈 의 개입 을 지원 하 는 것 은 7 단계 에 불과 하 다.
아래 정 의 된 11 단계 에는 순서 가 있 고 일정 시 정 의 된 순서에 따라 실 행 됩 니 다.
typedef enum {
       //1)HTTP      TCP       HTTP     。
    NGX_HTTP_POST_READ_PHASE = 0,
        //2)Server        
    NGX_HTTP_SERVER_REWRITE_PHASE,
        //3)       (            )
    NGX_HTTP_FIND_CONFIG_PHASE,
        //4) location        
    NGX_HTTP_REWRITE_PHASE,
        //5)          (            )
    NGX_HTTP_POST_REWRITE_PHASE,
        //6)          
    NGX_HTTP_PREACCESS_PHASE,
        //7)        
    NGX_HTTP_ACCESS_PHASE,
        //8)          (            )
    NGX_HTTP_POST_ACCESS_PHASE,
        //9)   try_files    (            )
    NGX_HTTP_TRY_FILES_PHASE,
        //10)       
    NGX_HTTP_CONTENT_PHASE,
        //11)        
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

모듈 handler 의 개입 방식 은 두 가지 가 있 습 니 다.
    1) 전 체 를 향 한 구조 체 ngxhttp_core_main_conf_t 의 phases 배열 에 handler 를 추가 합 니 다.예: ngxhttp_realip_module. c 모듈.이 방법 으로 마 운 트 하 는 동작 은 모듈 컨 텍스트 에서 호출 되 는 post configuration 함수 에서 개 입 된 handler 는 요청 할 때마다 호출 됩 니 다.이 방법 도 모든 단 계 를 동시에 사용한다.
    2) 처리 하고 자 하 는 handler 방법 을 location 관련 ngxhttp_core_loc_conf_t 구조 체 중 handler 지침 중.모든 location 은 이 독립 된 ngx 에 대응 합 니 다.http_core_loc_conf_t。예: ngxhttp_perl_module.c,ngx_http_flv_module. c 등 모듈.이 방법 으로 마 운 트 하 는 동작 은 post configuration 에 있 지 않 아 도 ngxcommand_t 의 어떤 설정 항목 의 리 셋 방법 에 처리 방법 을 추가 합 니 다.만약 두 가지 방법 이 동시에 리 셋 방법 에 설치 된다 면 첫 번 째 방법 은 복 개 될 것 이다.하나의 location 에 여러 모듈 이 있 으 면 앞의 모듈 에 설 치 된 handler 가 덮어 씁 니 다.이 방법 은 NGX 에 만 사 용 됩 니 다.HTTP_CONTENT_PHASE 단계 이 며 지정 한 location 에 만 적 용 됩 니 다.일반적으로 우리 가 정의 한 모듈 은 NGX 에 마 운 트 합 니 다.HTTP_CONTENT_PHASE 단계 의.

좋은 웹페이지 즐겨찾기