一、背景
在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0。
二、重启流程
重启意味着新旧接替,在交接任务的过程中势必会存在新旧server并存的情形,因此,重启的流程大致为:
启动新的server
新旧server并存,两者共同处理请求,提供服务
旧的server处理完所有的请求之后优雅退出
这里,最主要的问题在于如何保证新旧server可以并存,如果重启前后的server端口一致,如何保证两者可以监听同一端口。
三、nginx实现
为了验证nginx平滑重启,笔者首先尝试nginx启动的情形下再次开启一个新的server实例,结果如图:
很明显,重新开启server实例是行不通的,原因在于新旧server使用了同一个端口80,在未开始socket reuseport选项复用端口时,bind系统调用会出错。nginx默认bind重试5次,失败后直接退出。而nginx需要监听ipv4地址0.0.0.0和ipv6地址[::],故图中打印出10条emerg日志。
接下来就开始尝试平滑重启命令了,一共两条命令:
kill -usr2 `cat /var/run/nginx.pid` kill -quit `cat /var/run/nginx.pid.oldbin`
第一条命令是发送信号usr2给旧的master进程,进程的pid存放在/var/run/nginx.pid文件中,其中nginx.pid文件路径由nginx.conf配置。
第二条命令是发送信号quit给旧的master进程,进程的pid存放在/var/run/nginx.pid.oldbin文件中,随后旧的master进程退出。
那么问题来了,为什么旧的master进程的pid存在于两个pid文件之中?事实上,在发送信号usr2给旧的master进程之后,旧的master进程将pid重命名,原先的nginx.pid文件rename成nginx.pid.oldbin。这样新的master进行就可以使用nginx.pid这个文件名了。
先执行第一条命令,结果如图:
不错,新旧master和worker进程并存了。 再来第二条命令,结果如图:
如你所见,旧的master进程8527和其worker进程全部退出,只剩下新的master进程12740。
不由得产生困惑,为什么手动开启一个新的实例行不通,使用信号重启就可以达到。先看下nginx log文件:
除了之前的错误日志,还多了一条notice,意思就是继承了sockets,fd值为6,7。 随着日志翻看nginx源码,定位到nginx.c/ngx_exec_new_binary函数之中,
ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv) { ... ctx.path = argv[0]; ctx.name = "new binary process"; ctx.argv = argv; n = 2; env = ngx_set_environment(cycle, &n); ... var = ngx_alloc(sizeof(nginx_var) + cycle->listening.nelts * (ngx_int32_len + 1) + 2, cycle->log); ... p = ngx_cpymem(var, nginx_var "=", sizeof(nginx_var)); ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) { p = ngx_sprintf(p, "%ud;", ls[i].fd); } *p = '\0'; env[n++] = var; ... env[n] = null; ... ctx.envp = (char *const *) env; ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) == ngx_file_error) { ... return ngx_invalid_pid; } pid = ngx_execute(cycle, &ctx); if (pid == ngx_invalid_pid) { if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data) == ngx_file_error) { ... } } ... return pid; }
函数的流程为
将旧的master进程监听的所有fd,拷贝至新master进程的env环境变量nginx_var。
rename重命名pid文件
ngx_execute函数fork子进程,execve执行命令行启动新的server。
在server启动流程之中,涉及到环境变量nginx_var的解析,ngx_connection.c/ngx_add_inherited_sockets具体代码为:
static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle) { ... inherited = (u_char *) getenv(nginx_var); if (inherited == null) { return ngx_ok; } if (ngx_array_init(&cycle->listening, cycle->pool, 10, sizeof(ngx_listening_t)) != ngx_ok) { return ngx_error; } for (p = inherited, v = p; *p; p++) { if (*p == ':' || *p == ';') { s = ngx_atoi(v, p - v); ... v = p + 1; ls = ngx_array_push(&cycle->listening); if (ls == null) { return ngx_error; } ngx_memzero(ls, sizeof(ngx_listening_t)); ls->fd = (ngx_socket_t) s; } } ... ngx_inherited = 1; return ngx_set_inherited_sockets(cycle); }
函数流程为:
解析环境变量nginx_var的值,获取fd存入数组
fd对应的socket设为ngx_inherited,保存这些socket的信息。
也就是说,新的server压根就没重新bind端口listen,这些fd状态和值都是新的master进程fork时带过来的,新的master进程监听处理继承来的文件描述符即可,这里比较关键的一点在于listen socket文件描述符通过env传递。
위 내용은 nginx에서 원활한 재시작을 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

