nginx 학습 노트 4 (nginx 시작 할 때의 master 와 worker 프로 세 스)

3964 단어 nginx 학습
nginx 는 일반적으로 하나의 다 중 프로 세 스 로 설 정 된 프로그램 으로 하나의 master 프로 세 스 와 여러 개의 worker 프로 세 스 로 구성 되 어 있 으 며, master 프로 세 스 는 신 호 를 통 해 worker 프로 세 스 의 운행 상 태 를 관리 합 니 다.다음은 코드 의 측면 에서 master 와 worker 프로 세 스 의 시작 상황 을 분석 합 니 다.
1. main 함수 마지막 에 설정 방식 에 따라 nginx 의 시작 형식 (단일 프로 세 스 또는 다 중 프로 세 스) 을 결정 합 니 다.
if (ngx_process == NGX_PROCESS_SINGLE) {
        ngx_single_process_cycle(cycle);

    } else {
        ngx_master_process_cycle(cycle);
    }

2. 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");
    }

    sigemptyset(&set);
이 코드 는 일부 신 호 를 막 았 습 니 다. 이런 방식 을 통 해 뒤에 워 커 서브 프로 세 스 를 생 성 하 는 등 프로그램 이 신호 중단 의 영향 을 받 지 않도록 할 수 있 습 니 다.
3.ngx_master_process_cycle 에서 fork 를 이용 하여 woker 서브 프로 세 스 를 생 성 합 니 다.
 ngx_start_worker_processes(cycle, ccf->worker_processes,
                               NGX_PROCESS_RESPAWN);

-------》
 ngx_spawn_process(cycle, ngx_worker_process_cycle,
                          (void *) (intptr_t) i, "worker process", type);
--------》
 pid = fork();

    switch (pid) {

    case -1:
        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                      "fork() failed while spawning \"%s\"", name);
        ngx_close_channel(ngx_processes[s].channel, cycle->log);
        return NGX_INVALID_PID;

    case 0:
        ngx_pid = ngx_getpid();
        proc(cycle, data);
        break;

    default:
        break;
    }
fork () 에서 나 온 하위 프로 세 스 는 proc (cycle, data) 를 호출 한 다음 해당 하 는 ngxworker_process_cycle 에서 사 순환 에 들어가다.주 프로 세 스 는 switch 에서 뛰 어 나 와 후속 작업 을 수행 합 니 다.
4. 메 인 프로 세 스 가 발생 할 수 있 는 여러 가지 신호 에 대응 하기 위해 사 순환 에 들 어 갑 니 다.
for ( ;; ) {
        if (delay) {
            if (ngx_sigalrm) {
                sigio = 0;
                delay *= 2;
                ngx_sigalrm = 0;
            }

            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                           "termination cycle: %M", delay);

            itv.it_interval.tv_sec = 0;
            itv.it_interval.tv_usec = 0;
            itv.it_value.tv_sec = delay / 1000;
            itv.it_value.tv_usec = (delay % 1000 ) * 1000;

            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                              "setitimer() failed");
            }
        }

        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");

        sigsuspend(&set);

        ngx_time_update();

        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
                       "wake up, sigio %i", sigio);

        if (ngx_reap) {
            ngx_reap = 0;
            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");

            live = ngx_reap_children(cycle);
        }
............
물론 메 인 프로 세 스 는 상기 프로그램 을 반복 적 으로 실행 하 는 것 이 아니 라 siguspend 호출 을 통 해 master 프로 세 스 를 휴면 시 킨 다음 에 master 프로 세 스 가 신 호 를 받 고 다시 활성화 되 기 를 기다 리 는 것 입 니 다.여기 서 신 호 를 처리 하 는 방식 은 참고 할 만하 다. siguspend 방식 을 이용 하면 CPU 의 작업 효율 을 높 일 수 있다.nginx siguspend nginx siguspend 분석 참조http://weakyon.com/2015/05/14/learning-of-sigsuspend.html

좋은 웹페이지 즐겨찾기