Подтвердить что ты не робот

Django: обслуживание статических файлов через nginx

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

В моих html файлах используется такой код -

<link rel="stylesheet" type="text/css" href="#" onclick="location.href='http://x.x.x.x:8000/css/custom.css'; return false;"/>
<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.

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Таким образом, это можно изменить как

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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 как regex с ^, а nginx начал обслуживать статические файлы. Никаких изменений на стороне Django не было.