0

Django 媒体文件在开发中服务,但不在生产中。无论我通过 Django admin 上传什么图像,它都会在本地主机上的网站上提供服务,但是当我将我的网站放在数字海洋上时,它不会显示。任何人都可以告诉如何解决这个问题?我的网站网址- http://139.59.56.161 点击图书测试菜单

4

1 回答 1

0

复活一个早已死去的问题,这是我在这里能找到的所有帮助我的方法。记录我的答案以备后人。我的“生产”环境在托管我的 django 应用程序的 uwsgi 前使用 nginx 作为反向代理。解决方案是 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 服务 - 我从可能在 digitalocean.com 上的一个示例中提取了它 holus bolus。

     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 服务器块,因此额外关闭了“}”。

或者,您可以通过设置 'static-map' 或 'static-map2' 让 uwsgi 执行此操作。'static-map' “吃掉”映射的 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,并且它们将按出现顺序进行检查。该死的,我刚刚终于找到了nginx 开源的文档。

uwsgi 文档

于 2018-05-09T01:09:11.400 回答