nginx 소스 코드 (4) 메 인 프로 세 스

8060 단어 소스 코드nginx
윗글 을 잇다.
nginx 는 단일 프로 세 스 로 console 에서 실 행 됩 니 다. core / nginx. c 의 main 방법 을 읽 습 니 다. 앞 에는 모두 초기 화 된 코드 입 니 다. 자세히 보지 않 으 면 섬세 한 반지 에 빠 지기 쉽 습 니 다.직접 ngx 찾기single_process_cycle 의 정의, os / unix / ngxprocess_cycle. c 중.
첫 번 째 for 순환 에 다음 코드 를 추가 합 니 다:
    for (i = 0; ngx_modules[i]; i++) {
        char * p = NULL;
        if (ngx_modules[i]->commands != NULL)
        {
            p = ngx_modules[i]->commands->name.data;
        }
        if (ngx_modules[i]->init_process) {
            if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
                /* fatal */
                exit(2);
            }
            printf("[ngx_process_cycle] module ctx_index=%d index=%d name=%s init process
"
, ngx_modules[i]->ctx_index, ngx_modules[i]->index, p); } else { printf("[ngx_process_cycle] module ctx_index=%d index=%d name=%s
"
, ngx_modules[i]->ctx_index, ngx_modules[i]->index, p); } } printf("[ngx_process_cycle] for ngx_modules init done
"
);

현재 nginx 에 어떤 모듈 과 관련 된 색인, 이름 을 인쇄 하 는 역할 을 합 니 다.
두 번 째 for 순환 에서 주로 ngxprocess_이벤트 방법 을 찾 아 보 니 이것 은 매크로 이 고 이 매크로 는 또 하나의 전역 변수 입 니 다. 우리 가 불 러 온 epoll 모듈 이기 때문에 이벤트 / modules / ngxepoll_module. c 에서 코드 찾기:
ngx_event_actions = ngx_epoll_module_ctx.actions;

ngx 발견process_이벤트 방법 은 사실 ngxepoll_module_ctx 모듈 의 actions 중의 ngxepoll_process_이벤트 방법.이 방법 에서 epoll 찾기wait 방법 이 호출 된 곳 에 다음 코드 를 추가 합 니 다.
    printf("[ngx_epoll_module] epoll wait
"
); events = epoll_wait(ep, event_list, nevents, timer); printf("[ngx_epoll_module] epoll wait ---
"
);

실행 결과 다시 만 들 기:
[main] to start ngx_single_process_cycle [ngx_process_cycle] module ctx_index=0 index=0 name=daemon [ngx_process_cycle] module ctx_index=0 index=1 name=error_log [ngx_process_cycle] module ctx_index=0 index=2 name=include [ngx_process_cycle] module ctx_index=0 index=3 name=events [ngx_process_cycle] module ctx_index=0 index=4 name=connections init process [ngx_process_cycle] module ctx_index=1 index=5 name=rtsig_signo [ngx_process_cycle] module ctx_index=2 index=6 name=epoll_events [ngx_process_cycle] module ctx_index=0 index=7 name=http [ngx_process_cycle] module ctx_index=0 index=8 name=server [ngx_process_cycle] module ctx_index=1 index=9 name=log_format [ngx_process_cycle] module ctx_index=2 index=10 name=(null) [ngx_process_cycle] module ctx_index=3 index=11 name=index [ngx_process_cycle] module ctx_index=4 index=12 name=allow [ngx_process_cycle] module ctx_index=5 index=13 name=rewrite [ngx_process_cycle] module ctx_index=6 index=14 name=proxy_pass [ngx_process_cycle] module ctx_index=7 index=15 name=(null) [ngx_process_cycle] module ctx_index=8 index=16 name=(null) [ngx_process_cycle] module ctx_index=9 index=17 name=(null) [ngx_process_cycle] module ctx_index=10 index=18 name=(null) [ngx_process_cycle] module ctx_index=11 index=19 name=gzip [ngx_process_cycle] module ctx_index=12 index=20 name=charset_map [ngx_process_cycle] module ctx_index=13 index=21 name=userid [ngx_process_cycle] module ctx_index=14 index=22 name=expires [ngx_process_cycle] module ctx_index=15 index=23 name=output_buffers [ngx_process_cycle] module ctx_index=16 index=24 name=(null) [ngx_process_cycle] module ctx_index=17 index=25 name=(null) [ngx_process_cycle] for ngx_modules init done [ngx_epoll_module] epoll wait ^C[ngx_epoll_module] epoll wait —
총 25 개의 모듈 이 발견 되 었 습 니 다. connections 모듈 만 init 가 있 습 니 다.process 방법, 그리고 일부 모듈 name 이 비어 있 습 니 다.마지막 프로그램 이 epoll 모듈 에 들 어가 서 epoll 에 막 혔 습 니 다.wait 호출 처, CTRL + C 가 출시 된 후에 야 뒤의 인쇄 문 구 를 실 행 했 습 니 다.
여기 서 nginx 가 모듈 에 대한 정 의 를 자세히 볼 수 있 습 니 다. 코드 를 볼 때 nginx 에서 실제 사용 하 는 유형 이 인 것 을 쉽게 발견 할 수 있 습 니 다.t 엔 딩, 이 유형 이 정 의 될 때 구조 체 라면 실제 유형 은s 엔 딩, nginxmodule_s 의 정 의 는 코어 / ngxconf_file. h 파일 중:
struct ngx_module_s {
    ngx_uint_t       ctx_index;
    ngx_uint_t       index;
    void            *ctx;
    ngx_command_t   *commands;
    ngx_uint_t       type;
    ngx_int_t      (*init_module)(ngx_cycle_t *cycle);
    ngx_int_t      (*init_process)(ngx_cycle_t *cycle);
#if 0
    ngx_int_t      (*init_thread)(ngx_cycle_t *cycle);
#endif
};

