2010-03-16 21 views
32

Ich benutze Apache + mod_wsgi für Django.
Und alle css/js/images werden über nginx bedient.
Aus irgendeinem Grund, wenn others/friends/colleagues versuchen, auf die Website zugreifen, ist jquery/cssnot getting loaded für sie, daher die Seite sieht durcheinander.django: Serving statische Dateien über nginx

Meine HTML-Dateien verwenden Code wie folgt -

<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> 

Meine nginx Konfiguration in sites-available wie das ist -

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

Es gibt ein Verzeichnis /opt/aa/webroot/static/ die css & js Verzeichnisse entsprechen.

Die seltsame Sache ist, dass die Seiten in Ordnung sind, wenn ich darauf zugreifen.
Ich habe meinen Cache/etc gelöscht, aber die Seite lädt für mich, von verschiedenen Browsern.

Auch ich sehe 404 keinen Fehler in den Nginx-Protokolldateien.

Alle Zeiger wären großartig.

Antwort

13
  1. server_name müssen Hostnamen in link/script URLs entsprechen. Entweder erklären, um Ihre Konfiguration als Standard für diese Schnittstelle: Port-Paar (listen 8000 default)
  2. Nginx auf der Schnittstelle hören müssen, wo Ihre Host-IP gebunden ist (scheint in Ihrem Fall ok)
3

Fim & Alexander - Danke Für die Hinweise halfen die.
Hier ist, wie ich es für alle im gleichen Boot stecken gelöst -

settings.py -

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

In meinem html -

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

In meiner Ansichten .py -

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

nginx in der sites-available Konfigurationsdatei -

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

erneut gestartet nginx
Neu gestartet Apache

+1

Es sei denn, Sie haben auch die "location/static" usw. in Ihrem nginx conf Django wird die statischen Dateien dienen. Gut zum Testen und Entwickeln, aber keine gute Idee für die Produktion. – ostergaard

63

Ich denke root in Position Block verwendet, ist nicht korrekt. Ich benutze alias und es funktioniert gut, auch ohne Django neu zu konfigurieren.

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

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

Hoffe, das macht die Dinge einfacher.

+8

"Alias" ist in der Tat die richtige Methode, um ganze Verzeichnisse zu bedienen. – xyzman

+5

Das gleiche funktioniert für mich, weil/static und/static/unterschiedliche Orte sind und in der zweiten Variante habe ich immer einen Berechtigungsfehler von nginx bekommen. – Dracontis

+1

Für jeden, der dies liest. Nginx Dokumente klar sagen, dass "Wenn Ort entspricht dem letzten Teil der Richtlinie Wert ist es besser, stattdessen die root-Direktive verwenden" http://nginx.org/en/docs/http/ngx_http_core_module.html#alias Siehe auch diese Antwort : http://serverfault.com/a/278359 – PF4Public

5

MEDIA_URL darf nicht zur Bereitstellung des statischen Inhalts wie js usw. verwendet werden. Django bietet eine separate STATIC_URL-Einstellungsoption, die verwendet werden kann.

So kann dies als

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

auch geändert werden, seine mehr Standard Static App TemplateTag wie folgt zu verwenden:

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

Docs Here

3

ich auch mit diesem zu kämpfen. Doch für mich folgenden Trick funktioniert:

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

ich markierte nur statisch als regex mit ^ und nginx gestartet statische Dateien dienen. Keine Änderung auf Django Seite wurde benötigt.

Verwandte Themen