当前位置:  开发笔记 > 编程语言 > 正文

如何阻止WSGI挂起apache

如何解决《如何阻止WSGI挂起apache》经验,为你挑选了1个好方法。

我有django像这样运行WSGI:


    WSGIScriptAlias / /home/ptarjan/django/django.wsgi
    WSGIDaemonProcess ptarjan processes=2 threads=15 display-name=%{GROUP}
    WSGIProcessGroup ptarjan
    Alias /media /home/ptarjan/django/mysite/media/

但如果在python我做:

def handler(request) :
    data = urllib2.urlopen("http://example.com/really/unresponsive/url").read()

整个apache服务器挂起并且没有响应此回溯

#0  0x00007ffe3602a570 in __read_nocancel () from /lib/libpthread.so.0
#1  0x00007ffe36251d1c in apr_file_read () from /usr/lib/libapr-1.so.0
#2  0x00007ffe364778b5 in ?? () from /usr/lib/libaprutil-1.so.0
#3  0x0000000000440ec2 in ?? ()
#4  0x00000000004412ae in ap_scan_script_header_err_core ()
#5  0x00007ffe2a2fe512 in ?? () from /usr/lib/apache2/modules/mod_wsgi.so
#6  0x00007ffe2a2f9bdd in ?? () from /usr/lib/apache2/modules/mod_wsgi.so
#7  0x000000000043b623 in ap_run_handler ()
#8  0x000000000043eb4f in ap_invoke_handler ()
#9  0x000000000044bbd8 in ap_process_request ()
#10 0x0000000000448cd8 in ?? ()
#11 0x0000000000442a13 in ap_run_process_connection ()
#12 0x000000000045017d in ?? ()
#13 0x00000000004504d4 in ?? ()
#14 0x00000000004510f6 in ap_mpm_run ()
#15 0x0000000000428425 in main ()

在Debian Apache 2.2.11-7上.

同样,我们可以得到保护:

def handler(request) :
    while (1) :
        pass

在PHP中,我会设置时间和内存限制.



1> Graham Dumpl..:

它不是你想要的"死锁超时",这是一个非常特殊的目的,在这种情况下无济于事.

至于尝试使用mod_wsgi功能,您需要WSGIDaemonProcess指令的'inactivity-timeout'选项.

即使这样,这也不是一个完整的解决方案.这是因为'inactivity-timeout'选项专门用于检测守护进程的所有请求处理是否已停止,它不是每个请求超时.如果守护程序进程是单线程的,它只等于每个请求超时.除了帮助修改进程之外,如果在该时间内没有任何请求到达,该选项还将具有重启守护进程的副作用.

简而言之,mod_wsgi级别没有办法让每个请求超时,这是因为没有真正的方法可以在Python中中断请求或线程.

您真正需要实现的是应用程序代码中HTTP请求的超时.我不知道它在哪里以及是否已经可用,但谷歌搜索'urllib2 socket timeout'.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有