Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何阻止WSGI挂起apache_Python_Django_Apache_Mod Wsgi - Fatal编程技术网

Python 如何阻止WSGI挂起apache

Python 如何阻止WSGI挂起apache,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我让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/me

我让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>
整个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 ()
在DebianApache2.2.11-7上

同样,我们是否可以得到保护,免受:

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

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

如果我能很好地理解这个问题,那么您希望在运行一些随机脚本时保护apache不被锁定。如果您运行的是不受信任的代码,我认为您还需要担心比apache更糟糕的事情

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

  • WSGIApplicationGroup-设置WSGI应用程序所属的应用程序组。它允许为每个用户单独设置—同一应用程序组中的所有WSGI应用程序将在处理请求的流程的同一Python子解释器的上下文中执行

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

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

      定义守护进程应作为其运行的用户/组的UNIX用户名和组名或数字用户uid或组gid

    • stack size=nnn

      要为与mod_wsgi在守护进程中创建的每个线程相对应的堆栈分配的虚拟内存量(以字节为单位)

    • 死锁超时=sss

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


您可以阅读有关配置指令的更多信息。

这不是您想要的另一个指令指定的“死锁超时”,这是为了一个非常特殊的目的,在这种情况下没有帮助

至于尝试使用mod_wsgi功能,您需要WSGIDaemonProcess指令的“非活动超时”选项

即使如此,这也不是一个完整的解决方案。这是因为“非活动超时”选项专门用于检测守护进程的所有请求处理是否已停止,而不是每请求超时。如果守护进程是单线程的,它只相当于每个请求超时。除了有助于解除进程的锁定外,如果在这段时间内没有任何请求到达,该选项还将产生重新启动守护进程的副作用

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


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

那么,有了300秒的超时时间,是否意味着apache进程应该杀死我的python守护进程并重新启动它?因为整个apache被锁定,无法使用。我需要更多的线程吗?较少的更多进程?那么python就没有办法稳健地运行了?哎呀。。。听起来我应该提交mod_wsgi功能请求。请求mod_wsgi功能请求没有意义。无法中断处理请求的线程是Python的一个限制。难道不能中断线程吗?还是我遗漏了什么?在Apache/mod_中,wsgi线程是由Apache创建的,而不是由Python创建的,请求通常不使用主线程,因此中断主线程的函数没有任何用处。
def handler(request) :
    while (1) :
        pass