ocean - django: sirviendo archivos estáticos a través de nginx
nginx django windows (5)
Estoy usando apache + mod_wsgi para django.
Y todas las css / js / images se sirven a través de nginx
.
Por alguna extraña razón, cuando otros / amigos / colegas intentan acceder al sitio, jquery / css no se carga para ellos, por lo tanto, la página parece desordenada.
Mis archivos html usan un código como este:
<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 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 tiene directorios css
& js
correspondientes.
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 punto sería genial.
-
server_name
debe coincidir con el nombre de host en las URL delink
/script
. O declare su configuración como predeterminada para esta interfaz: par de puertos (listen 8000 default
) - Nginx debe escuchar en la interfaz donde está vinculada la IP de su host (parece correcto en su caso)
Creo que usar root
en el bloque de ubicación es incorrecto. Yo 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.
MEDIA_URL no se utilizará para servir contenido estático como js, etc. Django proporciona una opción de configuración de STATIC_URL independiente que se puede usar.
Entonces esto puede cambiarse
<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>
Además, es más estándar para usar la etiqueta de la plantilla de archivo estático de esta manera:
{% load static from staticfiles %}
<script type="text/javascript" src="{% static ''js/jquery-1.3.2.min.js'' %}"></script>
También tuve problemas con esto. Sin embargo, el siguiente 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 de marcar static 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.
Fim y Alexander : gracias por los consejos que ayudaron.
Así es como 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 mi views.py -
return render_to_response(''templates/login-register.html'', {},
context_instance=RequestContext(request));
nginx dentro del archivo de configuración de sitios disponibles -
listen x.x.x.x:8000;
server_name x.x.x.x.;
Reinició nginx
Reiniciado apache