Carrierwave + NGINX rails 生产图像未显示
Carrierwave + NGINX rails production images not displaying
我已经部署了一个 rails 应用程序,允许用户上传照片并将其显示在另一个页面上,非常简单。我在开发中对其进行了测试,图像上传到 public 文件夹并正常显示。在生产和部署中,图像上传到服务器但未在页面上呈现。
仅我上传的图片出现 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"
来自您的日志:
用户请求:
/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
。
我已经部署了一个 rails 应用程序,允许用户上传照片并将其显示在另一个页面上,非常简单。我在开发中对其进行了测试,图像上传到 public 文件夹并正常显示。在生产和部署中,图像上传到服务器但未在页面上呈现。
仅我上传的图片出现 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"
来自您的日志:
用户请求:
/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
。