代码之家  ›  专栏  ›  技术社区  ›  augray

如何从mod_wsgi正常关闭应用程序

  •  1
  • augray  · 技术社区  · 8 年前

    在生产中,我们计划使用mod_wsgi。我看过了 wsgi applications really shouldn't be handling signals .

    所以我的问题是,我应该如何在这个设置中实现以下行为

    1 回复  |  直到 8 年前
        1
  •  2
  •   Graham Dumpleton    8 年前

    邮寄 SIGTERM

    当Apache父进程接收到 ,它依次发送 SIGTERM公司 它的所有子工作进程,以及受管理的mod_wsgi守护进程(如果使用守护进程模式)。在强制关闭子进程之前,这些子进程将停止接受新请求,并将有最多3秒钟的时间来完成现有请求。

    SIGTERM公司

    而不是 SIGTERM公司 ,您可以发送 SIGWINCH 而是发出信号。这将导致Apache优雅地停止,但这有问题。

    在这种情况下会发生什么 SIGTERM公司 它不会在3秒钟后强行终止进程,而是允许它们运行,直到至少完成任何活动请求。

    问题是没有故障保护。如果这些请求从未完成,我所知道的超时将不会看到子工作进程被强制关闭。因此,您的服务器可能会在关闭时挂起。

    SIGUSR2 到mod_wsgi守护进程。假设您已设置 graceful-timeout 如果所有活动请求都完成,这将导致守护进程退出。如果超时过期,则它将进入正常的进程关闭序列,即不接受来自Apache子工作进程的新请求,并在 shutdown-timeout (默认为5秒)激发,如果请求仍未完成,则强制关闭进程。

    在这种情况下,它实际上并没有关闭进程,而是导致它们退出,这将导致它们被替换,因为我们并不是告诉整个Apache停止,而是告诉mod_wsgi守护进程进行优雅的重新启动。在这种情况下,除非您监视守护进程集并知道它们何时都已重新启动,否则您无法清楚地表明它们都已完成,然后可以关闭整个Apache实例。

    问题是你是否真的需要这么做。无论如何,请求都不可避免地会失败,用户必须处理这一点,因此在重启时中断少数请求通常不是什么大问题。应用程序有什么特别之处,需要设置一个更高的栏并尝试确保零请求被中断?