2009-08-03 222 views
9

我已经Django的通过WSGI运行这样停止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服务器挂起并没有响应与此backtrace

#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中,我将设置时间和内存的限制。

回答

13

它不是'死锁超时',你想要另一个指定的,这是为了一个非常特殊的目的,这将无助于在这种情况下。

就尝试使用mod_wsgi功能而言,您希望为WSGIDaemonProcess指令指定'inactivity-timeout'选项。

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

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

您真正需要实现的是应用程序代码中的HTTP请求超时。我不确定它在哪里,以及是否已经可用,但是Google搜索'urllib2套接字超时'。

+0

因此,python无法强健运行? Yikes ...听起来像我应该提交一个mod_wsgi功能请求。 – 2009-08-04 03:44:29

3

如果我很好地理解了这个问题,你想要防止Apache在运行一些随机脚本时被锁定。那么,如果你运行的是不受信任的代码,我认为你还有其他的事情需要担心,比apache更糟糕。

也就是说,您可以使用一些配置指令来调整更安全的环境。下面这两个是非常有用的:

  • WSGIApplicationGroup - 集合分组WSGI应用程序所属的应用程序。它允许为每个用户分开设置 - 同一应用程序组内的所有WSGI应用程序将在处理请求的进程的相同Python子解释器的上下文中执行。

  • WSGIDaemonProcess - 为运行应用程序配置不同的守护进程。守护进程可以以不同于Apache子进程通常运行的用户身份运行。该指令接受了很多有用的选项,我将列出其中一些:

    • user=name | user=#uidgroup=name | group=#gid

      定义的UNIX用户和组名名或数字用户ID或用户组GID /守护进程应该按照运行。

    • stack-size=nnn

      虚拟存储器的以字节为单位的量将要分配给对应于由在的mod_wsgi守护进程创建的每个线程的堆栈。

    • deadlock-timeout=sss

      定义的允许通过之前已经检测到上Python的GIL一个潜在的死锁后守护进程关闭并重新启动秒的最大数目。默认值是300秒。

你可以阅读更多关于配置指令here

+0

因此,300秒的超时是否意味着apache进程应该杀死我的python守护进程并重新启动它?因为整个Apache被锁定,无法使用。我需要更多线程吗?减?更多的流程? – 2009-08-03 21:14:21