Django 与 Apache 和 mod_wsgi:超时错误

yav*_*vor 2 python apache django mod-wsgi plotly

我正在尝试使用 Apache 和 mod_wsgi 在 CentOS 7 服务器上部署 Django 应用程序。该应用程序使用plotly库来创建图形,并且plotly使用orca应用程序将创建的图形导出为图像。我使用集成的 django Web 服务器测试了该应用程序 - 一切都运行良好。所以我根据官方文档设置了Apache和mod_wsgi。当我连接到 Apache 时,应用程序可以运行,但无法导出图表。浏览器最终出现网关超时错误。我将记录器消息插入到创建和导出图表的代码中。代码运行直到这一行:

static_image_bytes = plotly.io.to_image(figure, format='png', width=800, height=450) 
Run Code Online (Sandbox Code Playgroud)

此行应运行本地 Orca 应用程序并将figure对象转换为 PNG 图像字节。Orca 需要 X11 显示服务器,CentOS 安装时没有 GUI。我正在使用 Xvfb 来模拟 X11(根据 Orca 的 github 页面)。Orca 应用程序是从 github 下载的 AppImage。

/bin/逆戟鲸

#!/bin/bash
echo "`date` - ORCA STARTING with $@" >> /tmp/orca.log
xvfb-run /usr/u/s/orca-1.2.1-x86_64.AppImage "$@"
echo "`date` - ORCA FINISHED" >> /tmp/orca.log  
Run Code Online (Sandbox Code Playgroud)

另外,我尝试/bin/orca使用以下方法直接链接到 AppImage:

ln -s /usr/u/s/orca-1.2.1-x86_64.AppImage /bin/orca
Run Code Online (Sandbox Code Playgroud)

并将这一行添加到我的代码中:

plotly.io.orca.config.use_xvfb = True  
Run Code Online (Sandbox Code Playgroud)

阿帕奇错误日志:

[Thu Jul 11 14:15:27.353433 2019] [wsgi:info] [pid 6289] mod_wsgi (pid=6289): Attach interpreter ''.
[Thu Jul 11 14:15:27.356811 2019] [wsgi:info] [pid 6290] mod_wsgi (pid=6290): Attach interpreter ''.
[Thu Jul 11 14:15:27.373538 2019] [wsgi:info] [pid 6282] mod_wsgi (pid=6282, process='myapp', application=''): Loading Python script file '/usr/u/s/myapp/myapp/wsgi.py'.
[Thu Jul 11 14:15:27.380468 2019] [wsgi:info] [pid 6285] mod_wsgi (pid=6285): Adding '/usr/u/s/myapp' to path.
[Thu Jul 11 14:15:27.400423 2019] [wsgi:info] [pid 6283] mod_wsgi (pid=6283): Adding '/usr/u/s/myapp' to path.
[Thu Jul 11 14:15:27.401219 2019] [wsgi:info] [pid 6283] mod_wsgi (pid=6283, process='myapp', application=''): Loading Python script file '/usr/u/s/myapp/myapp/wsgi.py'.
[Thu Jul 11 14:15:27.419272 2019] [wsgi:info] [pid 6284] mod_wsgi (pid=6284): Adding '/usr/u/s/myapp' to path.
[Thu Jul 11 14:15:27.420060 2019] [wsgi:info] [pid 6284] mod_wsgi (pid=6284, process='myapp', application=''): Loading Python script file '/usr/u/s/myapp/myapp/wsgi.py'.
[Thu Jul 11 14:15:27.422329 2019] [wsgi:info] [pid 6285] mod_wsgi (pid=6285, process='myapp', application=''): Loading Python script file '/usr/u/s/myapp/myapp/wsgi.py'.
[Thu Jul 11 14:15:33.050402 2019] [wsgi:info] [pid 6419] mod_wsgi (pid=6419): Initializing Python.
[Thu Jul 11 14:15:33.077239 2019] [wsgi:info] [pid 6419] mod_wsgi (pid=6419): Attach interpreter ''.
[Thu Jul 11 14:25:38.116842 2019] [wsgi:error] [pid 6287] [client 192.168.1.12:57406] Timeout when reading response headers from daemon process 'myapp': /usr/u/s/myapp/myapp/wsgi.py, referer: http://192.168.1.13/myapp/reports/new/
[Thu Jul 11 14:25:38.116918 2019] [reqtimeout:info] [pid 6287] [client 192.168.1.12:57406] AH01382: Request body read timeout
Run Code Online (Sandbox Code Playgroud)

Apache httpd.conf


LogLevel info
TimeOut 600

LoadModule wsgi_module modules/mod_wsgi.so
WSGISocketPrefix /var/run/httpd/wsgi

WSGIDaemonProcess myapp python-home=/usr/u/s/env/myapp python-path=/usr/u/s/myapp threads=1 processes=32
WSGIScriptAlias /myapp /usr/u/s/myapp/myapp/wsgi.py process-group=myapp application-group=%{GLOBAL}

<Directory /usr/u/s/myapp>
Require all granted
</Directory>
Run Code Online (Sandbox Code Playgroud)

SELinux 设置为宽容模式。

我在 stackoverflow 上搜索了几个小时,尝试了 mod_wsgi 的各种解决方案和配置,但它们似乎都没有改变任何东西。请帮忙。感谢您的任何想法。

dmi*_*tri 5

我不知道以下内容是否解决了OP问题,但为了以防万一这对我添加一些上下文的人有帮助(我不确定OP上面的评论是什么意思)。

我正在绞尽脑汁地尝试让Google Python 客户端 Dialogflow库在 Apache 下使用 WSGI 和 SElinux 工作。我责怪 SElinux,但上面Deepak Kumar的评论给了我一个解决方案。

添加到 WSGI Apache 配置行

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

正如这里所建议的。