Django媒体文件不是在生产中服务,而是在开发中服务(localhost)?

时间:2017-11-20 10:39:39

标签: django-media

Django媒体文件在开发中服务但不在生产中。我通过Django管理员上传的任何图像它在本地主机上的网站上服务但是当我在数字海洋上生活我的网站时它没有显示。怎么解决这个问题可以任何人说出来?我的网站网址 - http://139.59.56.161点击图书测试菜单

1 个答案:

答案 0 :(得分:0)

恢复一个长期存在的问题,这是我能找到的所有帮助我的问题。记录我的后代答案。我的生产"环境使用nginx作为托管我的django应用程序的uwsgi前面的反向代理。解决方案是Django不提供生产中的文件;相反,你应该配置你的网络服务器来做到这一点。

Django在谈论静态文件然后说出媒体文件时有点无益:相同。'

所以,我认为最好在nginx服务器中预先捕获文件请求,以减少双重处理,并且您的前端Web服务器也是最优化的工作。

要做到这一点: 在/etc/nginx/sites-available/[site.conf中的服务器定义块中,定义webroot,即服务器文件系统上的目录,该文件系统涵盖了声明&root; [dir]的所有内容]'

server {
   listen 80;
   server_name example.com www.example.com;
   root /srv/;

下一个块告诉nginx将所有流量发送到运行django的uwsgi服务 - 我从示例中提取了holus bolus,可能是在digitalocean.com上。

     location / {
      proxy_pass   http://localhost:8000;
      proxy_set_header   Host   $host;
      proxy_set_header   X-Real-IP  $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   X-Client-Verify  SUCCESS;
      proxy_set_header   X-Client-DN   $ssl_client_s_dn;
      proxy_set_header   X-SSL-Subject  $ssl_client_s_dn;
      proxy_set_header   X-SSL-Issuer   $ssl_client_i_dn;
      proxy_read_timeout  1800;
      proxy_connect_timeout  1800;
      include uwsgi_params;
      uwsgi_pass   unix:/run/uwsgi/mysite6.sock;
      }

现在,这是我们在请求文件时需要提供的位。 try_files尝试提供$ uri然后$ uri /,并且最好放一个类似于' resource_not_found.html'的文件。在/ srv中并将其设置为try_files的最后一个回退,因此用户知道此部分已被无意留空。

location /static/ {
    try_files $uri $uri/ ;
 }
location /media/ {
 try_files $uri $uri/ ;
}
}

结束了我们的http服务器块,因此额外关闭"}"。

或者,您可以通过设置静态地图'来获取uwsgi。或者' static-map2'。 '静电地图' "吃"映射的url部分,而static-map2添加它。

 static-map /files=/srv/files

表示/files/funny.gif的请求将提供/srv/files/files.gif。

 static-map2 /files=/srv 

会做同样的事情,因为它需要/files/funny.gif请求并查找/srv/files/funny.gif。根据uwsgi文档,您可以根据需要创建尽可能多的映射,甚至可以创建相同的uri,并且将按照外观顺序检查它们。 Damnit,我刚才终于找到了nginx open source的文档。

uwsgi docs