web-dev-qa-db-fra.com

django: service de 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, donc la page semble brouillée.

Mes fichiers html utilisent du code comme celui-ci -

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

    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 existe un répertoire /opt/aa/webroot/static/ qui ont les répertoires css & js correspondants.

La chose étrange est que les pages s'affichent bien lorsque j'y accède.
J'ai effacé mon cache/etc, mais la page se charge correctement pour moi, à partir de divers navigateurs.

De plus, je ne vois aucune erreur 404 dans les fichiers journaux nginx.

Tout pointeur serait formidable.

37
PlanetUnknown
  1. server_name doit correspondre au nom d'hôte dans link/script URL. Soit déclarer votre configuration par défaut pour cette interface: paire de ports (listen 8000 default)
  2. Nginx doit écouter sur l'interface où l'IP de votre hôte est lié (semble correct dans votre cas)
15
Alexander Azarov

Je pense que l'utilisation de root dans le bloc d'emplacement est incorrecte. J'utilise alias et cela fonctionne très 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.

74
miki725

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 statique comme expression régulière avec ^ et nginx ont commencé à servir des fichiers statiques. Aucune modification du côté Django côté était nécessaire.

6
user902384

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.

Cela peut donc être modifié comme

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

En outre, il est plus standard d'utiliser le modèle de fichier d'application staticfile comme ceci:

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

Documents ici

5
umang agarwal

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 à l'intérieur du fichier de configuration des sites disponibles -

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

nginx redémarré
Apache redémarré

3
PlanetUnknown