Apache with virtualenv and mod_wsgi : ImportError : No module named 'django'
Apache with virtualenv and mod_wsgi : ImportError : No module named 'django'
我正在尝试使用以下 Apache 配置为一个小的 django 项目提供服务:
Apache 虚拟主机配置:
<VirtualHost *>
ServerName servername
[...]
<Directory "/path/to/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages
WSGIScriptAlias / /path/to/project/project/wsgi.py
</VirtualHost>
我还有以下 wsgi.py :
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
我可以提供 STATIC 文件和 MEDIA 文件。
我还检查了权限并尝试递归使用 755,然后 777 到我的 virtualenv 的站点包目录。没用。
但是当我尝试访问我的网站的根目录时,我得到以下信息:
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
我猜这是一个 Python 路径 相关的问题,因为 django 安装在我的 virtualenv 中。但是我将相关的 python 路径添加到 WSGIDaemonProcess
的 python-path
属性,所以我不明白为什么它不起作用。
我想我也可以 add the relevant directory to my Python path in my wsgi.py by using the site
module,但我想了解为什么我尝试的 Apache 配置不够。我错过了什么吗?
您在 WSGIScriptAlias
上缺少 WSGIProcessGroup
指令或等效选项,因此您的应用程序实际上并不是 运行 在您设置虚拟环境的那个守护进程组中.
我还建议确保将应用程序组设置为“%{GLOBAL}”,如果这是您 运行正在守护进程组中的唯一应用程序。
因此使用:
WSGIScriptAlias / /path/to/project/project/wsgi.py \
process-group=project application-group=%{GLOBAL}
虚拟环境最好使用python-home
。
WSGIDaemonProcess project python-path=/path/to/project \
python-home=/path/to/Envs/venv
参见:
我的代表还没有超过 50 岁,所以我不能发表评论,但我想分享我的发现。
在 WSGIDaemonProcess 中,如果您使用的是 Python 3.5,则需要完全按照@graham-dumpleton 的说法进行设置,使用
python-home=/path/to/Envs/venv
明确设置。
但是,如果您使用的是 Python 3.4(或据我所知,某些旧版本 Python,例如 2.7),则必须将其配置为
python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages
就像提问者所做的那样。
真奇怪。
对我来说,问题是我为 python2 安装了 mod wsgi。我不得不为 python3:
重新安装它
sudo apt-get install libapache2-mod-wsgi-py3
我的问题是我 运行 libapache2-mod-wsgi-py3
python 版本 3.9。当我将 python 版本回滚到 3.7 时,没有问题。
我正在尝试使用以下 Apache 配置为一个小的 django 项目提供服务:
Apache 虚拟主机配置:
<VirtualHost *>
ServerName servername
[...]
<Directory "/path/to/project/project">
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess project python-path=/path/to/project:/path/to/Envs/venv/lib/python3.5/site-packages
WSGIScriptAlias / /path/to/project/project/wsgi.py
</VirtualHost>
我还有以下 wsgi.py :
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
application = get_wsgi_application()
我可以提供 STATIC 文件和 MEDIA 文件。
我还检查了权限并尝试递归使用 755,然后 777 到我的 virtualenv 的站点包目录。没用。
但是当我尝试访问我的网站的根目录时,我得到以下信息:
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
我猜这是一个 Python 路径 相关的问题,因为 django 安装在我的 virtualenv 中。但是我将相关的 python 路径添加到 WSGIDaemonProcess
的 python-path
属性,所以我不明白为什么它不起作用。
我想我也可以 add the relevant directory to my Python path in my wsgi.py by using the site
module,但我想了解为什么我尝试的 Apache 配置不够。我错过了什么吗?
您在 WSGIScriptAlias
上缺少 WSGIProcessGroup
指令或等效选项,因此您的应用程序实际上并不是 运行 在您设置虚拟环境的那个守护进程组中.
我还建议确保将应用程序组设置为“%{GLOBAL}”,如果这是您 运行正在守护进程组中的唯一应用程序。
因此使用:
WSGIScriptAlias / /path/to/project/project/wsgi.py \
process-group=project application-group=%{GLOBAL}
虚拟环境最好使用python-home
。
WSGIDaemonProcess project python-path=/path/to/project \
python-home=/path/to/Envs/venv
参见:
我的代表还没有超过 50 岁,所以我不能发表评论,但我想分享我的发现。
在 WSGIDaemonProcess 中,如果您使用的是 Python 3.5,则需要完全按照@graham-dumpleton 的说法进行设置,使用
python-home=/path/to/Envs/venv
明确设置。
但是,如果您使用的是 Python 3.4(或据我所知,某些旧版本 Python,例如 2.7),则必须将其配置为
python-path=/path/to/project:/path/to/Envs/venv/lib/python3.4/site-packages
就像提问者所做的那样。
真奇怪。
对我来说,问题是我为 python2 安装了 mod wsgi。我不得不为 python3:
重新安装它sudo apt-get install libapache2-mod-wsgi-py3
我的问题是我 运行 libapache2-mod-wsgi-py3
python 版本 3.9。当我将 python 版本回滚到 3.7 时,没有问题。