django: подача статических файлов через nginx

Я использую apache+mod_wsgi для Django.
И все CSS / JS / изображения обслуживаются через 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 ответов

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

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

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

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

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

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

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/;    
     }    
 } 

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

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>

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

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
Перезапущенный апач

Другие вопросы по тегам