새해 초반, 레이 준은 새해 초에 2025 년에 새해 3 번의 소원을 공유했으며,이 4 시간 반 길이의 라이브 방송은 많은 관심을 끌었습니다. Lei Jun의 세 가지 주요 소원은 다음과 같습니다. 첫째, 300,000 대의 차량의 배달 목표를 달성하고 압력을 완화하며 더 이상 진전에 따라 잡지 않습니다. 둘째, 더 많은 여행 시간을 보내고, 전 세계의 아름다운 경치를 즐기고, 특별한 음식을 맛보고, 일과 함께 자동차 테스트를 수행하십시오. 셋째, 체력을 고수하고 체육관에서 100 번 확인하여 몸을 강화하십시오. 레이 준 (Lei Jun)은 라이브 방송에서 2024 년에 소형 일정으로 여행했다고 인정했기 때문에 종종 짧은 시간 동안 만 머물면서 현지 문화를 깊이 경험하기가 어렵습니다. 예를 들어, 독일의 New North Speedway에서 그는 단 8 시간 동안 머물 렀습니다. 따라서 새해에는 일과 삶과 여행의 균형을 향상시키기를 희망합니다.

9 위와 브랜드 대변인 Yi Yang Qianxi가 만든 마이크로 필름 "메모리 여행"은 2024 년에 여러 권위있는 미디어 상을 수상했으며 올해의 걸작이되었습니다. 이 작품은 독특한 이야기 스타일, 절묘한 제작 및 진지한 감정으로 업계로부터 높은 찬사를 받았습니다. 2024 상과 영예 : 2024 Gold T 큰

최근 PCONLINE2024 ZHIZHEN 기술 상이 공식적으로 발표되었으며 Agon Aidong QD-OLED E-Sports Display AG326UD가 "올해의 기술 혁신"상을 수상했습니다. 이 영광은 업계의 기술적 장점과 시장 성과에 대한 업계의 높은 인식을 나타낼뿐만 아니라 E-Sports Display 기술 분야에서 Agon의 혁신적인 기능과 뛰어난 성과를 완전히 반영합니다. 01. 기술의 미래를 살펴보면 PCONLINE ZHIZHEN 기술 상의 권위있는 가치는 기술 산업의 날씨 금지입니다. Pconline Zhizhen Technology Award는 엄격한 평가 시스템과 심도있는 산업 분석으로 광범위한 업계 인정을 성공적으로 승리했습니다. 이상은 기술 산업의 개발을 촉진하는 뛰어난 제품 및 브랜드를 항상 헌신하고 기술을 다루기 위해 노력해 왔습니다.

Sonyinteractiveent intustionment (SIE, Sony Interactive Entertainment)의 최고 건축가 인 Mark Cerny는 성능 업그레이드 된 AMDRDNA2.X 아키텍처 GPU 및 AMD와 함께 기계 학습/인공 지능 프로그램 코드 "Amethylst"를 포함하여 차세대 호스트 PlayStation5Pro (PS5PRO)에 대한 더 많은 하드웨어 세부 정보를 발표했습니다. PS5PRO 성능 향상의 초점은 여전히 강력한 GPU, Advanced Ray Tracing 및 AI 구동 PSSR Super-Resolution 기능을 포함하여 세 가지 기둥에 있습니다. GPU는 Sony가 RDNA2.x라는 맞춤형 AMDRDNA2 아키텍처를 채택하며 RDNA3 아키텍처가 있습니다.

