使用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代理中.那样真的很酷,因为您将在监视工具中看到它们.
标签:nginx,apache,mod-wsgi,django 来源: https://codeday.me/bug/20191207/2087390.html