2010-03-16 1 views
32

sto usando Apache + mod_wsgi per Django.
E tutti gli css/js/images vengono serviti tramite nginx.
Per qualche strano motivo, quando others/friends/colleagues tenta di accedere al sito, jquery/css è not getting loaded per loro, quindi la pagina sembra mescolata.django: Serve file statici tramite nginx

miei file html utilizzare il codice come questo -

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

La mia configurazione nginx in sites-available è come questo -

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

V'è una directory /opt/aa/webroot/static/ che sono corrispondenti css & js directory.

La cosa strana è che le pagine mostrano bene quando li accedo.
Ho cancellato la cache/etc, ma la pagina si carica bene per me, da vari browser.

Inoltre, non vedo 404 errori nei file di log nginx.

Qualsiasi puntatori sarebbe grande.

risposta

13
  1. server_name deve corrispondere hostname in link/script URL. In entrambi i dichiarare la configurazione di default per questa interfaccia: coppia di porte (listen 8000 default)
  2. Nginx deve ascoltare sull'interfaccia dove IP del vostro ospite è legato (sembra ok nel tuo caso)
3

Fim & Alexander - Grazie per i suggerimenti quelli aiutati.
Ecco come ho risolto per chiunque bloccato nella stessa barca -

settings.py -

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

Nel mio html -

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

Nel mio punto di vista .py -

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

nginx all'interno del file di configurazione sites-available -

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

Restarted nginx
apache riavviato

+1

A meno che non si ha anche la "posizione/static" etc nel conf nginx Django servirà i file statici. Va bene per test e dev ma non è una buona idea per la produzione. – ostergaard

63

Penso che utilizzando root nel blocco posizione non è corretta. Io uso alias e funziona bene, anche senza riconfigurare django.

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

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

Spero che ciò renda le cose più semplici.

+8

Infatti, 'alias' è il metodo corretto per servire intere directory. – xyzman

+5

Lo stesso funziona per me, perché/static e/static/sono posizioni diverse e nella seconda variante ho sempre ricevuto l'errore di autorizzazione da nginx. – Dracontis

+1

Per chi legge questo. I documenti di Nginx affermano chiaramente che "Quando la posizione corrisponde all'ultima parte del valore della direttiva, è meglio usare invece la direttiva root" http://nginx.org/en/docs/http/ngx_http_core_module.html#alias Vedi anche questa risposta : http://serverfault.com/a/278359 – PF4Public

5

MEDIA_URL non devono essere utilizzati per servire il contenuto statico come js ecc Django fornisce un'opzione impostazioni STATIC_URL separato che può essere utilizzato.

Quindi questo può essere cambiato come

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

Inoltre, la sua più standard da utilizzare StaticFile app templatetag come questo:

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

Docs Here

3

Ho anche lottato con questo. Tuttavia, a seguito di trucco ha funzionato per me:

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

Ho appena segnato statico come una regex con ^ e nginx iniziato a servire i file statici. Non era necessaria alcuna modifica sul lato Django.