Django - 使用 mod_wsgi 的 Apache 未能提供静态文件服务

5
我正在使用Apache和mod_wsgi来提供项目和静态文件。我使用了官方文档"如何使用Django与Apache和mod_wsgi",一切都正常,但是找不到静态文件。我还没有找到任何好的方法来调试这个问题,甚至得到一个能指向错误的具体信息。到目前为止我所做的事情包括:双重检查静态文件是否正确地放置在静态文件目录中,并且它们被collectstatic收集了;检查文件权限。

settings.py:

[..]
DEBUG = False
STATIC_ROOT = '/var/www/djangoProject/static-files'
STATIC_URL = '/static/'

Apache设置:

WSGIDaemonProcess djangoProject

WSGIProcessGroup djangoProjectGroup
WSGIApplicationGroup %{GLOBAL}

WSGIPythonHome /var/www/djangoProject/venv/lib/python2.7/site-packages
WSGIPythonPath /var/www/djangoProject/

WSGIScriptAlias / /var/www/djangoProject/djangoProject/wsgi.py
<Directory /var/www/djangoProject/djangoProject>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

Alias /static/ /var/www/djangoProject/static-files/
<Directory  /var/www/djangoProject/static-files>
    Require all granted
</Directory>

wsgi.py

import os, sys

sys.path.append('/var/www/djangoProject')
sys.path.append('/var/www/djangoProject/venv/lib/python2.7/site-packages')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Apache访问日志:

"GET /static/app01/css/default.css HTTP/1.1" 404 346 "http://example.com/"

apache2.conf:

Mutex file:${APACHE_LOCK_DIR} default

PidFile ${APACHE_PID_FILE}

Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

AccessFileName .htaccess

<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/

你是如何加载你的Apache配置文件的?能否展示一下你的主要httpd.conf文件? - lapinkoira
我已经包含了主要的apache2.conf文件。 - Sven Rojek
与静态文件无关,但是你设置Python虚拟环境的方式有点混乱。请确保阅读http://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html 以了解正确的操作方式。 - Graham Dumpleton
当您运行“ls -las /var/www/djangoProject/static-files”时,会得到什么结果? - Graham Dumpleton
它显示了“app01”和“admin”目录。 - Sven Rojek
1个回答

15

我发现了一个伟大的答案 "使用mod_wsgi和Django提供静态文件"。

  • 顺序很重要,静态文件的别名 必须 放在第一位。

Apache设置:

WSGIDaemonProcess djangoProject

WSGIProcessGroup djangoProjectGroup
WSGIApplicationGroup %{GLOBAL}

WSGIPythonHome /var/www/djangoProject/venv/lib/python2.7/site-packages
WSGIPythonPath /var/www/djangoProject/

Alias /static/ /var/www/djangoProject/static-files/
<Directory /var/www/djangoProject/static-files>
    Require all granted
</Directory>

WSGIScriptAlias / /var/www/djangoProject/djangoProject/wsgi.py
<Directory /var/www/djangoProject/djangoProject>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

3
谢谢您发布这篇文章。我的问题是没有仔细检查我的文档根目录,我花了8个小时来尝试修复它。不过这篇文章对我很有帮助。 - Brian Sanchez
1
救了我的一天!谢谢你! - Nabajyoti Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接