Обслуживание статических файлов на Apache с помощью Django (ошибка 404)

Я пытался настроить Apache (2.2.15) в качестве прокси с gunicorn и django (1.6.11) на сервере CentOS (6.7), но у меня возникла проблема со статическими файлами. (Я новичок в django)

Я уже просмотрел отличную документацию, которую предоставляет Django, а также несколько других сообщений stackoverflow, но безрезультатно.

Что я мог проверить:

  • Проблема, похоже, не связана с Django или шаблонами, поскольку запуск сервера разработки с 'DEBUG = False' и параметром '--insecure' работает нормально.
  • Вероятно, это проблема с блоком псевдонима и каталога, который я добавил в свой виртуальный хост, но я не могу понять, почему он не работает.
  • В Gunicorn не должно быть никаких слов, поскольку он не обслуживает статические файлы.

Как выглядит моя конфигурация:

1) Я поместил статические файлы моего проекта в / var / www / myproject / static благодаря команде collectstatic.

2) Затем я создал виртуальные хосты (где, я думаю, проблема):

(первый для перенаправления на HTTPS)

<virtualhost *:80>
    ServerAdmin [email protected]
    ServerName localhost

    ServerSignature Off
    RewriteEngine on

    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</virtualhost>

(второй для актуальной работы)

<virtualhost *:443>
    ServerAdmin [email protected]
    ServerName localhost

    ServerSignature Off

    DocumentRoot /var/www/myproject

    Alias /static/ "/var/www/myproject/static/"
    <Directory "/var/www/myproject/static">
    Order Allow,Deny
    Allow from All
    </Directory>

    ProxyPass / http://127.0.0.1:8000/ connectiontimeout=150 timeout=300
    ProxyPassReverse / http://127.0.0.1:8000/
    ProxyPreserveHost On
    ProxySet http://127.0.0.1:8000/ connectiontimeout=150 timeout=300

    ... here goes the SSL and Log configuration ...
</virtualhost>

После перезапуска службы мои статические файлы не загружались, и при их получении у меня была ошибка 404. Команда «httpd -S» не вызывала ошибок, а остальные функции веб-интерфейса работают отлично.

Я также пробовал без окончания '/' для псевдонима '/ static /', поскольку это казалось проблемой для некоторых других людей, попытался переместить файлы непосредственно в / var / www / myproject и получить к ним доступ без псевдонима с помощью DocumentRoot ...

Если вы хотите взглянуть на django settings.py (не знаю, актуален ли он, но некоторые гуру django тоже могут найти там что-то не так):

STATIC_ROOT = '/var/www/myproject/static/'
STATIC_URL =  '/static/'
STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static',),)

А также шаблоны:

{% load staticfiles %}
....
<link href="{% static 'bower_components/bootstrap/dist/css/boostrap.min.css %}" rel="stylesheet">

Urls.py проекта:

from django.conf.urls import patterns, include, url
from django.shortcuts import redirect
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    url(r'^$', lambda x: redirect('/Collecte/')),
    url(r'^Collecte/', include('Collecte.urls', namespace="Collecte")),
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

И urls.py приложения (названного "Collecte"):

from django.conf.urls import patterns, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from Collecte import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^Collectes/Execution/ù', views.CollExecution, name='CollExecution'),
    ... quite a lot of them ...
)

# Commented this line from a suggestion, was present at start
#urlpatterns += staticfiles_urlpatterns

Если вам кажется, что отсутствует какой-либо файл, чтобы вопрос был актуальным, просто попросите его, и я сделаю все возможное :).


