nginx 프로 세 스 관리의 master 프로 세 스

4570 단어
nginx 는 single 과 master 두 가지 프로 세 스 모델 로 나 뉜 다.master 모델 은 master 모델 과 n 개의 worker 프로 세 스 의 작업 방식 입 니 다.본 고 는 nginx 의 master 프로 세 스 가 어떤 일 을 했 는 지, 각 worker 프로 세 스 를 어떻게 잘 관리 하 는 지 분석 하고 자 합 니 다.
main 함수 에서 nginx 시작 초기 화 과정 을 완 성 했 습 니 다. 시작 초기 화 과정 에서 중요 한 부분 은 설정 파일 을 분석 하고 각 설정 명령 의 리 셋 함 수 를 리 셋 하 는 것 입 니 다. 따라서 각 모듈 의 설정 이 서로 연결 되 었 습 니 다.초기 화 완료 후 ngx 호출master_process_cycle, 이 함수 가 구체 적 으로 무슨 일 을 했 는 지.
    sigemptyset(&set);
    sigaddset(&set, SIGCHLD);
    sigaddset(&set, SIGALRM);
    sigaddset(&set, SIGIO);
    sigaddset(&set, SIGINT);
    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));

    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                      "sigprocmask() failed");
    }
워 커 프로 세 스 를 만 들 때 방 해 받 지 않도록 일련의 신 호 를 차단 합 니 다.
    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

    ngx_start_worker_processes(cycle, ccf->worker_processes,
                               NGX_PROCESS_RESPAWN);
    ngx_start_cache_manager_processes(cycle, 0);
여기 서 worker 하위 프로 세 스 를 만 들 기 시 작 했 습 니 다. master 프로 세 스 는 이 두 함 수 를 순서대로 호출 하여 하위 프로 세 스 를 만 드 는 것 입 니 다.첫 번 째 호출 함수 가 만 든 하위 프로 세 스 를 worker 프로 세 스 라 고 합 니 다. 두 번 째 호출 함수 가 만 든 것 은 cache 와 관련 된 하위 프로 세 스 입 니 다.요청 을 받 았 습 니 다. 응답 을 마 친 것 은 워 커 프로 세 스 입 니 다.
    for (i = 0; i < n; i++) {

        ngx_spawn_process(cycle, ngx_worker_process_cycle,
                          (void *) (intptr_t) i, "worker process", type);

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

        ngx_pass_open_channel(cycle, &ch);
    }
여 기 는 n 개의 워 커 프로 세 스 를 순환 적 으로 만 드 는 것 입 니 다. fork 새 프로 세 스 의 구체 적 인 작업 은 ngx 에 있 습 니 다.spawn_process 함수 에서 완성 되 었 습 니 다.전역 배열 ngxprocesses (src / os / unix / ngx process. c), 배열 의 길 이 는 NGXMAX_PROCESSES (기본 값 1024), 저 장 된 요소 유형 은 ngxprocess_t (src / os / uninx / ngx process. h 파일).전역 배열 ngxprocesses 는 pid, channel, 프로 세 스 가 구체 적 인 일 을 하 는 인터페이스 포인터 등 모든 하위 프로 세 스 의 관련 정 보 를 저장 하 는 데 사 용 됩 니 다. 이러한 정 보 는 구조 체 ngx 입 니 다.process_t 로 묘 사 했 어 요.재 ngxspawn_process 가 worker 프로 세 스 를 만 들 고 돌아 오 면 master 프로 세 스 는 worker 프로 세 스 의 pid, worker 프로 세 스 를 ngx 에 있 습 니 다.processes 배열 의 위치 및 channel [0] 은 앞에서 만 든 워 커 프로 세 스 에 전달 하고 다음 워 커 프로 세 스 를 반복 적 으로 만 듭 니 다.channel 은 socketpair 로 만 들 어 졌 으 며 프로 세 스 간 통신 에 사 용 됩 니 다.master 와 worker 프로 세 스, worker 프로 세 스 간 에 이러한 채널 을 통 해 통신 할 수 있 습 니 다.
ngx_start_cache_manager_processes 함수 와 start워 커 의 업무 와 관련 이 별로 없다.이 어 master 프로 세 스 는 순환 에 빠 져 워 커 프로 세 스 를 지 키 고 있 습 니 다.master 에서cycle 에서 siguspend 를 호출 했 기 때문에 master 프로 세 스 가 걸 려 서 신호 가 발생 하 기 를 기다 리 고 있 습 니 다 (신 호 를 받 고 신호 처리 함 수 를 호출 하여 해당 하 는 전역 변 수 를 설정 하고 siguspend 함수 가 되 돌아 오 며 전역 변 수 를 판단 하고 해당 하 는 동작 을 취 합 니 다)
        if (ngx_quit) {
            ngx_signal_worker_processes(cycle,
                                        ngx_signal_value(NGX_SHUTDOWN_SIGNAL));

            ls = cycle->listening.elts;
            for (n = 0; n < cycle->listening.nelts; n++) {
                if (ngx_close_socket(ls[n].fd) == -1) {
                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
                                  ngx_close_socket_n " %V failed",
                                  &ls[n].addr_text);
                }
            }
            cycle->listening.nelts = 0;

            continue;
        }
SIGQUIT 신호 에 대한 처리 동작.호출 ngxsignal_worker_processes 함 수 는 모든 워 커 프로 세 스에 SIGQUIT 신 호 를 보 내 워 커 프로 세 스 가 작업 을 종료 하 라 고 알 리 고 모든 감청 소켓 을 닫 습 니 다.contine 을 사용 하 는 것 은 하위 프로 세 스 를 위해 SIGCHLD 신 호 를 master 프로 세 스에 보 내 고 master 프로 세 스 를 뒷수습 하도록 하 는 것 입 니 다. 
        if (ngx_reap) {
            ngx_reap = 0;
            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");

            live = ngx_reap_children(cycle);
        }
이때, ngxreap 1, master 프로 세 스 호출 ngxreap_children 은 모든 워 커 프로 세 스 를 처리 합 니 다.
master 프로 세 스 는 여기까지 입 니 다.

좋은 웹페이지 즐겨찾기