使用 mod_wsgi/Apache2 部署 Flask App 时出现 Numpy ImportError
Numpy ImportError when deploying Flask App using mod_wsgi/Apache2
我正在尝试通过 Apache2 Web 服务器在 AWS EC2(标准 Ubuntu AMI)上获取 Flask 应用程序 运行。我的应用程序在内部使用 Numpy。我测试了以下内容:
没有Numpy,App通过Apache2运行。使用 Numpy,它会在 import numpy
上跳闸并抛出 500 服务器错误(请参阅下面的日志)。
使用 Numpy,应用程序在直接从命令行调用时运行良好 (i.e. python app.py
)。 numpy 位按预期工作,我可以从外部查询应用端点。
我还在 import numpy as np
之前打印了系统路径 (print sys.path
),并确保适当的站点包目录在路径中。我还手动指定 WSGIPythonPath
以包含站点包目录。我尝试将线程数设置为 1 并编辑 apache2.conf 文件。 None 这些努力取得了成功。
下面是我的目录结构和相关文件的内容。
根文件夹/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,尽管它的路径中有适当的站点包?
这个:
site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages/numpy')
应该是:
site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages')
但是您设置 Python 虚拟环境的整个方式无论如何都不是最佳实践。建议您阅读:
也尝试切换到守护模式,使用守护模式比嵌入模式更好。
numpy via pip 没有安装在 /home/ubuntu/.local/lib/python2.7/site-packages 但它应该在 /home/ubuntu/.local/lib64/python2.7/网站包或类似的东西。
只需尝试在您的 app.wsgi 中添加另一个 site.addsitedir 到该文件夹即可。像这样:
site.addsitedir('/home/ubuntu/.local/lib64/python2.7/site-packages')
我正在尝试通过 Apache2 Web 服务器在 AWS EC2(标准 Ubuntu AMI)上获取 Flask 应用程序 运行。我的应用程序在内部使用 Numpy。我测试了以下内容:
没有Numpy,App通过Apache2运行。使用 Numpy,它会在
import numpy
上跳闸并抛出 500 服务器错误(请参阅下面的日志)。使用 Numpy,应用程序在直接从命令行调用时运行良好 (
i.e. python app.py
)。 numpy 位按预期工作,我可以从外部查询应用端点。
我还在 import numpy as np
之前打印了系统路径 (print sys.path
),并确保适当的站点包目录在路径中。我还手动指定 WSGIPythonPath
以包含站点包目录。我尝试将线程数设置为 1 并编辑 apache2.conf 文件。 None 这些努力取得了成功。
下面是我的目录结构和相关文件的内容。
根文件夹/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,尽管它的路径中有适当的站点包?
这个:
site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages/numpy')
应该是:
site.addsitedir('/home/ubuntu/.local/lib/python2.7/site-packages')
但是您设置 Python 虚拟环境的整个方式无论如何都不是最佳实践。建议您阅读:
也尝试切换到守护模式,使用守护模式比嵌入模式更好。
numpy via pip 没有安装在 /home/ubuntu/.local/lib/python2.7/site-packages 但它应该在 /home/ubuntu/.local/lib64/python2.7/网站包或类似的东西。
只需尝试在您的 app.wsgi 中添加另一个 site.addsitedir 到该文件夹即可。像这样:
site.addsitedir('/home/ubuntu/.local/lib64/python2.7/site-packages')