[Django]-Django : Serving static files through nginx

18πŸ‘

βœ…

  1. server_name must match hostname in link/script URLs. Either declare your configuration as default for this interface:port pair (listen 8000 default)
  2. Nginx must listen on the interface where your host’s IP is bound (seems ok in your case)

95πŸ‘

I think using root in location block is incorrect. I use alias and it works fine, even without re-configuring django.

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

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

Hope this makes things simpler.

πŸ‘€miki725

14πŸ‘

I also struggled with this. However, following trick worked for me:

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

I just marked static as a regex with ^ and nginx started serving static files. No modification on Django side was needed.

πŸ‘€Shiv

5πŸ‘

MEDIA_URL shall not be used to serve the Static content like js etc. Django provides a separate STATIC_URL settings option that can be used.

So this can be changed as

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

Also, its more standard to use staticfile app templatetag like this:

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

Docs Here

πŸ‘€umang agarwal

4πŸ‘

Fim & Alexander – Thanks for the hints those helped.
Here is how I solved it for anyone stuck in the same boat –

settings.py –

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

In my html –

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

In my views.py –

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

nginx inside the sites-available config file –

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

Restarted nginx
Restarted apache

πŸ‘€PlanetUnknown

Leave a comment