为什么 NGINX 的 reload 命令不是热加载?

为什么 NGINXreload 不是热加载 这段时间在 Reddit 看到一个讨论,为什么 NGINX 不支持热加载?乍看之下很反常识,作为世界第一大 Web 服务器,不支持热加载?难道大家都在使用的 `nginx -s reload` 命令都用错了? 带着这个疑问,让我们开始这次探索之旅,一起聊聊热加载NGINX 的故事。 阅读详情

这段时间在 Reddit 看到一个讨论,为什么 NGINX 不支持热加载?乍看之下很反常识,作为世界第一大 Web 服务器,不支持热加载?难道大家都在使用的 nginx -s reload 命令都用错了?带着这个疑问,让我们开始这次探索之旅,一起聊聊热加载和 NGINX 的故事。

NGINX 相关介绍

NGINX 是一个跨平台的开源 Web 服务器,使用 C 语言开发。据统计,全世界流量最高的前 1000 名网站中,有超过 40% 的网站都在使用 NGINX 处理海量请求。

NGINX 有什么优势,导致它从众多的 Web 服务器中脱颖而出,并一直保持高使用量呢?

我觉得核心原因在于,NGINX 天生善于处理高并发,能在高并发请求的同时保持高效的服务。

相比于同时代的其他竞争对手例如 Apache、Tomcat 等,其领先的事件驱动型设计和全异步的网络 I/O 处理机制,以及极致的内存分配管理等众多优秀设计,将服务器硬件资源压缩到了极致。使得 NGINX 成为高性能 Web 服务器的代名词。

当然,除此之外还有一些其他原因,比如:

  • 高度模块化的设计,使得 NGINX 拥有无数个功能丰富的官方模块和第三方拓展模块。

  • 最自由的 BSD 许可协议,使得无数开发者愿意为 NGINX 贡献自己的想法。

  • 支持热加载,能保证 NGINX 提供 7x24h 不间断的服务。

关于热加载

大家期望的热加载功能是什么样的?我个人认为,首先应该是用户端无感知的,在保证用户请求正常和连接不断的情况下,实现服务端或上游的动态更新。

那什么情况下需要热加载?在如今云原生时代下,微服务架构盛行,越来越多的应用场景有了更加频繁的服务变更需求。包括反向代理域名上下线、上游地址变更、IP 黑白名单更新等,这些都和热加载息息相关。

那么 NGINX 是如何实现热加载的?

NGINX 热加载的原理

执行 nginx -s reload 热加载命令,就等同于向 NGINX 的 master 进程发送 HUP 信号。在 master 进程收到 HUP 信号后,会依次打开新的监听端口,然后启动新的 worker 进程。

此时会存在新旧两套 worker 进程,在新的 worker 进程起来后,master 会向老的 worker 进程发送 QUIT 信号进行优雅关闭。老的 worker 进程收到 QUIT 信号后,会首先关闭监听句柄,此时新的连接就只会流进到新的 worker 进程中,老的 worker 进程处理完当前连接后就会结束进程。

从原理上看,NGINX 的热加载能很好地满足我们的需求吗?答案很可能是否定的,让我们来看下 NGINX 的热加载存在哪些问题。

NGINX 热加载的缺陷

首先,NGINX 频繁热加载会造成连接不稳定,增加丢失业务的可能性。

NGINX 在执行 reload 指令时,会在旧的 worker 进程上处理已经存在的连接,处理完连接上的当前请求后,会主动断开连接。此时如果客户端没处理好,就可能会丢失业务,这对于客户端来说明显就不是无感知的了。

其次,在某些场景下,旧进程回收时间长,进而影响正常业务。

比如代理 WebSocket 协议时,由于 NGINX 不解析通讯帧,所以无法知道该请求是否为已处理完毕状态。即使 worker 进程收到来自 master 的退出指令,它也无法立刻退出,而是需要等到这些连接出现异常、超时或者某一端主动断开后,才能正常退出。

再比如 NGINX 做 TCP 层和 UDP 层的反向代理时,它也没法知道一个请求究竟要经过多少次请求才算真正地结束。

