【问题标题】:Setting up Apache to serve the django admin files设置 Apache 以提供 django 管理文件
【发布时间】:2017-08-07 10:49:37
【问题描述】:

在我的 apache.conf 文件中(参见下面的代码°),VirtualHost 端口 80 配置工作正常。但是,在端口 443 中,Alias /admin/media/ /usr/local/lib/python2.7/site-packages/django/contrib/admin/media/ 显示了两个问题:

  • 我的 settings.py 有:STATIC_URL = '/m/'ADMIN_MEDIA_PREFIX = STATIC_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>

它显示错误 404 未找到,error_log 说:[wsgi:error] Target WSGI script '/home/user/project/django.wsgi' does not contain WSGI application 'application'

您能帮我配置我的 apache 虚拟主机端口 443 到服务器 django admin 应用吗?

°我的 apache.conf 文件如下:

#The following two directories must be both readable and writable by apache
WSGISocketPrefix /var/run/apache2/wsgi

#WSGIPythonEggs /var/python/eggs

# the following directory must be readable by apache
WSGIPythonHome /home/user/project/virtual-environment/local/

# NOTE: all urs below will need to be adjusted if
# settings.FORUM_SCRIPT_ALIAS is anything other than empty string (e.g. = 'forum/')
# this allows "rooting" forum at http://domain-name/forum, if you like

#replace default ip with real IP address
<VirtualHost *:80>
    ServerAdmin you@domain-name
    DocumentRoot /home/user/project/
    ServerName domain-name

    # aliases to serve static media directly
    Alias /m/ /home/user/project/static/
    Alias /upfiles/ /home/user/project/askbot/upfiles/
    <DirectoryMatch "/home/user/project/askbot/skins/([^/]+)/media">
        Require all granted
    </DirectoryMatch>
    <Directory "/home/user/project/askbot/upfiles">
        Require all granted
    </Directory>
    <Directory "/home/user/project/ask-skins">
        Require all granted
     </Directory>

     <Directory "/home/user/project//static">
        Require all granted
     </Directory>
     #must be a distinct name within your apache configuration
    WSGIDaemonProcess askbot2 python-path=/home/user/project:/home/user/project/virtua-environment/lib/python2.7/site-packages
    WSGIProcessGroup askbot2

    WSGIScriptAlias / /home/user/project//django.wsgi

    <Directory "/home/user/project/">
        <Files django.wsgi>
            Require all granted
        </Files>
    </Directory>

    # make all admin stuff except media go through secure connection
    <LocationMatch "/admin(?!/media)">
    RewriteEngine on
        RewriteRule /admin(.*)$ https://domain-name/admin$1 [L,R=301]
        </LocationMatch>
    CustomLog /var/log/apache2/domain-name/access_log common
    ErrorLog /var/log/apache2/domain-name/error_log
    LogLevel debug
</VirtualHost>

#again, replace the IP address
<VirtualHost *:443>
    ServerAdmin you@domain-name
    DocumentRoot /home/user/project/
    ServerName domain-name
    <LocationMatch "^(?!/admin)">
        RewriteEngine on
        RewriteRule django.wsgi(.*)$ http://domain-name$1 [L,R=301]
    </LocationMatch>
     SSLEngine on
     #your SSL keys
     SSLCertificateFile /etc/httpd/ssl.crt/server.crt
     SSLCertificateKeyFile /etc/httpd/ssl.key/server.key

    Alias /admin/media/ /usr/local/lib/python2.7/site-packages/django/contrib/admin/media/

    WSGIScriptAlias / /home/user/project/django.wsgi
     CustomLog /var/log/httpd/askbot/access_log common
     ErrorLog /var/log/httpd/askbot/error_log
</VirtualHost>

我的 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)

【问题讨论】:

  • 您是否有理由不定义 STATIC_ROOT 并运行 python manage.py collectstatic 将所有静态文件收集到一个位置,然后使用 Alias 引用它。您通常不会从 Python 安装目录中引用静态文件。见docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/…
  • 关于管理静态文件,我已经检查过它们位于“/home/user/project/static/admin/”但是当我执行“Alias /m/admin /home/user/项目/静态/管理员”它们没有被渲染。请指教
  • @GrahamDumpleton: 我一直在测试 ""Alias /m/admin /home/user/project/static/admin" 但管理应用程序继续显示而没有格式化。我应该为这个问题?

标签: django python-2.7 django-admin mod-wsgi askbot


【解决方案1】:

您的配置存在许多错误或次优问题。

第一个是当使用 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来引用site-packages。有关详细信息,请参阅:

第四个问题是您如何处理 Django 初始化失败。无需在创建 WSGI 应用程序对象时使用 try/except。如果使用 mod_wsgi 守护程序模式,您应该使用现代 mod_wsgi 版本(不太可能是您的操作系统软件包提供的古老版本),并在 WSGIDaemonProcess 指令上设置 startup-timeout 选项。如果 WSGI 脚本文件在一定时间内加载失败,该选项将自动强制重启进程。有关该选项的详细信息,请参阅:

如果你不打算这样做,你至少需要在 except 部分添加一个raise,以便将异常传播回 mod_wsgi,这样它就知道无法加载 WSGI 脚本文件。如果不这样做,mod_wsgi 会认为 WSGI 脚本文件加载正常,但是当它查找 application 时找不到它,因此会生成 404 响应和您看到的错误。

【讨论】:

  • 关于上面的第三点,因为我在我的 apache.conf 文件的顶部设置了“WSGIPythonHome /home/user/project/virtual-environment/local/”,可以保留 python -路径?
  • WSGIPythonHome 值错误,或者python-path 值错误。一个说虚拟环境在virtual-environment/local,另一个在virtual-environment。最好的办法是去掉WSGIPythonHome 并用WSGIRestrictEmbedded On 替换它,以确保Python 不会在正常的Apache 子进程中被初始化。然后,使用python-home(不是python-pathsite-packages)来引用虚拟环境根目录。请参阅链接的虚拟环境文档。
猜你喜欢
  • 2012-03-19
  • 2012-12-01
  • 1970-01-01
  • 2017-02-21
  • 2012-09-21
  • 2014-10-08
  • 2013-08-22
  • 2014-07-06
  • 2018-08-26
相关资源
最近更新 更多