Python 如何阻止WSGI挂起apache
我让django像这样运行WSGI: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
<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
: 定义守护进程应作为其运行的用户/组的UNIX用户名和组名或数字用户uid或组gidgroup=name | group=#gid
要为与mod_wsgi在守护进程中创建的每个线程相对应的堆栈分配的虚拟内存量(以字节为单位)stack size=nnn
定义在检测到Python GIL上的潜在死锁后关闭和重新启动守护进程之前允许通过的最大秒数。默认值为300秒死锁超时=sss
您可以阅读有关配置指令的更多信息。这不是您想要的另一个指令指定的“死锁超时”,这是为了一个非常特殊的目的,在这种情况下没有帮助 至于尝试使用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