django:通过nginx提供静态文件

Pla*_*own 37 django nginx

我正在为django使用apache + mod_wsgi.
并且所有css/js /图像都通过nginx.
出于某种奇怪的原因,当其他人/朋友/同事尝试访问该网站时,jquery/css没有为他们加载,因此页面看起来混乱了.

我的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>
Run Code Online (Sandbox Code Playgroud)

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

    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/;    
         }    
     }   
Run Code Online (Sandbox Code Playgroud)

有一个目录/opt/aa/webroot/static/已相应cssjs目录.

奇怪的是,当我访问它们时页面显示正常.
我已经清除了我的缓存/等,但是从各种浏览器中我可以正常加载页面.

另外,我没有在nginx日志文件中看到404任何错误.

任何指针都会很棒.

mik*_*725 76

我认为root在位置块中使用是不正确的.我使用alias它并且工作正常,即使没有重新配置django.

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

# nginx server config
server {   
    ...
    location /static {    
        autoindex on;    
        alias /opt/aa/webroot/;    
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会让事情变得更简单.

  • 实际上,`alias`是服务整个目录的正确方法. (9认同)
  • 同样适用于我,因为/ static和/ static /是不同的位置,在第二个变体中我总是得到nginx的权限错误. (5认同)
  • 对于任何阅读本文的人。Nginx 文档明确指出,“当位置与指令值的最后一部分匹配时,最好使用 root 指令代替” http://nginx.org/en/docs/http/ngx_http_core_module.html#alias 另请参阅此答案: http://serverfault.com/a/278359 (2认同)

Ale*_*rov 15

  1. server_name必须与link/ scriptURL 中的主机名匹配.将您的配置声明为此接口的默认配置:port pair(listen 8000 default)
  2. Nginx必须侦听主机IP绑定的接口(在您的情况下似乎没问题)


use*_*384 6

我也为此感到挣扎。但是,以下技巧对我有用:

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/;    
     }    
 } 
Run Code Online (Sandbox Code Playgroud)

我只是将static标记为regex,^nginx开始提供静态文件。无需在Django端进行修改。


小智 5

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

所以这可以改为

<script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.3.2.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

此外,它更标准地使用静态文件app templatetag,如下所示:

{% load static from staticfiles %}
<script type="text/javascript" src="{% static 'js/jquery-1.3.2.min.js' %}"></script>
Run Code Online (Sandbox Code Playgroud)

文件在这里