我正在尝试使用以下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的site-package目录。它不起作用。
但是当我试图访问我的网站的根目录时,我得到以下内容:
from django.core.wsgi import get_wsgi_application
ImportError: No module named 'django'
我猜这是一个 Python路径相关的问题,因为django安装在我的virtualenv中。但是我在WSGIDaemonProcess
的{{1}}属性中添加了相关的python路径,所以我不明白为什么它不起作用。
我也猜我可以add the relevant directory to my Python path in my wsgi.py by using the site
module,但我想了解为什么我尝试的Apache配置还不够。我错过了什么吗?
答案 0 :(得分:19)
您在WSGIProcessGroup
上缺少WSGIScriptAlias
指令或等效选项,因此您的应用程序实际上并未在您设置虚拟环境的守护程序进程组中运行。
我还建议确保应用程序组设置为&#39;%{GLOBAL}&#39;如果这是您在守护程序进程组中运行的唯一应用程序。
因此使用:
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
请参阅:
答案 1 :(得分:4)
我的代表不超过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
就像提问者所做的那样。
真的很奇怪。
答案 2 :(得分:0)
对我来说,问题是我为python2安装了mod wsgi。我必须为python3重新安装它:
sudo apt-get install libapache2-mod-wsgi-py3
答案 3 :(得分:0)
我的问题是我在 python 3.9 版上运行 libapache2-mod-wsgi-py3
。当我将python版本回滚到3.7时,没有问题。