Django / mod_wsgi / Apache-mod_wsgi未使用为其编译的Python版本-“ ModuleNotFoundError:没有名为'math'的模块”

问题描述

我正在尝试在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 [email protected]

        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",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()

是否有人知道此版本不匹配是问题所在,以及如何解决

解决方法

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

RUN docker-php-ext-install calendar
,

似乎您的版本不匹配。某些linux仍使用python 2.7作为默认值。

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

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