EU의 일부 Windows 내부 채널에서 Microsoft의 Windows 검색 기능 개선이 테스트되었습니다. 이전에 통합 Windows 검색 기능은 사용자에 의해 비판을 받았으며 경험이 좋지 않았습니다. 이 업데이트는 검색 기능을 두 부분으로 나눕니다. 로컬 검색 및 Bing 기반 웹 검색을 위해 사용자 경험을 향상시킵니다. 검색 인터페이스의 새 버전은 기본적으로 로컬 파일 검색을 수행합니다. 온라인으로 검색 해야하는 경우 "Microsoft BingwebSearch"탭을 클릭하여 전환해야합니다. 전환 후 검색 바에는 사용자가 키워드를 입력 할 수있는 "Microsoft Bingwebsearch :"가 표시됩니다. 이 움직임은 로컬 검색 결과와 Bing 검색 결과의 혼합을 효과적으로 피합니다.

Capcom의 "Monster Hunter"시리즈 20 주년을 축하하기 위해 Baodao Club은 독특한 잡지 세트 인 "Monster Hunter"테마 바베큐 타이머 및 동반 컵을 시작했습니다. 이 세트는 12 월 27 일 일본 전국의 홈 편의점에서 이용할 수 있으며 3,498 엔으로 가격이 책정됩니다. 이 잡지 세트의 가장 큰 하이라이트는 대화 형 바베큐 타이머로 일련의 게임에서 클래식 바베큐 장면을 완벽하게 복제합니다. 타이머는 LED 불꽃 효과 및 게임 BGM이 장착 된 이전 버전의 바베큐 도구로 설계되어 실제 바베큐 프로세스 중에 사냥의 재미를 경험할 수 있습니다. 회전 핸들은 뒤집힌 바베큐를 시뮬레이션합니다. 성공적으로 베이킹을 한 후 "Baked!"의 음성 프롬프트가 있습니다. 재생됩니다. 타이머 크기는 약 9.5cm (높이) x 10.7cm (너비) x 8cm (깊이), 내장 L입니다.

Xiaomi Auto의 첫 번째 기념일 축하 행사는 자동차 소유자에게 새해 선물을 줄 것입니다! Xiaomi Auto의 공식 Weibo는 작년에 배달량이 130,000 대의 차량을 초과 한 후 Lei Jun의 클래식 인용문“Areyouok?”를 제공 할 것이라고 발표했습니다. 모든 Xiaomi SU7 소유자 및 예비 소유자에게. 숫자는 제한되어 있으며 무료로받을 수 있습니다! 활동 시간 : 2024 년 12 월 20 일 2025 년 1 월 20 일에 2024 년 12 월 20 일 오후 4시. 무료로 밸브 코어 캡. 이 밸브 코어 캡은 올해 9 월에 처음 출시되었으며 밝은 노란색 PVC 및 황동 재료로 만들어졌습니다. 황동 코어는 직접 내장되어 안전한 운전을 보장하고 떨어지지 않기 쉽습니다. 널리 사용되는

HDMI2.2 표준은 2025 CES 전시회 전날에 공식적으로 발표 될 것으로 예상된다. HDMiforum은 1 월 6 일 에이 새로운 세대의 비디오 신호 전송 프로토콜 사양을 발표 할 계획입니다. 2017 년에 출시 된 HDMI2.1 표준은 48Gbps의 최대 대역폭을, 4K144Hz 및 8K30Hz 비디오 전송을 지원하며 DSC 기술로 최대 10k120Hz가 될 수 있습니다. HDMI2.2는 대역폭을 크게 증가시키고, 해상도와 새로 고침 비율을 지원하며, 새로운 와이어를 채택 할 것으로 예상됩니다. 특정 사양은 아직 공개되지 않았지만 HDMI2.2는 HDMI2.1의 48GBPS 대역폭 및 10240*4320 해상도 한계를 능가 할 것입니다. DisplayPort2.1은 20에 이르렀습니다


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

Dreamweaver Mac版
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
