python - 如何阻止 WSGI 挂起 apache

标签 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/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 ()

在 Debian Apache 2.2.11-7 上。

同样,我们可以防止:

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

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

最佳答案

这不是您想要的另一个人指定的“死锁超时”,这是出于非常特殊的目的,在这种情况下无济于事。

就尝试使用 mod_wsgi 功能而言,您需要 WSGIDaemonProcess 指令的“inactivity-timeout”选项。

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

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

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

关于python - 如何阻止 WSGI 挂起 apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223927/

相关文章:

python - 为什么 plotly express 比 plotly graph_objects 更高效?

python - Django 创建对象 - 使用 None 的默认值

php - 如何在 Web 服务器行为中更改文档根目录?

Python-摆公式

python - 如何将 Bokeh 图像叠加到 Bokeh GMap 上?

python - PyPy 的垃圾收集器需要阻止世界吗?

python - 从管理页面创建选择

python - 在 Django 中禁用 CSRF/XSRF 验证

php - upload_max_filesize 未反射(reflect)在 phpinfo() 中

web-services - 如何同时运行Apache(httpd)和Tomcat?