django: servir des fichiers statiques via nginx

J'utilise apache + mod_wsgi pour django.
Et toutes les images css/js / sont servies via nginx.
Pour une raison étrange, lorsque d'autres / amis / collègues essaient d'accéder au site, jquery/css ne se charge pas pour eux, d'où la page semble brouillée.

Mes fichiers html utilisent du code comme ceci -

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

Ma configuration nginx dans sites-available est comme ceci -

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

Il y a un répertoire /opt/aa/webroot/static/ qui ont correspondant css & js répertoires.

La chose étrange est-ce que les pages montrent bien quand j'y accède.
J'ai effacé mon cache/etc, mais la page se charge bien pour moi, à partir de différents navigateurs.

En outre, je ne vois aucune erreur 404 dans les fichiers journaux nginx.

Tout pointeur serait génial.

33
demandé sur sikerbela 2010-03-16 05:24:54

5 réponses

  1. {[0] } doit correspondre au nom d'hôte dans link/script url. Déclarez votre configuration par défaut pour cette paire interface: port (listen 8000 default)
  2. Nginx doit écouter sur l'interface où l'adresse IP de votre hôte est liée (semble ok dans votre cas)
13
répondu Alexander Azarov 2010-03-16 08:18:26

Je pense que l'utilisation de root dans le bloc d'emplacement est incorrecte. J'utilise alias et cela fonctionne bien, même sans reconfigurer django.

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

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

J'espère que cela rend les choses plus simples.

67
répondu miki725 2012-02-03 18:52:00

MEDIA_URL ne doit pas être utilisé pour servir le contenu statique comme js etc. Django fournit une option de paramètres static_url distincte qui peut être utilisée.

Donc cela peut être changé comme

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

En outre, il est plus standard d'utiliser StaticFile app templatetag comme ceci:

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

Docs Ici

5
répondu umang agarwal 2014-10-08 19:18:38

Fim & Alexander - Merci pour les conseils qui ont aidé.
Voici comment je l'ai résolu pour toute personne coincée dans le même bateau -

Settings.py -

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

Dans mon html -

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

Dans mon views.py -

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

Nginx dans le fichier de configuration des sites-disponible -

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

Redémarré nginx
Il N'y a pas de problème.]}

3
répondu PlanetUnknown 2012-07-03 16:49:23

J'ai aussi eu du mal avec ça. Cependant, l'astuce suivante a fonctionné pour moi:

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

Je viens de marquer static comme regex avec ^ et nginx a commencé à servir des fichiers statiques. Aucune modification du côté de Django n'était nécessaire.

3
répondu user902384 2016-10-17 09:34:17