这就导致旧 worker 进程的回收时间特别长,尤其是在直播、新闻媒体活语音识别等行业。旧 worker 进程的回收时间通常能达到半小时甚至更长,这时如果再频繁 reload,将会导致 shutting down 进程持续增加,最终甚至会导致 NGINX OOM,严重影响业务。


# 一直存在旧 worker 进程:nobody 6246 6241 0 10:51 ? 00:00:00 nginx: worker process nobody 6247 6241 0 10:51 ? 00:00:00 nginx: worker process nobody 6247 6241 0 10:51 ? 00:00:00 nginx: worker process nobody 6248 6241 0 10:51 ? 00:00:00 nginx: worker process nobody 6249 6241 0 10:51 ? 00:00:00 nginx: worker process nobody 7995 10419 0 10:30 ? 00:20:37 nginx: worker process is shutting down  <= here nobody 7995 10419 0 10:30 ? 00:20:37 nginx: worker process is shutting down nobody 7996 10419 0 10:30 ? 00:20:37 nginx: worker process is shutting down

从上述内容可以看到,通过 nginx -s reload方式支持的“热加载”,虽然在以往的技术场景中够用,但是在微服务和云原生迅速发展的今天,它已经捉襟见肘且不合时宜。

如果你的业务变更频率是每周或者每天,那么 NGINX 这种 reload 还是满足你的需求的。但如果变更频率是每小时、每分钟呢?假设你有 100 个 NGINX 服务,每小时 reload 一次的话,就要 reload 2400 次;如果每分钟 reload 一次,就是 864 万次。这显然是无法接受的。

因此,我们需要一个不需要进程替换的 reload 方案,在现有 NGINX 进程内可以直接完成内容的更新和实时生效。

在内存中直接生效的热加载方案

在 Apache APISIX 诞生之初,就是希望来解决 NGINX 热加载这个问题的。

Apache APISIX 是基于 NGINX + Lua 的技术栈,以  ETCD 作为配置中心实现的云原生、高性能、全动态的微服务 API 网关,提供负载均衡、动态上游、灰度发布、精细化路由、限流限速、服务降级、服务熔断、身份认证、可观测性等数百项功能。

使用 APISIX 你不需要重启服务就可以更新配置,这意味着修改上游、路由、插件时都不用重启。既然是基于 NGINX,APISIX 又是如何摆脱 NGINX 的限制实现完美热更新?我们先看下 APISIX 的架构。

通过上述架构图可以看到,之所以 APISIX 能摆脱 NGINX 的限制是因为它把上游等配置全部放到 APISIX Core 和 Plugin Runtime 中动态指定。

以路由为例,NGINX 需要在配置文件内进行配置,每次更改都需要 reload 之后才能生效。而为了实现路由动态配置,Apache APISIX 在 NGINX 配置文件内配置了单个 server,这个 server 中只有一个 location。我们把这个 location 作为主入口,所有的请求都会经过这个 location,再由 APISIX Core 动态指定具体上游。因此 Apache APISIX 的路由模块支持在运行时增减、修改和删除路由,实现了动态加载。所有的这些变化,对客户端都零感知,没有任何影响。

再来几个典型场景的描述。

比如增加某个新域名的反向代理,在 APISIX 中只需创建上游,并添加新的路由即可,整个过程中不需要 NGINX 进程有任何重启。再比如插件系统,APISIX 可以通过 ip-restriction 插件实现 IP 黑白名单功能,这些能力的更新也是动态方式,同样不需要重启服务。借助架构内的 ETCD,配置策略以增量方式实时推送,最终让所有规则实时、动态的生效,为用户带来极致体验。

总结

NGINX 的热加载在某些场景下会长时间存在新旧两套进程,导致额外消耗资源,同时频繁热加载也会导致小概率业务丢失。面对当下云原生和微服务的技术趋势下, 服务变化更加的频繁,控制 API 的策略也发生了变化,导致我们对热加载的需求提出了新需求,NGINX 的热加载已经不能满足实际业务需求。

现在是时候切换到更贴合云原生时代并且更完善的热加载策略、性能表现卓越的 API 网关——Apache APISIX,从而享受动态、统一管理等特性带来的管理效率上的极大提升。

