django:通过nginx提供静态文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django:通过nginx提供静态文件相关的知识,希望对你有一定的参考价值。

我正在为django使用apache + mod_wsgi。 所有的css / js / images都是通过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>

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

有一个目录/opt/aa/webroot/static/有相应的cssjs目录。

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

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

任何指针都会很棒。

答案
  1. server_name必须与link / script网址中的主机名匹配。将您的配置声明为此接口的默认配置:端口对(listen 8000 default
  2. Nginx必须侦听主机IP绑定的接口(在您的情况下似乎没问题)
另一答案

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

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

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

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

另一答案

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

所以这可以改为

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

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

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

Docs Here

另一答案

我也在努力解决这个问题。但是,以下技巧对我有用:

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方面。

另一答案

Fim&Alexander - 感谢那些有帮助的提示。 以下是我为那些被困在同一条船上的人解决的问题 -

settings.朋友 -

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

在我的views.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

以上是关于django:通过nginx提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

docker、nginx、django 以及如何提供静态文件

Django 不使用 NGINX + GUNICORN 提供静态文件

Nginx 不提供 Django 管理静态文件

使用 Docker、nginx 和 gunicorn 提供 Django 静态文件

如何在 Docker 上使用 Nginx 和 Django 提供静态文件?

Nginx 无法在数字海洋上提供 django 静态或媒体文件