【问题标题】:Numpy ImportError when deploying Flask App using mod_wsgi/Apache2使用 mod_wsgi/Apache2 部署 Flask App 时出现 Numpy ImportError
【发布时间】:2017-04-07 04:27:34
【问题描述】:

我正在尝试通过 Apache2 Web 服务器在 AWS EC2(标准 Ubuntu AMI)上运行 Flask 应用程序。我的应用程序内部使用 Numpy。我已经测试了以下内容:

  1. 没有 Numpy,应用程序通过 Apache2 运行。使用 Numpy,它会在 import numpy 上跳闸并引发 500 服务器错误(请参阅下面的日志)。

  2. 使用 Numpy,应用程序在直接从命令行 (i.e. python app.py) 调用时运行良好。 numpy 位按预期工作,我可以从外部查询应用程序端点。

我还在import numpy as np 之前打印了系统路径(print sys.path),并确保相应的站点包目录位于路径中。我还手动指定了 WSGIPythonPath 以包含 site-packages 目录。我尝试将线程数设置为 1 并编辑 apache2.conf 文件。这些努力都没有成功。

下面是我的目录结构和相关文件的内容。

根文件夹/var/www/html/webserver_mockup

根文件夹内容

/var/www/html/webserver_mockup/app.wsgi /var/www/html/webserver_mockup/mockup/__init__.py /var/www/html/webserver_mockup/mockup/app.py

app.wsgi

(根据下面格雷厄姆的评论编辑)

#!/usr/bin/python
import sys
import site
site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages')
sys.path.insert(0, "/var/www/html/webserver_mockup")

from mockup.app import app as application    

/etc/apache2/sites-available/000-default.conf

(根据下面格雷厄姆的评论编辑)

WSGIPythonPath /usr/local/lib/python2.7/site-packages/

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    WSGIDaemonProcess webserver_mockup threads=5
    WSGIScriptAlias / /var/www/html/webserver_mockup/app.wsgi

    <Directory />
        WSGIProcessGroup %{GLOBAL}
        WSGIApplicationGroup %{GLOBAL}
        Order allow,deny
        Allow from all
    </Directory>
    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Apache 错误日志

[Fri Apr 07 04:09:41.062282 2017] [mpm_event:notice] [pid 7221:tid 
140325391972224] AH00489: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 
Python/2.7.12 configured -- resuming normal operations
[Fri Apr 07 04:09:41.062358 2017] [core:notice] [pid 7221:tid 
140325391972224] AH00094: Command line: '/usr/sbin/apache2'
[Fri Apr 07 04:09:46.770159 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332] mod_wsgi (pid=7225): Target 
WSGI script '/var/www/html/webserver_mockup/app.wsgi' cannot 
be loaded as Python module.
[Fri Apr 07 04:09:46.770300 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332] mod_wsgi (pid=7225): 
Exception occurred processing WSGI script 
'/var/www/html/webserver_mockup/app.wsgi'.
[Fri Apr 07 04:09:46.770370 2017] [wsgi:error] [pid 7225:tid 
 140325250004736] [client 24.6.50.183:58332] Traceback (most recent 
call last):
[Fri Apr 07 04:09:46.770432 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332]   File 
"/var/www/html/webserver_mockup/app.wsgi", line 7, in <module>
[Fri Apr 07 04:09:46.770534 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332]     from mockup.app import 
app as application
[Fri Apr 07 04:09:46.770612 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332]   File 
"/var/www/html/webserver_mockup/mockup/app.py", line 12, in 
<module>
[Fri Apr 07 04:09:46.770693 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332]     import numpy as np
[Fri Apr 07 04:09:46.770755 2017] [wsgi:error] [pid 7225:tid 
140325250004736] [client 24.6.50.183:58332] ImportError: No module 
named numpy

我的问题是:为什么 Apache2 没有找到 Numpy,尽管其路径中有适当的站点包?

【问题讨论】:

    标签: numpy apache2 mod-wsgi importerror


    【解决方案1】:

    这个:

    site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages/numpy')
    

    应该是:

    site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages')
    

    但无论如何,您设置 Python 虚拟环境的整个方式都不是最佳实践。建议您阅读:

    也尝试切换到守护模式,使用守护模式比使用嵌入式模式更好。

    【讨论】:

    • 感谢 Graham 及时回答问题。这是我第一次在mod-wsgi 中设置基于 Numpy 的应用程序。根据您的建议,我已将调用更改为 addsitedir()deamonized 流程。问题仍然没有解决。修改后的000-default.conf出现在上述问题中。
    • 另外,我没有使用虚拟环境。您是否建议使用 Virtualenvironment?
    • 另一个可能的原因是用户 Apache 运行您的代码时看不到您的主目录。通常对主目录的权限不允许其他人看到其中的内容。
    • 嗨,格雷厄姆,感谢您的评论。我已经找到了原因,但无法为此添加评论。如果您将此添加到您的答案中,我将很高兴接受它。
    【解决方案2】:

    numpy via pip 没有安装在 /home/ubuntu/.local/lib/python2.7/site-packages 但它应该在 /home/ubuntu/.local/lib64/python2.7/site-packages 或类似的东西。

    只需尝试在您的 app.wsgi 中添加另一个 site.addsitedir 到该文件夹​​即可。像这样:

    site.addsitedir('/home/ubuntu/.local/lib64/python2.7/site-packages')

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2012-12-26
      • 2015-11-21
      • 2017-03-03
      相关资源
      最近更新 更多