Nginx: 配置文件重载的原理和热部署 注意,新版本的nginx的目录结构需要与旧版一致。假设主目录是 /opt/nginx 下 $reload 重载配置文件的流程。2 )实际演示升级Nginx程序。1 )热部署的升级流程。 阅读详情

相关推荐

C# OpenCvSharp4实战:5分钟搞定工业视觉模板匹配(附完整代码)

本文为C#开发者提供了基于OpenCvSharp4的工业视觉模板匹配实战指南。通过详细的环境搭建、核心原理解析和完整代码示例,重点介绍了如何使用`matchTemplate`函数,特别是`CCoeffNormed`方法,快速实现高精度、抗光照变化的模板匹配,并分享了多目标匹配、图像预处理等工业级优化技巧。

weixin_29053067的博客 465

nginx重启命令

nginx -s reload :修改配置后重新加载生效 nginx -s reopen :重新打开日志文件 nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确 关闭nginxnginx -s stop :快速停止nginx quit :完整有序的停止nginx 其他的停止nginx 方式: ps -ef | grep n...

qq_40006446的博客 11万+

静态时序分析—伪路径(set_false_path)

set_false_path应用场景

m0_61544122的博客 2万+

4、Nginx命令reload很重要)

Nginx命令reload很重要) ./nginx -s reload :当我们更改了配置文件,我们都要重新加载我们的配置文件也就是reload例如我们的更改端口号变80位8080 连接不上的操作

分享JAVA/ Python/ Ts学习路上的一些笔记,不足之处多多见谅。 3万+

4. Nginx

linux下安装NginxNginx部署静态项目,Nginx用作虚拟主机和反向代理。

xxx072655的博客 1万+

nginx reload热加载实现

nginx reload热加载实现 1.向master进程发送HUP信号(reload 命令),master进程中的ngx_reconfigure设置1 2.master进程校验配置语法是否正确 3.master进程打开新的监听端口(子进程会继承父进程打开的所有端口) 4.master进程用新配置启动新的worker子进程,ngx_start_worker_processes(NGX_PR...

INGNIGHT的专栏 5388

NGINX热加载入门:从零学会smooth reload

作为一个刚接触服务器配置的小白,我最初每次修改nginx.conf都战战兢兢,生怕操作失误导致服务崩溃。后来发现用可视化工具边学边练效果特别好,于是自己动手做了个交互式学习应用,现在把搭建过程整理出来。这个应用的核心目标是让配置修改过程可视化。左侧是nginx.conf的编辑区,右侧实时显示服务状态和日志。这个平台最方便的是可以直接把项目一键部署成在线应用,不用自己折腾服务器配置。像我这样的前端开发者,用它的Node.js环境部署特别顺手,从代码编写到服务上线全流程都能在一个页面完成,对新手真的非常友好。

GreyWolf12的博客 403

无需重启服务:AWS Workload Credentials Provider 证书配置热加载Reload)实战

当你的 Web 服务器使用 AWS Certificate Manager(ACM)签发的 TLS 证书时,证书到期前的自动续期是常态,但如何让 Nginx、Apache 等应用平滑切换到新证书,却常常让人头疼。**AWS Workload Credentials Provider 证书配置热加载**功能正是为解决这一痛点而生:它能在不重启服务、不中断业务的情况下,自动导出最新证书并触发应用重载,

gitblog_00933的博客 283

科普文:软件架构Nginx系列之【如何解决nginx reload不生效】

前面讲过nginx热加载,有提到过nginx reload失败、未生效的问题,这篇文章就重点讲一下。解决方法如下: 检查配置文件语法:使用nginx -t命令可以检查nginx配置文件的语法是否正确。如果有错误会显示错误信息,需要根据错误信息进行修正。 查看日志文件:查看nginx的错误日志文件,通常在/var/log/nginx/error.log中,查看是否有相关错误信息提示。 强制重启:如果无法通过reload生效,可以尝试使用nginx -s reload命令强制重新加载配置文件。 检查进程

为无为,事无事,味无味。 3044

百万并发下的NGINX热加载实战方案

