我有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中,我会设置时间和内存限制.
它不是你想要的"死锁超时",这是一个非常特殊的目的,在这种情况下无济于事.
至于尝试使用mod_wsgi功能,您需要WSGIDaemonProcess指令的'inactivity-timeout'选项.
即使这样,这也不是一个完整的解决方案.这是因为'inactivity-timeout'选项专门用于检测守护进程的所有请求处理是否已停止,它不是每个请求超时.如果守护程序进程是单线程的,它只等于每个请求超时.除了帮助修改进程之外,如果在该时间内没有任何请求到达,该选项还将具有重启守护进程的副作用.
简而言之,mod_wsgi级别没有办法让每个请求超时,这是因为没有真正的方法可以在Python中中断请求或线程.
您真正需要实现的是应用程序代码中HTTP请求的超时.我不知道它在哪里以及是否已经可用,但谷歌搜索'urllib2 socket timeout'.