重新加载mod_wsgi在生产中安全地进行处理

有没有办法按需安全地重启mod_wsgi进程,可能在多台机器上运行? 我正在服务一个Django的应用程序与mod_wsgi守护进程模式与Apache:

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

我阅读了mod_wsgi文档中的build议,但是没有一个build议的解决scheme适用于我:

  1. 在生产系统中不build议运行监视脚本。
  2. 发送杀死信号在我的情况下是不安全的。 我想避免中断运行请求。 重新加载不能使服务closures。 放慢速度很好。
  3. 触摸mod_wsgiconfiguration文件安全地执行技巧,但如何在多台机器上完成?

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

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


编辑,如果这是我唯一的select,我可以从Puppet做到。 但我更喜欢是否有办法从一个特殊的保护视图。 我认为这是在一台机器上做的微不足道,而不是多台机器


非常感谢

触摸mod_wsgiconfiguration文件安全地执行技巧,但如何在多台机器上完成?

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

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

  • 你目前使用版本控制吗?

    如果是这样,创build一个进程,确保文件被更新。 例如,你可以用一个post-commit钩子自动化它。

  • 你如何部署你的代码?

    考虑使用类似Capistrano或Puppet的东西,并在您的部署配方中包含一项操作来更新该文件。

(2)和(3)在现有请求的执行方面没有区别。 发送kill SIGINT不会退出进程,而是触发与(2)相同的有序closures。 实际上,(2)内部只是发送一个SIGINT给自己。 重要的是确定需要发送给他们的SIGINT的进程。 为此,您应该使用'display-name'选项来WSGIDaemonProcess,以便在'ps'输出中进行命名并更容易识别。

触摸mod_wsgiconfiguration文件安全地执行技巧,但如何在多台机器上完成?

我想这解决了如何触发mod_wsgi以非常优雅的方式重新加载脚本的问题。 为了在多个主机之间同时分配这个动作,我推荐使用像pssh (并行ssh)这样的工具。 它的configuration不应该是一个问题。