Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named 'math'

Posted

技术标签:

【中文标题】Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named \'math\'”【英文标题】:Django/mod_wsgi/Apache - mod_wsgi is not using the Python version it was compiled for - "ModuleNotFoundError: No module named 'math' "Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named 'math'” 【发布时间】:2020-12-03 11:58:22 【问题描述】:

我正在尝试在 Ubuntu 16.04.6 服务器上部署一个带有 Apache2 和 mod_wsgi 的 Django 应用程序,但我很难让 mod_wsgi 使用正确的 python 版本。

我从源代码安装了 mod_wsgi,configured it 用于针对系统 python3 进行编译,特别是 python3.7.8

我的 Django 应用虚拟环境也在运行 python3.7.8。

我的 VirtualHost 配置文件如下所示:

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName kumberas.com
        ServerAdmin webmaster@localhost.com

        WSGIScriptAlias / /home/dan/app/kumberas/kumberas/main/wsgi.py
        Alias /static/ /home/dan/app/kumberas/kumberas/static/

        <Directory /home/dan/app/kumberas/kumberas/static>
            Require all granted
        </Directory>

        <Directory /home/dan/app/kumberas/venv>
            Require all granted
        </Directory>

        <Directory /home/dan/app/kumberas/kumberas/main>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        <Location />
            AuthType Basic
            AuthName "Restricted Content"
            AuthUserFile /etc/apache2/.htpasswd
            Require user kr
            AuthBasicProvider file
        </Location>

        WSGIDaemonProcess kumberas \
            python-home=/home/dan/app/kumberas/venv \
            python-path=/home/dan/app/kumberas
        WSGIProcessGroup kumberas

    </VirtualHost>
</IfModule>

当我尝试访问该站点时,我的 Apache 错误日志中出现 500 错误和以下内容。

[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603] mod_wsgi (pid=21635): Failed to exec Python script file '/home/dan/app/kumberas/kumberas/main/wsgi.py'.
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603] mod_wsgi (pid=21635): Exception occurred processing WSGI script '/home/dan/app/kumberas/kumberas/main/wsgi.py'.
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603] Traceback (most recent call last):
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]   File "/home/dan/app/kumberas/kumberas/main/wsgi.py", line 12, in <module>
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]     from django.core.wsgi import get_wsgi_application
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]   File "/home/dan/app/kumberas/venv/lib/python3.7/site-packages/django/__init__.py", line 1, in <module>
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]     from django.utils.version import get_version
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]   File "/home/dan/app/kumberas/venv/lib/python3.7/site-packages/django/utils/version.py", line 1, in <module>
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]     import datetime
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]   File "/usr/lib/python3.7/datetime.py", line 8, in <module>
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603]     import math as _math
[wsgi:error] [pid 21635] [remote xx.xx.xx.xx:58603] ModuleNotFoundError: No module named 'math'

我做了一些挖掘,在 mod_wsgi 文档中找到了这个 wsgi.py 文件,用于检查 mod_wsgi 正在使用的 python 版本,并在我访问该站点时得到以下输出:

sys.version = '3.7.2 (default, Jan 23 2020, 09:44:10) \n[GCC 5.4.0 20160609]'
sys.prefix = '/home/dan/app/kumberas/venv'

我认为不匹配的 python 版本 3.7.8 != 3.7.2 是这里的问题,但据我所知,服务器上没有安装 python3.7.2,我已经重新安装了 mod_wsgi 几次以确保我将其配置为使用 3.7.8。

我还确认,在虚拟环境中,我 a) 能够使用 manage.py runserver 运行 Django 应用程序,并且 b) 可以在 Django shell 中手动运行 get_wsgi_application()

有没有人知道这个版本不匹配是否是问题,以及如何解决?

【问题讨论】:

我有完全相同的问题(使用 Bottle 而不是 Django)。我添加了一个赏金来尝试吸引一些答案。 您是否使用过 venv 或 virtualenv 来创建您的环境? 我只是在这里猜测,但是您是否尝试在“WSGIProcessGroup”之后移动“WSGIScriptAlias”。我不确定顺序在 Apache 配置文件中是否重要,但这是我会尝试的。我还会检查 os.path.dirname(sys.executable) 的输出是什么,以找出正在使用的 Python 可执行文件。最终,我会尝试将“站点包”添加到您的 python 路径中。 locate mod_wsgi.soldd /path/to/mod_wsgi.so|grep libpy - 这是否说明了构建 mod_wsgi 所使用的 python 版本? “我只是在这里猜测,” - 是的,确实。范围很重要,范围内的顺序不重要。 【参考方案1】:

如果已经使用virtualenv或virtualenvwrapper创建环境,则需要在wsgi.py中调用激活脚本:

python_home = '/home/dan/app/kumberas/venv'

activate_this = python_home + '/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

【讨论】:

【参考方案2】:

看起来您的版本可能不匹配。一些linux仍然默认使用python 2.7。

同时使用locate python和/或locate python3检查系统是否有多个版本的python

如果这是modwsgi 的问题,您可能更容易通过链接https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html 从源代码构建mod_wsgi

【讨论】:

以上是关于Django/mod_wsgi/Apache - mod_wsgi 没有使用为其编译的 Python 版本 - “ModuleNotFoundError: No module named 'math'的主要内容,如果未能解决你的问题,请参考以下文章

Django + mod_wsgi + apache2 - 子进程 XXX 仍然没有退出,发送一个 SIGTERM

Flask、mod_wsgi 和 Apache:ImportError