그 중 에는 두 개의 색인 번호 가 있 고 명령 과 세 개의 함수 가 있 으 며 구체 적 으로 어떤 의 미 를 가지 고 있 는 지 나중에 다시 보 자.
그리고 또 다른 두 개의 구조 체 ngxevent_module_t 와 ngxevent_actions_t; 후 자 는 전자의 구성원 이다.전 자 는 nginx 이벤트 모듈 이지 만 추상 적 으로 특정한 플랫폼 에 서로 다른 유형 이 있 을 수 있 습 니 다. 여 기 는 epoll 입 니 다.ngx_event_module_t 는 다음 과 같다.
typedef struct {
    ngx_str_t              *name;

    void                 *(*create_conf)(ngx_cycle_t *cycle);
    char                 *(*init_conf)(ngx_cycle_t *cycle, void *conf);

    ngx_event_actions_t     actions;
} ngx_event_module_t;

epoll 인 스 턴 스 는 다음 과 같 습 니 다.
ngx_event_module_t  ngx_epoll_module_ctx = {
    &epoll_name,
    ngx_epoll_create_conf,               /* create configuration */
    ngx_epoll_init_conf,                 /* init configuration */

    {
        ngx_epoll_add_event,             /* add an event */
        ngx_epoll_del_event,             /* delete an event */
        ngx_epoll_add_event,             /* enable an event */
        ngx_epoll_del_event,             /* disable an event */
        ngx_epoll_add_connection,        /* add an connection */
        ngx_epoll_del_connection,        /* delete an connection */
        NULL,                            /* process the changes */
        ngx_epoll_process_events,        /* process the events */
        ngx_epoll_init,                  /* init the events */
        ngx_epoll_done,                  /* done the events */
    }
};

마침 ngxevent_module_t 중의 actions 멤버 는 ngxepoll_module_ctx 에 서 는 epoll 과 관련 된 함수 로 정의 되 며, 앞의 ngxprocess_이벤트 는 아래 두 줄 코드 로 연결 되 어 있 습 니 다: 이벤트 / ngx이벤트
#define ngx_process_events ngx_event_actions.process_events

event/modules/ngx_epoll_module. c 중
 ngx_event_actions = ngx_epoll_module_ctx.actions;

ngx_event_actions 는 전역 변수 로 이벤트 / ngx 에 정의 합 니 다.이벤트. c 중:
ngx_event_actions_t               ngx_event_actions;

다음은 epoll 이 nginx 에서 사용 하 는 것 을 보 겠 습 니 다.
to be continued …

좋은 웹페이지 즐겨찾기