当前位置: 首页 > 知识库问答 >
问题:

nginx - Nginx配置重载时,旧worker进程处理请求的详细机制是什么?

白君之
2024-08-13

nginx官方文档表示-s reload时会等待旧的进程处理完请求后,旧的进程才会退出:

Once the master process receives the signal to reload configuration, it checks the syntax validity of the new configuration file and tries to apply the configuration provided in it. If this is a success, the master process starts new worker processes and sends messages to old worker processes, requesting them to shut down. Otherwise, the master process rolls back the changes and continues to work with the old configuration. Old worker processes, receiving a command to shut down, stop accepting new connections and continue to service current requests until all such requests are serviced. After that, the old worker processes exit.

这个描述的service current requests怎么理解呢,是指进程正在处理一些事情(比如nginx+lua,它正在运行lua代码),还是说是一定与某个客户端处于连接状态。

在我的项目中,基于openresty建立一个网关,当控制端同步数据到网关上,网关会存储数据到内存,当控制端发出POST请求,推送数据时,此时-s reload,新的进程起来后旧的进程立刻就退出了,导致一个请求的数据未成功同步到网关上。

我现在无法理解旧的进程是处于哪种状态才会等待处理完后才退出,而不是当新的进程起来后立刻就退出了旧进程。

共有1个答案

蓝华皓
2024-08-13

在Nginx(包括OpenResty)中,当使用-s reload命令来重新加载配置时,Nginx的master进程会遵循以下步骤来处理新旧worker进程的转换:

  1. 检查新配置文件的语法:首先,master进程会检查新的配置文件是否有语法错误。
  2. 应用新配置:如果新配置文件语法正确,master进程会尝试应用新配置。这包括启动新的worker进程,这些新worker进程将使用新的配置。
  3. 通知旧worker进程关闭:master进程会向所有旧worker进程发送关闭信号。收到信号的旧worker进程会停止接受新的连接请求,但会继续处理当前已经建立的连接和正在处理的请求。
  4. 处理当前请求:这里的“service current requests”指的是旧worker进程会继续完成它们当前正在处理的请求,无论这些请求是处于什么阶段(比如,正在读取请求体、正在执行Lua脚本、正在发送响应等)。只要这些请求尚未完成,旧worker进程就会继续处理它们,直到它们完全结束。
  5. 退出旧worker进程:一旦所有当前正在处理的请求都完成了,旧worker进程就会退出。

关于你提到的具体问题,即“新的进程起来后旧的进程立刻就退出了,导致一个请求的数据未成功同步到网关上”,这通常不应该发生,除非存在以下几种情况:

  • 请求处理时间极短:如果请求处理得非常快,几乎在新旧worker进程切换的瞬间就完成了,那么可能看起来就像是旧worker进程立刻退出了。但实际上,它仍然是在处理完所有请求后才退出的。
  • 配置或代码问题:可能存在配置错误或代码问题,导致请求处理不正确或未能正确同步数据。
  • 日志和监控不足:如果没有足够的日志记录或监控,可能很难准确判断请求和worker进程的行为。

为了解决这个问题,你可以考虑以下几点:

  • 增加日志记录:在Lua脚本中增加日志记录点,以便跟踪请求的处理过程和数据的同步情况。
  • 检查请求处理逻辑:确保请求处理逻辑正确,且数据同步操作在请求处理完成前正确执行。
  • 使用Nginx的平滑重启功能:Nginx的-s reload命令本身就是设计来平滑重启的,确保在重启过程中服务不会中断。如果仍然遇到问题,可能需要检查Nginx和OpenResty的版本,以及是否有已知的bug或限制。
  • 监控worker进程:使用工具(如pstopnginx -s status等)监控worker进程的行为,查看它们是否按预期工作。
 类似资料:
  • 本文向大家介绍Nginx处理请求时的匹配规则详析,包括了Nginx处理请求时的匹配规则详析的使用技巧和注意事项,需要的朋友参考一下 nginx 在收到一条请求时将先通过 server_name 匹配一个 server, 然后使用 server 中的 location 继续匹配. 匹配 server_name 在 nginx 中, server_name 决定了当收到一个请求后哪一个 server

  • 本文向大家介绍windows7配置Nginx+php+mysql的详细教程,包括了windows7配置Nginx+php+mysql的详细教程的使用技巧和注意事项,需要的朋友参考一下 最近在学习php,想把自己的学习经历记录下来,并写一些经验,仅供参考交流。此文适合那些刚刚接触php,想要学习并想要自己搭建Nginx+php+mysql环境的同学。   当然,你也可以选择集成好的安装包,比如 wa

  • 本文向大家介绍nginx 重新加载NGINX配置文件,包括了nginx 重新加载NGINX配置文件的使用技巧和注意事项,需要的朋友参考一下 示例 以root用户身份: Ubuntu 14.04示例 Ubuntu 16.04示例 重新加载之前,最好检查config是否存在语法错误: 要么            

  • 接收请求流程 (99%) http请求格式简介 (99%) 首先介绍一下rfc2616中定义的http请求基本格式: Request = Request-Line * (( general-header | request-header | entity-header ) CRLF) CRLF

  • 本文向大家介绍Nginx配置文件nginx.conf详细说明,包括了Nginx配置文件nginx.conf详细说明的使用技巧和注意事项,需要的朋友参考一下 在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. 以上是一些基本的配置,使用Nginx最大的好处就是负载均衡 如果要使用负载均衡的话,可以修改配置http节点如下: 以上就是本文的全部内容,希望对大家的学习有

  • 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_nam