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 справочники.

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

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

любой указатели было бы здорово.

5 ответов


  1. server_name должно совпадать имя хоста в link/script URL-адреса. Либо объявите свою конфигурацию по умолчанию для этого интерфейса: Port pair (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/;    
    }
}

надеюсь, это упрощает дело.


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

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

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

кроме того, его более стандартным для использования staticfile App templatetag, как это:

{% 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 и внутри сайтов-доступен файл config -

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

перезапустить nginx и
перезапущен apache


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

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 не требовалось.