django: подача статических файлов через nginx - PullRequest
36 голосов
/ 16 марта 2010

Я использую apache + mod_wsgi для django.
И все css / js / images обслуживаются через nginx.
По какой-то странной причине, когда другие / друзья / коллеги пытаются получить доступ к сайту, jquery / css не загружается для них, поэтому страница выглядит запутанной.

Мои HTML-файлы используют такой код -

<link rel="stylesheet" type="text/css" href="http://x.x.x.x:8000/css/custom.css"/>
<script type="text/javascript" src="http://1x.x.x.x:8000/js/custom.js"></script>

Моя конфигурация nginx в sites-available выглядит так -

    server {   
         listen   8000;   
         server_name  localhost;

         access_log  /var/log/nginx/aa8000.access.log;    
         error_log  /var/log/nginx/aa8000.error.log;    

           location / {   
               index  index.html index.htm;    
           }    

         location /static/ {    
            autoindex on;    
            root   /opt/aa/webroot/;    
         }    
     }   

Существует каталог /opt/aa/webroot/static/ с соответствующими каталогами css & js.

Странно то, что страницы открываются нормально, когда я к ним обращаюсь.
Я очистил свой кеш / и т. Д., Но страница загружается нормально для меня из разных браузеров.

Кроме того, я не вижу 404 ошибок в файлах журнала nginx.

Любые указатели были бы великолепны.

Ответы [ 5 ]

74 голосов
/ 03 февраля 2012

Я думаю, что использование root в блоке местоположения неверно. Я использую alias, и он отлично работает, даже без перенастройки django.

# django settings.py
MEDIA_URL = '/static/'

# nginx server config
server {   
    ...
    location /static {    
        autoindex on;    
        alias /opt/aa/webroot/;    
    }
}

Надеюсь, это все упростит.

14 голосов
/ 16 марта 2010
  1. server_name должен соответствовать имени хоста в link / script URL. Либо объявите вашу конфигурацию по умолчанию для этого интерфейса: пара портов (listen 8000 default)
  2. Nginx должен прослушивать интерфейс, к которому привязан IP-адрес вашего хоста (в вашем случае это нормально)
5 голосов
/ 17 октября 2016

Я тоже с этим боролся. Однако у меня сработал следующий трюк:

server {   
     listen   8000;   
     server_name  localhost;

     access_log  /var/log/nginx/aa8000.access.log;    
     error_log  /var/log/nginx/aa8000.error.log;    

       location / {   
           index  index.html index.htm;    
       }    

     location ^/static/ {    
        autoindex on;    
        root   /opt/aa/webroot/;    
     }    
 } 

Я только что пометил static как регулярное выражение с ^, и nginx начал обслуживать статические файлы. Никаких изменений на стороне Django не требовалось.

5 голосов
/ 08 октября 2014

MEDIA_URL не должен использоваться для обслуживания статического контента, такого как js и т. Д. Django предоставляет отдельную опцию настроек STATIC_URL, которую можно использовать.

Так что это можно изменить как

<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>

Кроме того, более стандартно использовать тег шаблона приложения staticfile, например:

{% load static from staticfiles %}
<script type="text/javascript" src="{% static 'js/jquery-1.3.2.min.js' %}"></script>

Документы здесь

3 голосов
/ 16 марта 2010

Fim & Alexander - Спасибо за подсказки, которые помогли.
Вот как я решил это для всех, кто застрял в одной лодке -

settings.py -

>MEDIA_ROOT = ''    
MEDIA_URL = 'http://x.x.x.x:8000/static/'    

В моем html -

<script type="text/javascript" src="{{MEDIA_URL}}js/jquery-1.3.2.min.js"></script>

В моих views.py -

return render_to_response('templates/login-register.html', {},
                          context_instance=RequestContext(request));    

nginx внутри конфигурационного файла, доступного для сайтов -

listen x.x.x.x:8000;    
server_name x.x.x.x.;

Перезапущен nginx
Перезапущенный апач

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...