在电商大促期间,服务器面临百万级并发请求的压力,如何在不中断服务的情况下更新NGINX配置,成为运维团队必须面对的挑战。暴露的关键指标包括:nginx_http_requests_total、nginx_http_connections_active、nginx_http_connections_reading等。对于想深入学习的朋友,建议在InsCode上创建项目,结合平台提供的实时预览功能,可以直观地观察reload前后的连接状态变化。可以快速部署完整的演示环境,实际体验NGINX热加载的全过程。

YellowSun24的博客 151

Nginx小白必看:reload和restart的区别详解

reload后别急着关终端,用确认新老进程共存生产环境建议在低峰期操作,即使reload也可能短暂增加CPU负载最近在InsCode(快马)平台实践时发现,这类Web工具开发特别适合用它的实时预览功能。写完HTML立刻能看到效果,调试动画和交互逻辑特别高效。最惊艳的是完成开发后,直接点部署按钮就能生成可分享的演示链接,不用自己折腾服务器配置。对新手来说,这种从 coding 到上线的无缝体验真的能少走很多弯路。

IndigoNight21的博客 1176

nginx基础篇 - 控制命令详解:启动/停止、配置文件检查/重新加载、nginx平滑升级

文章详细介绍了nginx相关的命令,包括启动、停止、配置文件检查、重新加载等。在nginx基础操作的基础上,还介绍了如何实现nginx的平滑升级。

ChineHe的博客 6501

nginx【12】reload流程与优雅停止详解

接下来我们来介绍reload重载配置文件的真相; 当我们更改了nginx配置文件的时候,我们都会执行nginx -s reload;那么我们执行这条命令的原因是希望nginx不能停止服务,始终还在处理新的请求的同时,把nginx的配置文件平滑的从旧的nginx.conf更新为新的nginx.conf;这样的一个功能对nginx来说非常的有必要,但是我们往往会发现,在我们执行之后,会发现nginx的worker进程的数量变多了;这是因为老的nginx配置的worker进程它长时间没有退出;当我们使用strea

爱死亡机器人 1万+

Nginx

1 .客户端发送请求到 Nginx 服务器。2 .Nginx 接收到请求并根据配置的监听端口进行处理。3 .根据请求的域名匹配相应的服务器块。4 .如果配置了负载均衡和反向代理,Nginx 将根据算法将请求转发到相应的上游服务器。5 .如果请求匹配了静态文件路径,Nginx 直接返回静态文件。6 .如果请求不匹配静态文件路径,Nginx 将请求转发给后端应用程序服务器进行处理。7 .后端应用程序服务器处理请求并生成响应。8 .Nginx 将后端服务器返回的响应返回给客户端。配置Nginx来处理动态请求转发。

weixin_53556864的博客 3147

复习Nginx

1.支持高并发2.内存资源消耗低3.高扩展性(模块化设计)4.高可用性(master-worker)

sjsnsvsjsm的博客 2523

Nginxreload,升级以及关闭流程

1 向master进程发送HUP信号(reload命令)2 master进程校验配置语法是否正确;3 master打开可能引入的新的监听端口;4 master用新的配置文件启动新的worker子进程;5 启动新的worker子进程之后,master向老的worker子进程发送QUIT信号(优雅的退出);6 老的子进程收到QUIT信号之后,关闭监听句柄(也就是说,新的连接只会到新的子进程),处理完当前的连接后就结束进程;

lgq2016的博客 2229

探究 Nginxreload 流程的真相

今天这篇文章主要来介绍下 Nginxreload 流程。实际上在之前文章中,在更改了 nginx 配置文件时,我们都会执行 nginx -s reload 命令,我们执行这条命令的原因是希望 nginx 不停止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx.conf 配置更新为新的 nginx.conf 配置。 这样一个功能对于 nginx 非常有必要,但是有...

武培轩 3460

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析

nginx 常用命令解释,结合实际应用场景和注意事项

qq_40860137的博客 4716

基于yolo的障碍识别.zip

基于yolo的障碍识别.zip

上一篇: 盘点2022年世界杯的科技与狠活
下一篇: 弃用 ifconfig 吧,你值得收藏的 IpRoute2 简明指南
LinkSLA
博客等级 码龄5年 2786粉丝 454原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值