WSGI:从守护进程收到的截断或过大的响应头

Sur*_*raj 14 django mod-wsgi apache2

系统配置:Apache2、Django 1.10、Python 3、Ubuntu 16.04 LTS

姜戈debug=True


/var/log/apache2/error.log

[52:53.057967] [wsgi:error] [pid 4303] [client 1.1.1.22:24409] Timeout when reading response headers from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.466726] [wsgi:error] [pid 4305] [client 1.1.1.10:9787] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.466729] [wsgi:error] [pid 4304] [client 1.1.1.4:18417] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.466726] [wsgi:error] [pid 4307] [client 1.1.1.22:35116] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.466756] [wsgi:error] [pid 4306] [client 1.1.1.22:19242] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.467164] [wsgi:error] [pid 4336] [client 1.1.1.4:34187] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.467212] [wsgi:error] [pid 4342] [client 1.1.1.22:28212] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py, referer: http://example.org/
[52:58.467282] [wsgi:error] [pid 4331] [client 1.1.1.22:31045] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py
[52:58.467426] [wsgi:error] [pid 4341] [client 1.1.1.70:22784] Truncated or oversized response headers received from daemon process 'example.org': /home/user/dir/project/main_app/wsgi.py, referer: http://example.org/
Run Code Online (Sandbox Code Playgroud)

我不知道错误的原因。但我已将其范围缩小到 Django wsgi 进程。由于服务器正确托管静态文件。

虽然 Cloudflare 有时会显示 502:Bad Gateway Error,但服务器本身会显示 500:Internal Server Error。

我已经尝试重新启动服务器并检查 Django 的(调试)日志文件。Django 日志文件中没有错误信息(根本没有)。


我应该如何调试问题?由于 Django 没有记录任何内容,我认为问题可能是在 wsgi 中引起的。

注意:服务器之前运行良好。我做了一些更改*(已恢复原样);Django shell 工作正常。

变化*

  1. 安装 django-pandas、django-model-utils、numpy、scikit-learn
  2. 一个利用上述库的程序。(此更改还原为原始)

在其他类似问题中,问题是在上传大文件时引起的。

Sur*_*raj 12

问题的原因是numpy

众所周知,Python C 扩展模块(如 numpy)在 mod_wsgi 下使用时会导致超时。

来源:Sean F从守护进程读取响应标头时回答超时

我在初始搜索中没有找到的类似问题由作者回答和解释mod_wsgi说-

一些使用 C 扩展模块的 Python 第三方包,包括 scipy 和 numpy,只能在 Python 主解释器中工作,不能在子解释器中使用,因为默认情况下使用 mod_wsgi。结果可能是线程死锁、不正确的行为或进程崩溃。

来源:Graham Dumpleton安装 scipy 后无响应 apache + mod_wsgi 的回答

解决方案

将以下行添加到您的httpd.conf. 在我的情况下,文件是/etc/apache2/apache2.conf.

WSGIApplicationGroup %{GLOBAL}
Run Code Online (Sandbox Code Playgroud)

  • 即使在我的 apache 配置中使用“WSGIApplicationGroup %{GLOBAL}”,我也会收到此错误。 (4认同)
  • 你能解释一下当你使用 "%{GLOBAL}" 时有什么变化吗? (2认同)

Cer*_*rin 7

正如其他人所提到的,这是由于许多潜在原因导致进程崩溃造成的。原因之一是某些 Python 依赖项不是线程安全的。

如果这是问题所在,一种解决方法是切换 Apache 的 MPM 类型。prefork 类型不使用线程,所以如果问题是由于线程误用导致 numpy 崩溃,那么应该可以解决它。worker 和 event 类型使用较少的内存,但也使用线程,因此它们可能会遇到此错误。

要确定您当前使用的是哪种类型,请运行:

apachectl -V | grep -i mpm
Run Code Online (Sandbox Code Playgroud)

如果您看到,Server MPM: prefork那么您已经在使用 prefork,这意味着错误的原因可能是其他原因。如果它显示“worker”或“event”,那么您可以通过运行以下命令切换到 prefork:

sudo a2dismod mpm_event
sudo a2dismod mpm_worker
sudo a2enmod mpm_prefork
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

请注意,prefork 的主要缺点是,由于它不使用线程,因此会消耗更多内存。

编辑:由于其他原因,我遇到了这个错误。最近,该问题是由 Ubuntu 预编译的 mod-wsgi 系统包中的一个 bug 以及 Python psycopg2 包中的一个 bug 引起的。

解决方案是从系统 mod-wsgi 切换到 Python 包,以及切换到 psycopg2-binary 包:

sudo apt purge libapache2-mod-wsgi*
sudo apt install apache2-dev
pip uninstall psycopg2
pip install mod_wsgi psycopg2-binary
Run Code Online (Sandbox Code Playgroud)

我还必须通过添加到顶部来更新我的 apache 站点配置文件:

LoadModule wsgi_module /usr/local/myproject/.env/lib/python2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so
Run Code Online (Sandbox Code Playgroud)

并将我的 WSGIDaemonProcess 语句更改为使用 python-home 而不是 python-path,类似于:

WSGIDaemonProcess myproject python-home=/usr/local/myproject/.env processes=5 threads=15 display-name=%{GROUP} user=www-data group=www-data
Run Code Online (Sandbox Code Playgroud)

我在 Python2.7 和 Python3.7 上都遇到过这个问题,解决方案是一样的,但是 mod_wsgi.so 的路径发生了变化。