nginx 의 master 와 worker 프로 세 스 간 의 통신

2584 단어 nginx
본 고 는 주로 master 프로 세 스 와 worker 프로 세 스 간 에 채널 을 어떻게 사용 하여 통신 을 완성 하 는 지 분석 하고 자 한다.이 부분 에서 실 현 된 코드 는 주로 src / os / unix / ngx 에 분포 한다channel. c 파일 중.master 프로 세 스 는 워 커 프로 세 스에 데 이 터 를 전송 합 니 다. socketpair 로 만 든 채널 채널 [0] 은 워 커 프로 세 스에 명령 을 보 내 워 커 프로 세 스 가 무엇 을 해 야 하 는 지 알려 줍 니 다.워 커 프로 세 스 는 master 프로 세 스 가 무엇 을 하 는 지 알려 줄 필요 가 없습니다. 단 방향 채널 입 니 다.
master 프로 세 스 가 워 커 프로 세 스에 보 낼 때마다 다음 과 같은 구조 로 패 키 징 을 완성 합 니 다.
typedef struct {
     ngx_uint_t  command;
     ngx_pid_t   pid;
     ngx_int_t   slot;
     ngx_fd_t    fd;
} ngx_channel_t;
네 명의 구성원 은 각각 명령, worker 프로 세 스 의 pid, worker 프로 세 스 의 slot (ngx processes 배열 의 아래 표 시 됨), 파일 설명 자 를 표시 합 니 다.
worker 프로 세 스 는 이 구조 데 이 터 를 받 은 후 command 를 판단 하여 해당 하 는 동작 을 합 니 다.
master 프로 세 스 는 SIGCHLD 신 호 를 처리 하 는 함수 ngxreap_children 에 서 는 워 커 프로 세 스에 채널 을 닫 는 명령 을 보 냅 니 다.
worker 프로 세 스 가 ngx 를 호출 하고 있 습 니 다.worker_process_init 함수 시, ngxadd_channel_이 벤트 는 채널 을 epoll 이벤트 처리 모듈 에 넣 습 니 다.
    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,
                              ngx_channel_handler)
        == NGX_ERROR)
    {
        /* fatal */
        exit(2);
    }
master 프로 세 스 가 보 낸 명령 을 받 으 면 ngx 를 호출 합 니 다.channel_handler 처리, ngxchannel_handler 는 주로 뭘 하 죠?
        switch (ch.command) {

        case NGX_CMD_QUIT:
            ngx_quit = 1;
            break;

        case NGX_CMD_TERMINATE:
            ngx_terminate = 1;
            break;

        case NGX_CMD_REOPEN:
            ngx_reopen = 1;
            break;

        case NGX_CMD_OPEN_CHANNEL:

            ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,
                           "get channel s:%i pid:%P fd:%d",
                           ch.slot, ch.pid, ch.fd);

            ngx_processes[ch.slot].pid = ch.pid;
            ngx_processes[ch.slot].channel[0] = ch.fd;
            break;

        case NGX_CMD_CLOSE_CHANNEL:

            ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,
                           "close channel s:%i pid:%P our:%P fd:%d",
                           ch.slot, ch.pid, ngx_processes[ch.slot].pid,
                           ngx_processes[ch.slot].channel[0]);

            if (close(ngx_processes[ch.slot].channel[0]) == -1) {
                ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
                              "close() channel failed");
            }

            ngx_processes[ch.slot].channel[0] = -1;
            break;
        }

받 은 명령 유형 에 따라 상응하는 동작 을 취한 다.
전체 통신 의 과정 은 이렇다.

좋은 웹페이지 즐겨찾기