设置Apache以提供django管理文件

设置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

在我的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/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
定义

第二个问题是,您的SSL
VirtualHost
没有将WSGI应用程序委派在与非SSL
VirtualHost
定义的相同mod_WSGI守护进程组中运行。您需要添加到SSL
VirtualHost

WSGIProcessGroup askbot2
无需向SSL
VirtualHost
添加
WSGIDaemonProcess
指令,因为它是在非SSL
VirtualHost
中对该设置进行反向操作,以避免应用程序的多个副本。现在,您有一个更大的问题,即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