使用mod_wsgi冻结Django / Apache

我有一个Django应用程序,它在Nginx之后的2个负载均衡的mod_wsgi / Apache服务器(静态文件,反向代理/负载均衡)之后运行.

每隔几天,我的网站就会变得完全没有响应.我的猜测是,一堆客户端正在请求被阻止的URL.

这是我的配置

WSGIDaemonProcess web1 user=web1 group=web1 processes=8 threads=15 maximum-requests=500 python-path=/home/web1/django_env/lib/python2.6/site-packages display-name=%{GROUP}
WSGIProcessGroup web1
WSGIScriptAlias / /home/web1/django/wsgi/wsgi_handler.py

我尝试过仅使用一个线程和更多进程,以及更多线程和一个进程进行实验.我迟早尝试的所有操作几乎都会导致页面加载超时.

有什么建议可以尝试吗?如果这可以解决问题,我愿意尝试其他部署选项.

另外,除了Apache状态模块之外,还有更好的方法来监视mod_wsgi吗?我一直在打:

 curl http://localhost:8080/server-status?auto

并观察忙碌的工人的数量作为我是否会遇到麻烦的指标(我假设我有更多的忙碌的工人,当前正在进行的阻塞操作更多).

注意:其中一些请求是针对我为该应用程序托管的REST Web服务的.以某种方式通过Nginx对URL位置进行速率限制是否有意义?

最佳答案
采用:

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Extracting_Python_Stack_Traces

嵌入可以在遇到卡住的请求并找出它们在做什么时触发的功能.这些请求可能随着时间的推移不断累积,而不是立即发生,因此您可以定期执行此请求,而不必等待完全失败.

作为故障保险,您可以添加以下选项:

inactivity-timeout=600

到WSGIDaemonProcess指令.

如果10分钟处于非活动状态,它将重新启动守护程序模式进程.

不幸的是,目前这发生在两种情况下.

第一个是10分钟没有任何请求的地方,该过程将重新启动.

第二个也是您要加入的一个,如果所有请求线程都被阻塞,并且它们都没有从wsgi.input读取任何输入,也没有产生任何响应内容,那么在10分钟内,该过程将再次重新启动自动.

这至少意味着您的过程应自动恢复,并且不会被召唤出床.由于您正在运行许多进程,因此它们可能不会同时卡住,因此新请求不应引起重新启动的注意,因为其他进程仍会处理这些请求.

您应该解决的问题是可以将超时时间降低到多低.您不希望它太低,以至于由于根本没有请求,进程将重新启动,因为它会卸载应用程序,如果使用的是延迟加载,则会导致下一个请求变慢.

我应该做的实际上是添加一个新的选项blockd-timeout,该选项专门检查在定义的时间段内所有被阻止的请求,因此由于根本没有任何请求,因此将其与重新启动分开.这将使其更加灵活,因为由于没有请求而重新启动它会带来再次加载应用程序的问题.

不幸的是,由于托管配置可能是多线程的,因此无法轻松实现适用于单个请求的请求超时.向请求中注入Python异常不一定会解除线程阻塞,最终您还是必须终止进程并中断其他并发请求.因此,阻塞超时可能更好.

对我来说,另一件有趣的事情可能是,我将一些东西添加到mod_wsgi中,以报告由于进程阻塞而导致的强制重新启动到New Relic代理中.那样真的很酷,因为您将在监视工具中看到它们.

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...