2010-03-16 28 views
32

Estoy usando apache + mod_wsgi para django.
Y todos css/js/images se sirven a través de nginx.
Por alguna razón extraña, cuando others/friends/colleagues intenta acceder al sitio, jquery/css es not getting loaded para ellos, por lo tanto, la página parece desordenada.django: sirviendo archivos estáticos a través de nginx

Mis archivos HTML utilizan un código como éste -

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

Mi configuración de nginx en sites-available es así -

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

hay un directorio /opt/aa/webroot/static/ que se corresponde css & js directorios.

Lo curioso es que las páginas se muestran bien cuando accedo a ellas.
He borrado mi caché/etc, pero la página se carga bien para mí, desde varios navegadores.

Además, no veo 404 ningún error en los archivos de registro nginx.

Cualquier puntero sería genial.

Respuesta

13
  1. server_name debe coincidir con el nombre de host en link/script URL. O bien declarar la configuración por defecto para esta interfaz: par de puertos (listen 8000 default)
  2. Nginx debe escuchar en la interfaz donde se une IP de su host (parece que está bien en su caso)
3

Fim & Alexander - Gracias para los consejos que ayudaron.
Aquí es cómo lo resolví para cualquier persona atrapada en el mismo barco -

settings.py -

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

En mi html -

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

En mis puntos de vista .py -

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

nginx dentro del archivo de configuración sites-available -

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

nginx Restarted
Apache Recomenzó

+1

A menos que también tenga la "ubicación/estática", etc. en su nginx conf Django servirá los archivos estáticos. Está bien para pruebas y desarrollo, pero no es una buena idea para la producción. – ostergaard

63

Creo que usando root en el bloque ubicación es incorrecta. Uso alias y funciona bien, incluso sin volver a configurar django.

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

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

Espero que esto haga las cosas más simples.

+8

De hecho, 'alias' es el método adecuado para servir directorios completos. – xyzman

+5

Lo mismo funciona para mí, porque/static y/static/son ubicaciones diferentes y en la segunda variante siempre obtuve el permiso de nginx. – Dracontis

+1

Para cualquiera que lea esto. Los documentos de Nginx indican claramente que "cuando la ubicación coincida con la última parte del valor de la directiva, es mejor usar la directiva raíz en su lugar" http://nginx.org/en/docs/http/ngx_http_core_module.html#alias También vea esta respuesta : http://serverfault.com/a/278359 – PF4Public

5

MEDIA_URL no se debe utilizar para servir el contenido estático como js etc. Django proporciona una opción de configuración de STATIC_URL independiente que se puede utilizar.

Así que esto se puede cambiar como

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

Además, su más estándar a utilizar templatetag aplicación StaticFile así:

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

Docs Here

3

también tuve problemas con esto. Sin embargo, tras truco funcionó para mí:

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

acabo marcado estática como una expresión regular con ^ y nginx comenzó a servir archivos estáticos. No se necesitó ninguna modificación en el lado de Django.

Cuestiones relacionadas