我让django像这样运行WSGI:
<VirtualHost *:80>
WSGIScriptAlias / /home/ptarjan/django/django.wsgi
WSGIDaemonProcess ptarjan processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup ptarjan
Alias /media /home/ptarjan/django/mysite/media/
</VirtualHost>
但如果在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 ()
on Debian Apache 2.2.11-7。
同样,我们可以受到保护:
def handler(request) :
while (1) :
pass
在PHP中,我会设置时间和内存限制。
答案 0 :(得分:13)
这不是你想要的'死锁超时',这是一个非常特殊的目的,在这种情况下无济于事。
就尝试使用mod_wsgi功能而言,您需要WSGIDaemonProcess指令的'inactivity-timeout'选项。
即使这样,这也不是一个完整的解决方案。这是因为'inactivity-timeout'选项专门用于检测守护进程的所有请求处理是否已停止,它不是每个请求超时。如果守护程序进程是单线程的,它只等于每个请求超时。除了帮助修改进程外,如果在此时没有任何请求到达,该选项还会产生重启守护程序进程的副作用。
简而言之,mod_wsgi级别没有办法让每个请求超时,这是因为在Python中没有真正的方法来中断请求或线程。
您真正需要实现的是应用程序代码中HTTP请求的超时。我不知道它在哪里以及是否已经可用,但谷歌搜索'urllib2 socket timeout'。
答案 1 :(得分:3)
如果我理解这个问题,你想要保护apache在从人们运行一些随机脚本时不被锁定。好吧,如果您运行的是不受信任的代码,我认为您还有其他需要担心的事情比apache更糟糕。
也就是说,您可以使用一些配置指令来调整更安全的环境。下面这两个非常有用:
WSGIApplicationGroup - 设置WSGI应用程序所属的应用程序组。它允许为每个用户分隔设置 - 同一应用程序组中的所有WSGI应用程序将在处理请求的进程的同一Python子解释器的上下文中执行。
WSGIDaemonProcess - 为运行的应用程序配置不同的守护程序进程。守护进程可以作为与Apache子进程通常运行的用户不同的用户运行。该指令接受了许多有用的选项,我将列出其中一些:
user=name | user=#uid
,group=name | group=#gid
:
定义应该运行守护进程的用户/组的UNIX用户和组名称或数字用户uid或组gid。
stack-size=nnn
为守护进程中mod_wsgi创建的每个线程对应的堆栈分配的虚拟内存量(以字节为单位)。
deadlock-timeout=sss
定义在检测到Python GIL可能出现死锁之后,守护进程关闭并重新启动之前允许通过的最大秒数。默认值为300秒。
您可以阅读有关配置指令here的更多信息。