在生产中安全地重新加载 mod_wsgi 进程

在生产中安全地重新加载 mod_wsgi 进程

有没有办法安全地按需重启 mod_wsgi 进程,可能在多台机器上运行?我正在mod_wsgi使用 apache 在守护进程模式下为 django 应用程序提供服务:

WSGIDaemonProcess myapp user=user group=user processes=30 threads=1
WSGIProcessGroup myapp

我读了mod_wsgi文档但所有建议的解决方案都不适用于我:

  1. 不建议在生产系统中运行监控脚本。
  2. 对我来说,发送终止信号并不安全。我想避免中断正在运行的请求。重新加载不能导致服务崩溃。速度放慢一点也没关系。
  3. 触摸mod_wsgi配置文件可以安全地完成此操作,但如何在多台机器上执行此操作?

理想情况下,我们应该能够通过一个操作重新启动进程。有什么建议吗?

注意:我必须用一个线程运行多个进程。我的应用程序不是线程安全的。


编辑,如果那是我唯一的选择,我可以从 Puppet 执行此操作。但我更喜欢从特殊受保护的视图执行此操作。我认为这在一台机器上很容易,但在多台机器上则不然


多谢

答案1

接触 mod_wsgi 配置文件可以安全地完成此操作,但如何在多台机器上执行此操作?

这可以通过使用共享代码库(例如 NFS 挂载)来解决。

或者它应该是版本控制/部署过程的一部分。

  • 您现在使用版本控制吗?

    如果是,请创建一个确保文件更新的流程。例如,您可以使用提交后挂钩来自动化该流程。

  • 您如何部署您的代码?

    考虑使用类似卡皮斯特拉诺或者木偶并在部署方案中包含一个操作来更新该文件。

答案2

在现有请求如何生效方面,(2) 和 (3) 之间没有区别。发送 kill SIGINT 不仅会退出进程,还会触发与 (2) 相同的有序关闭。事实上,(2) 内部只是向其自身发送 SIGINT。重要的是识别需要向其发送 SIGINT 的进程。为此,您应该对 WSGIDaemonProcess 使用“display-name”选项,以便它们在“ps”输出中被命名并且更容易识别。

答案3

接触 mod_wsgi 配置文件可以安全地完成此操作,但如何在多台机器上执行此操作?

我猜这解决了如何以非常优雅的方式触发 mod_wsgi 重新加载脚本的问题。为了同时在多个主机之间分配此操作,我建议使用类似密码(并行 ssh)。它的配置应该没有问题。

相关内容