【问题标题】:Carrierwave + NGINX rails production images not displayingCarrierwave + NGINX 轨道生产图像不显示
【发布时间】:2016-08-24 22:58:27
【问题描述】:

我已经部署了一个 Rails 应用程序,它允许用户上传照片并将其显示在另一个页面上,非常简单。我在开发中对其进行了测试,图像上传到公用文件夹并正确显示。在生产和部署中,图像会上传到服务器,但不会在页面上呈现。

仅我上传的图片出现 404 错误,路径如下所示:

 http://IP-OF-APP/uploads/blog/name-of-image.jpg

我在另一个 S.O.文章提到将生产配置 serve_static_files 设置为 true。这并没有解决问题。

我认为这可能是 NGINX 没有获取上传路径的服务器配置,这里是我的 /sites-default/nginx.conf 文件。

upstream app {
  server unix: /home/deploy/MYAPPNAME/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name IP_ADDRESS_OF_SERVER;

  root /home/deploy/MYAPPNAME/public;

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://app;
    proxy_redirect off;
  }

  location ~ ^/(assets)/ {
    root /home/deploy/MYAPPNAME/shared/public
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location ~ ^/uploads/ {
    root /home/deploy/MYAPPNAME/shared/public;
    expires 24h;
    add_header Cache-Control public;
    break;
  }

  location ~ ^/(fonts|system)/favicon.ico/robots.txt {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

我还认为可能是图片没有正确上传到服务器,所以我通过 SSH 连接到服务器,发现上传的图片位于:

home/deploy/MYAPPNAME/shared/public/uploads/blog/name-of-image.jpg

还发现了我认为是相同的图像:

home/deploy/MYAPPNAME/current/public/uploads/blog/name-of-image.jpg

我的上传器如下所示:

class BlogUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file

  def store_dir
     'uploads/blog'
  end

  def extension_whitelist
     %w(jpg jpeg gif png)
  end

  process :resize_to_fit => [825, 825]

  #titles are validated to be unique
  def filename
     "#{model.title}"+".#{file.extension}" if original_filename.present?
  end
end

使用

Rails 4.2.6
Ruby 2.3.0
Carrierwave 0.11.0

编辑

所有其他静态图像、CSS 和 JS 都可以正常显示和渲染。

渲染上传图片时出现 NGINX 错误:

   2016/04/29 17:32:34 [error] 4993#0: *23 open()  "/home/deploy/MYAPPNAME/shared/public/assets/uploads/blog/name-of-image.jpg" fails (2: no such file or directory), client: *******, server: SERVER_IP, request: "GET /assets/uploads/blog/name-of-image.jpg HTTP/1.1", host: "SERVER_IP"

【问题讨论】:

  • 可以直接在浏览器中访问图片吗?
  • 不,在 chrome 中打开上传的图片我得到一个 nginx 404 not found 页面。
  • 并且访问甚至没有到达轨道,是吗?
  • 我不确定我明白你在问什么。 rails 应用程序的其余部分渲染和工作正常。静态图像、js、css 所有的东西都在正常显示和工作
  • 我的意思是图像取决于设置可以通过 nginx 或 rails(unicorn) 中间件输出五个....所以显示 nginx 日志的内容是什么

标签: ruby-on-rails nginx file-upload carrierwave


【解决方案1】:

从您的日志中:

用户正在请求:

/assets/uploads/blog/name-of-image.jpg

Nginx 正在寻找图片:

/home/deploy/MYAPPNAME/shared/public/assets/uploads/blog/name-of-image.jpg

您确认图片在:

home/deploy/MYAPPNAME/shared/public/uploads/blog/name-of-image.jpg

Nginx 正在查看public/assets/uploads,您的文件在public/uploads

【讨论】:

  • 不要!我们每个人都经历过很多次,这应该被视为日常常态! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多