2010-03-16 4 views
32

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

Мои 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.

Любые указатели были бы замечательными.

ответ

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

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

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> 

В моих взглядов .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
Restarted апач

+1

Если у вас нет «местоположения/статического» и т. Д. В вашем nginx conf Django будет обслуживать статические файлы. Отлично подходит для тестирования и разработки, но не очень хорошая идея для производства. – ostergaard

63

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

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

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

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

+8

Действительно, 'alias' - это правильный метод для обслуживания целых каталогов. – xyzman

+5

То же самое работает для меня, потому что/static и/static/находятся в разных местах, а во втором варианте я всегда получал ошибку разрешения от nginx. – Dracontis

+1

Для всех, кто это читает. В документах Nginx четко указано, что «Когда местоположение совпадает с последней частью значения директивы, лучше использовать корневую директиву вместо этого» http://nginx.org/en/docs/http/ngx_http_core_module.html#alias Также см. Этот ответ : http://serverfault.com/a/278359 – PF4Public

5

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

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

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

Кроме того, его больше стандартного использовать StaticFile приложение templatetag как это:

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

Docs Here

3

я боролся с этим. Однако после трюк работал на меня:

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

Смежные вопросы