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' 의 연결 이 모두 처 리 된 후에 종료 합 니 다. 시작 과 끝 을 잘 할 것 입 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.