限制Django/Apache的最大并发请求数量

4
我有一个django网站,演示了一种工具的使用。我的一个视图接受文件作为输入,并通过外部python脚本运行一些相当重的计算,并将一些输出返回给用户。该工具足够快,可以在同一请求中返回输出。但是,我希望限制对此URL /视图的并发请求数量,以防止服务器过载。

您有什么建议可以做到这一点吗?页面本身非常简单,使用率很低。

2个回答

4

假设您正在使用mod_wsgi,您可以将WSGI应用程序分段到多个mod_wsgi守护进程组中,将要限制的特定URL委派给自己的mod_wsgi守护进程组,并具有较少的进程/线程。

WSGIDaemonProcess myapp processes=2 threads=10
WSGIDaemonProcess myapp-restricted threads=2

WSGIScriptAlias / /some/path/app.wsgi

WSGIProcessGroup myapp

<Location /some/specific/url>
WSGIProcessGroup myapp-restricted
</Location>

请注意,排队等待访问受限进程中的这2个线程的请求仍然会消耗主Apache服务器子进程中的工作线程。因此,您需要确保使用worker MPM(因此没有mod_php)并配置MPM以具有足够的备用线程来处理那些积压的请求以及正常流量。

感谢您的回答。我一直在尝试做与Graham类似的事情,但是我一直收到513错误,直到我意识到这是权限错误,但是您的文档帮助我解决了这个问题。所以您是说WSGIDaemonProcess根本不应该与prefork mpm一起运行吗?另外一个问题。是否有可能放弃无法直接提供服务的请求,并将用户重定向到错误页面? - Johan
您仍然可以使用Prefork MPM。只需意识到每个排队的已停泊请求将使用整个Apache服务器子进程而不是单个线程,如果使用Worker MPM,则Prefork MPM具有比使用mod_wsgi守护程序模式时更高的内存开销。如果您拥有大量内存,没有问题,或者如果您正在使用mod_php,则没有选择。但无法丢弃由于受限进程繁忙而无法立即提供服务的请求。 - Graham Dumpleton

1

这实际上是关于 mod_wsgi 的问题,假设您正在使用它从 Apache 提供应用程序(如果您没有,确实应该这样做)。

mod_wsgi 的创建者 Graham Dumpleton 有时会在这些地方逗留,但在等待他出现时,您可以查看 卓越的文档。看起来 WSGIDaemonProcess 指令的其中一个参数可能是您要寻找的内容


1
抱歉...为自己辩护,我确实称赞了你的文档“非常好”。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接