问题描述
我正在尝试在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