设置Apache以提供django管理文件
在我的apache.conf文件中(请参阅下面的代码),VirtualHost端口80配置工作正常。但是,在端口443中,设置Apache以提供django管理文件,django,python-2.7,django-admin,mod-wsgi,askbot,Django,Python 2.7,Django Admin,Mod Wsgi,Askbot,在我的apache.conf文件中(请参阅下面的代码),VirtualHost端口80配置工作正常。但是,在端口443中,Alias/admin/media//usr/local/lib/python2.7/site packages/django/contrib/admin/media/显示了两个问题: my settings.py有:STATIC\u URL='/m/'和ADMIN\u MEDIA\u PREFIX=STATIC\u URL+'ADMIN/' 我的管理目录是:/home/u
Alias/admin/media//usr/local/lib/python2.7/site packages/django/contrib/admin/media/
显示了两个问题:
- my settings.py有:
和STATIC\u URL='/m/'
ADMIN\u MEDIA\u PREFIX=STATIC\u URL+'ADMIN/'
- 我的管理目录是:
/home/user/project/virtual environment/lib/python2.7/site packages/django/contrib/admin/static/admin/
Alias/m/admin//home/user/project/virtual environment/lib/python2.7/site packages/django/contrib/admin/static/admin/
时,显示错误403禁止访问。
当我加上:
<Directory "/home/user/project/virtual-environment/lib/python2.7/site-packages/django/contrib/admin/static/admin/">
Require all granted
</Directory>
<Directory "/home/user/project/">
<Files django.wsgi>
Require all granted
</Files>
</Directory>
我的django.wsgi文件如下:
import os
import sys
import time
import traceback
import signal
current_directory = os.path.dirname(__file__)
parent_directory = os.path.dirname(current_directory)
module_name = os.path.basename(current_directory)
sys.path.append(parent_directory)
sys.path.append(current_directory)
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % module_name
from django.core.wsgi import get_wsgi_application
try:
application = get_wsgi_application()
print 'WSGI without exception'
except Exception:
print 'handling WSGI exception'
# Error loading applications
if 'mod_wsgi' in sys.modules:
traceback.print_exc()
os.kill(os.getpid(), signal.SIGINT)
time.sleep(2.5)
您的配置有许多错误或次优的地方 首先,当使用mod_wsgi守护进程模式并且只有一个应用程序时,建议强制使用主Python解释器上下文。这就避免了某些第三方Python模块与Python子解释器不兼容的问题。为此,请添加:
WSGIApplicationGroup %{GLOBAL}
到两个VirtualHost
定义
第二个问题是,您的SSLVirtualHost
没有将WSGI应用程序委派在与非SSLVirtualHost
定义的相同mod_WSGI守护进程组中运行。您需要添加到SSLVirtualHost
:
WSGIProcessGroup askbot2
无需向SSLVirtualHost
添加WSGIDaemonProcess
指令,因为它是在非SSLVirtualHost
中对该设置进行反向操作,以避免应用程序的多个副本。现在,您有一个更大的问题,即SSL变体在嵌入式模式下运行,这是一个更不理想的场景
第三,在设置Python虚拟环境时,应该使用Python home
选项来引用Python虚拟环境的根目录,而不是使用Python path
来引用站点包。有关详细信息,请参见:
第四个问题是如何处理Django初始化失败的问题。在创建WSGI应用程序对象时,不需要使用try/except。如果使用mod_wsgi守护进程模式,您应该做的是使用现代mod_wsgi版本(不太可能是您的操作系统包提供的旧版本),并在WSGIDaemonProcess
指令上设置startup timeout
选项。如果WSGI脚本文件未能在特定时间内加载,该选项将自动强制重新启动进程。有关该选项的详细信息,请参阅:
如果您不打算这样做,您至少需要向exception部分添加一个raise
,以便将异常传播回mod_wsgi,以便它知道无法加载wsgi脚本文件。如果没有,mod_wsgi认为wsgi脚本文件加载得很好,但是,当它查找应用程序时,
找不到它,因此会生成404响应,并显示错误。是否有原因您没有定义静态\u ROOT
并运行python manage.py collectstatic
将所有静态文件收集到一个位置,然后使用别名引用该位置。您通常不会从Python安装目录中引用静态文件。请参阅关于管理员静态文件的内容,我已经选中了这些文件,它们位于“/home/user/project/static/admin/”,但是当我执行“Alias/m/admin/home/user/project/static/admin”时,它们不会被渲染。请advice@GrahamDumpleton:我一直在测试“Alias/m/admin/home/user/project/static/admin”,但管理员应用程序继续显示,没有格式设置。我是否要就此问题提出新问题?关于上面的第三点,正如我的“WSGIPythonHome/home/user/project/virtual environment/local”一样/“设置在我的apache.conf文件的顶部,是否可以保留python路径?要么是WSGIPythonHome
值错误,要么是python路径
值错误。一个说虚拟环境在虚拟环境/本地
,另一个说虚拟环境在虚拟环境
。最好的办法是去掉WSGIPythonHome
并用WSGIRestrictEmbedded On
替换它,以确保Python不会在正常的Apache子进程中初始化。然后,使用python-home
(而不是python-path
和site-packages
)引用虚拟环境根目录。请参阅链接的虚拟环境文档。
WSGIProcessGroup askbot2