person L. Fueyo    schedule 25.08.2015    source источник
comment
вы используете {% load staticfiles%} в верхней части шаблона?   -  person Ajay Gupta    schedule 25.08.2015
comment
Да, и он работает с сервером выполнения с параметром DEBUG, установленным на False, поэтому я не думаю, что он исходит из шаблонов. (хотя вы никогда не знаете)   -  person L. Fueyo    schedule 25.08.2015
comment
покажите свой urls.py статическим файлам сервера   -  person Ajay Gupta    schedule 25.08.2015
comment
Добавлен urls.py, не знаю, правда ли это то, что вы хотели.   -  person L. Fueyo    schedule 25.08.2015
comment
Включите свои директивы конфигурации прокси.   -  person Graham Dumpleton    schedule 25.08.2015
comment
Добавлены настройки прокси виртуального хоста.   -  person L. Fueyo    schedule 25.08.2015


Ответы (2)


Хорошо,

Я нашел ответ на свой вопрос в другом потоке stackoverflow с аналогичной конфигурацией. (но с флягой вместо django).

Как сказал Аджай Гупта, я думаю, что у меня возникла проблема в файле urls.py проекта, поскольку мне пришлось добавить static (settings.STATIC_URL, document_root = settings.STATIC_ROOT) (переключился с использования приложения staticfiles, которое django предоставляет для этого другой путь).

Другая проблема заключалась в конфигурации виртуального хоста apache, поскольку я хотел, чтобы мои статические файлы обслуживались apache, а не gunicorn или django. Я перенаправлял все на сервер Gunicorn, даже запросы к статическим файлам. Поэтому мне пришлось добавить ProxyPass / static /! так что apache обслуживает файлы.

Не знаю, правильно ли это делать, но у меня это сработало.

person L. Fueyo    schedule 25.08.2015
comment
Хороший, решил мою проблему обслуживания статики в моей настройке apache2 / uwsgi в той же конфигурации виртуального хоста - person tschale; 22.02.2018

from django.contrib.staticfiles.urls import staticfiles_urlpatterns - вспомогательная функция, которая работает только когда

debug = True

Так, например, просто снова установите debug = True, перезапустите сервер и проверьте

person Ajay Gupta    schedule 25.08.2015
comment
Не работает даже с debug = True. Я действительно не думаю, что проблема связана с django, поскольку проект, если он выполняется с сервера запуска (debug = False), работает нормально. Возможно, мне не хватает чего-то, что делает runserver, а apache - нет. - person L. Fueyo; 25.08.2015
comment
Я бы предложил получить доступ к одному статическому файлу в вашем браузере. может быть проблема с разрешениями - person Ajay Gupta; 25.08.2015
comment
Еще раз взглянув на свой ответ, а также на docs.djangoproject.com /en/1.6/ref/contrib/staticfiles/, думаю, проблема в том, что вы сказали. Но я действительно не знаю, как это решить (так как я не хотел бы иметь сервер с debug = True в производстве). - person L. Fueyo; 25.08.2015
comment
так проблема не в вашей конфигурации apache? Вы уверены? - person Ajay Gupta; 25.08.2015
comment
Я не уверен, потому что установка Debug = True в django тоже не работает ... не похоже на проблему с разрешениями, поскольку у пользователя есть разрешения на чтение для всех папок и файлов. - person L. Fueyo; 25.08.2015
comment
вы можете получить доступ к своему статическому файлу, используя абсолютный URL-адрес? - person Ajay Gupta; 25.08.2015
comment
Я не могу, есть ли в urls.py конфигурация, которую нужно добавить, чтобы вы могли получить доступ к своим статическим файлам? (Я получаю 404) - person L. Fueyo; 25.08.2015
comment
Да, есть. проверьте документацию. вам нужно добавить новый URL-адрес 'static', который будет указывать на ваш статический каталог - person Ajay Gupta; 25.08.2015
comment
Прочитав немного больше документации, я отредактировал свою конфигурацию django, и теперь я могу получить доступ к файлам через URL-адрес, если для параметра Debug установлено значение True (но все же нет, если для параметра Debug установлено значение False). Как сказал Аджай Гупта, мне не хватало записи static (settings.STATIC_URL, document_root = settings.STATIC_ROOT) в моем проекте urls.py. - person L. Fueyo; 25.08.2015