2010-03-16 118 views
32

我使用的是Apache + mod_wsgi for django。
并且所有css/js/images通过nginx服务。
对于一些奇怪的原因,当others/friends/colleagues尝试访问该网站,jquery/cssnot getting loaded他们,因此该页面看起来混乱起来。django:通过nginx提供静态文件

我的HTML文件中使用这样的代码 -

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

sites-available我的nginx的配置是这样的 -

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

有已相应css & js目录的目录/opt/aa/webroot/static/

奇怪的是,当我访问它们时页面显示正常。
我已经清除了我的缓存/ etc,但从各种浏览器加载的页面都很好。

此外,我没有看到404在nginx日志文件中的任何错误。

任何指针都会很棒。

回答

13
  1. server_name必须link/script的URL匹配的主机名。无论是宣布你的配置,默认为这个接口:端口对(listen 8000 default
  2. Nginx的必须在您的主机的IP绑定的接口进行监听(似乎确定你的情况)
3

鱼翅&亚历山大 - 谢谢为那些帮助的提示。
这是我如何解决它为任何人停留在同一条船上 -

settings.py -

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

在我的HTML -

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

在我的看法.py -

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

nginx的站点可用的配置文件里面 -

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

重启动nginx的
而重新启动Apache的

+1

除非你在你的nginx配置文件中还有“位置/静态”等Django将服务于静态文件。很好的测试和开发,但不是一个好主意的生产。 – ostergaard 2013-04-10 11:05:13

63

我认为使用root在位置块是不正确。我使用alias,它工作正常,即使没有重新配置Django。

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

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

希望这可以让事情变得更简单。

+8

的确,'alias'是服务整个目录的合适方法。 – xyzman 2012-04-25 12:27:35

+5

同样适用于我,因为/ static和/ static /是不同的位置,而在第二个变体中,我总是从nginx获得权限错误。 – Dracontis 2012-08-17 12:13:13

+1

对于阅读此内容的任何人。 Nginx的文档清楚地表明:“当位置匹配指令值的最后部分时,最好使用root指令代替”http://nginx.org/en/docs/http/ngx_http_core_module.html#alias另请参见此答案:http://serverfault.com/a/278359 – PF4Public 2015-11-22 23:17:43

5

MEDIA_URL不得用于像js等静态内容。Django提供了一个可以使用的单独的STATIC_URL设置选项。

所以这是可以改变的

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

此外,它的更标准使用staticfile应用templatetag这样的:

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

Docs Here

3

我也挣扎与此有关。但是,下面的技巧为我工作:

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

我只是静态标记的正则表达式与^和nginx的启动提供静态文件。 Django方面不需要修改。