如何仅在一个进程中使用 mod_wsgi 和 django 运行 Apache?

Posted

技术标签:

【中文标题】如何仅在一个进程中使用 mod_wsgi 和 django 运行 Apache?【英文标题】:how to run Apache with mod_wsgi and django in one process only? 【发布时间】:2015-04-03 18:45:43 【问题描述】:

我正在运行 apache,并在 2 个不同的进程中启用了 django 和 mod_wsgi。

我读到第二个进程是一个变化监听器,用于在变化时重新加载代码,但由于某种原因,我的 AppConfig 类的 ready() 函数被执行了两次。这个函数应该只运行一次。

我知道使用 --noreload 标志运行 django runserver 将解决开发模式下的问题,但我无法在我的 apache 网络服务器上的生产模式下找到解决方案。

我有两个问题:

    如何在生产中只运行一个进程或至少让一个进程运行ready() 函数?

    有没有办法让ready() 函数不在惰性模式下运行?我的意思是只在服务器启动时执行,而不是在第一次请求时执行。

为了进一步解释,我遇到的情况如下: ready() 函数创建一个文件夹侦听器,例如pyinotify。该侦听器将侦听我服务器上的文件夹并将任何更改的任务排入队列。 我看到此侦听器对受监视目录中的单个文件的任何更改执行了两次。这让我相信两个进程都在运行我的监听器。

【问题讨论】:

【参考方案1】:

不,第二个进程不是 onchange 监听器——我不知道你在哪里读到的。开发服务器会发生这种情况,而不是 mod_wsgi。

您不应试图阻止 Apache 为多个进程提供服务。如果这样做,您的站点的速度将大大降低:它一次只能处理一个请求,其他请求将排队等待第一个请求完成。除了玩具网站之外,这对任何东西都没有好处。

相反,您应该修复您的 AppConfig。与其盲目地生成监听器,不如在开始新监听器之前检查它是否已经创建。

【讨论】:

【参考方案2】:

您不应该阻止生成多个进程,因为这是一件好事,尤其是在生产环境中。您应该考虑使用一些与 django 分开的外部工具,或者添加检查文件夹监听是否已经在运行(例如监控 PID 文件的持久性及其内容)。

【讨论】:

这就是我最终要做的。我修复了我的 AppConfig 以支持运行它的多进程,但它对我来说仍然很奇怪,以至于无法在服务器启动时只运行一次代码。我不得不使用各种补丁来确保会发生这种情况 在 gunicorn 或 uWSGI 部署中总是有启动脚本,您可以使用它来运行一次性启动代码。 mod_wsgi 没有这种可能性,因为它取决于 apache 来生成 wsgi 进程。也没有设计上的主 django 线程,所以每个工作人员只依赖于数据库服务器,而不是相互依赖。这是一个很好的解决方案,始终检查您的侦听器是否尚未通过它的 pid 文件运行,因此您始终可以确保它只运行一次。 @Bat-chen 你是怎么做到的?我正在尝试各种补丁,但都没有效果......

以上是关于如何仅在一个进程中使用 mod_wsgi 和 django 运行 Apache?的主要内容,如果未能解决你的问题,请参考以下文章

Django + mod_wsgi + apache2 - 子进程 XXX 仍然没有退出,发送一个 SIGTERM

如何在 Apache 和 mod_wsgi 中使用 Flask 路由?

如何仅在 C 中将 SIGINT 发送到后台进程

mod_wsgi 的两种模式

03 - 快速安装

如何运行长期(无限)Python 进程?