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.
5 réponses
-
{[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
) - Nginx doit écouter sur l'interface où l'adresse IP de votre hôte est liée (semble ok dans votre cas)
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.
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>
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.]}
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.