nginx 다 중 프로 세 스 모델 의 열 코드 부 드 러 운 업그레이드

부 드 러 운 업그레이드 의 주요 과정 은 다음 절 차 를 포함한다.
 
1. 새 코드 make 가 실 행 된 후, 여 기 는 make install 에 있 지 않 습 니 다. 다음 이름 은 / sbin / nginx 입 니 다. nginx. old 입 니 다.
# mv /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.old
 
2. 컴 파일 된 obbs 디 렉 터 리 의 nginx 파일 을 nginx 설치 디 렉 터 리 sbin / 아래로 복사 합 니 다.
# cp objs/nginx /usr/local/nginx/sbin/
 
3. nginx 로 하여 금 nginx. pid 파일 을 nginx. pid. oldbin 으로 수정 하 게 하고 nginx 를 시작 하여 끊 임 없 는 작업 을 실현 합 니 다.
# kill -USR2 `cat/usr/local/nginx/nginx.pid`
# kill -QUIT `cat/usr/local/nginx/nginx.pid.oldbin`
 
물론 정부 에서 더욱 상세 한 과정 이 있 는데 업그레이드 취소, 신 구 코드 동시 보류 등 조작 을 포함한다. 여기 서 우 리 는 주로 상술 한 간단 한 업그레이드 의 실현 을 보 여 준다.
http://wiki.nginx.org/ChsCommandLine
 
여기 서 우 리 는 주로 3 단 계 를 본다.
nginx 에 서 는 USR 2 신 호 를 NGX 로 정의 합 니 다.CHANGEBIN_SIGNAL。
#define NGX_CHANGEBIN_SIGNAL     USR2
그것 의 처리 함 수 는 다른 신호 와 마찬가지 로 ngx 를 사용 합 니 다.signal_handler。이 함 수 는 열 로 딩 을 설정 하 는 글 에서 이미 접 촉 했 습 니 다. kill - USR 2 ` cat / usr / local / nginx / nginx. pid '를 실행 할 때 master 프로 세 스 는 신 호 를 받 을 수 있 습 니 다. pid 파일 에 master 프로 세 스 의 pid 가 기록 되 어 있 기 때 문 입 니 다.
 
// ngx_process                 ,      master process(    master pid     )
switch (ngx_process) {

    case NGX_PROCESS_MASTER:
    case NGX_PROCESS_SINGLE:
        switch (signo) {
	…
        case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):
            /*           ,       ,   ,       
	     * master(  master  ),        old master      ,
             *      USR2  ,      ,      master     
             * master。。。        ,old master        master   
             *  ,      USR2    ,       。。。(        =.=)
             */
            if (getppid() > 1 || ngx_new_binary > 0) {

                /*
                 * Ignore the signal in the new binary if its parent is
                 * not the init process, i.e. the old binary's process
                 * is still running.  Or ignore the signal in the old binary's
                 * process if the new binary's process is already running.
                 */

                action = ", ignoring";
                ignore = 1;
                break;
            }
            //          ,   ngx_change_binary  1,   master
            //             ,    ,master           // 1 ,    nginx        
            ngx_change_binary = 1;
            action = ", changing binary";
            break;		…
       }
}

 
새로운 실례 의 생 성 은 ngxmaster_process_cycle 함수 에서 처리 합 니 다. 이 함 수 는 모두 가 잘 알 고 있 을 것 입 니 다. 주로 for 순환 에서 각종 신호 와 상 태 를 감시 하여 시스템 과 작업 프로 세 스 를 제어 합 니 다.
for ( ;; ) {

    …

    //      ,USR2       ,  ngx_change_binary  1,   master   ,       。

    if(ngx_change_binary) {

        ngx_change_binary = 0;

        ngx_new_binary = ngx_exec_new_binary(cycle,ngx_argv);

    }
    …
}

       함수 ngxexec_new_binary 에서 주요 작업 은 listen 의 fd 를 환경 변수 에 넣 는 것 입 니 다. 형식 은 NGINX = fd1 입 니 다.fd2;fd3... (이 뒤에 말 해!) 그리고 ngix. pid 를 ngix. pid. oldbin 으로 바 꾸 고 마지막 으로 ngxexecute, 사실은 execve 가 새로운 인 스 턴 스 를 시작 하 는 것 입 니 다.
 
       여기 서 언급 해 야 할 부분 이 있 습 니 다. 바로 위 에서 언급 한 listen fd 입 니 다. 환경 변수 에 넣 었 습 니 다. 목적 은 새로운 인 스 턴 스 가 시작 되 는 과정 에서 ngx 를 통 해add_inherited_sockets 는 이전의 listen fd 를 가 져 와 서 다시 사용 합 니 다. 이 유 는 새로운 인 스 턴 스 는 fork + execve 를 통 해 생 성 되 기 때 문 입 니 다. 간단 한 fork 이후 하위 프로 세 스 처럼 이 부모 프로 세 스 의 listen fd 를 직접 가 져 올 수 있 는 것 이 아 닙 니 다.
 
       3 단계 에서 저 희 는 QUIT 신 호 를 보 내 서 오래된 프로 세 스 를 닫 습 니 다.관련 된 절 차 는 다음 과 같다.
//   SIGCHLD,      ( worker   ),  ngx_reap 1,   master   
//          ,       。。。

if (ngx_reap) {

    ngx_reap = 0;

    live = ngx_reap_children(cycle);

}

// live 1         , 0  ,         ,          //   ,     exit   。

if (!live && (ngx_terminate ||ngx_quit)) {

    ngx_master_process_exit(cycle);

}

…

//     QUIT  

if (ngx_quit) {

    //  worker  ,              。

    ngx_signal_worker_processes(cycle,ngx_signal_value(NGX_SHUTDOWN_SIGNAL));

    //          listenfd,      。
    …
}

       간단하게 말하자면 워 커 프로 세 스 가 부모 프로 세 스 알림 을 받 은 NGXSHUTDOWN_SIGNAL 회, ngxquit 치 1, 물론 ngxquit 의 처 리 는 worker 와 master 가 다 릅 니 다. 구분 이 필요 합 니 다. 이것 이 바로 ngx 입 니 다.프로 세 스 유형의 역할 이 야.다음 worker 프로 세 스 는 계승 하 는 listenfd 를 닫 는 것 을 중단 하고 accpet 의 새로운 연결 행위 도 사 라 졌 습 니 다. 그리고 프로 세 스 는 'hold' 의 연결 이 모두 처 리 된 후에 종료 합 니 다. 시작 과 끝 을 잘 할 것 입 니 다!

좋은 웹페이지 즐겨찾기