ruby-on-rails - 在使用 Pow 和 Nginx 开发的 Rails 4 中,文件上传不起作用

标签 ruby-on-rails nginx rack-pow

我正在使用 Pow 和 Nginx 为开发中的 Rails 4 应用程序提供服务。一个简单的文件上传返回 500 错误并且请求没有到达 Rails Controller 。我认为是这种情况,因为 Rails 日志中没有提到请求。没有提及错误,我不确定这里出了什么问题。

我从上传 Ajax 文件开始,但用一个同样不起作用的简单表单替换了它。

试过这个

Original Upload Button

然后去了这个

Simple Upload Form

当前头像.html.erb

<%= form_for @user, html: { multipart: true }, method: "post", url: '/settings/avatar/update', class: "", id: "update_avatar" do |f| %>
  <%= f.file_field :avatar, class: 'js-upload-photo-button js-change-avatar-btn', accept: 'image/png,image/gif,image/jpeg,image/jpg' %>
    <%= f.submit "Upload" %>
<% end %>

Chrome 中的请求 header

Full Request Headers

扩展的请求 header 部分

Expanded Request Headers section

nginx.log
127.0.0.1 - - [01/Feb/2014:11:28:26 +0530] "POST /settings/avatar/update HTTP/1.1" 500 643 "https://allotrop.dev/settings/avatar" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
pow access.log
[Sat Feb 01 2014 11:28:26 GMT+0530 (IST)] INFO [127.0.0.1] GET allotrop.dev /500.html
这里还有其他关于 Rails 返回 500 错误的问题,而日志中没有提及 rails 500 error no production log entry
, Rails 3.2.13, 500 error in development with no log
How to properly diagnose a 500 error (Rails, Passenger, Nginx, Postgres)

但这些都是一次性错误,似乎与我面临的问题无关。如果有人能指出我正确的方向,那就太好了。

更新 1

来自 routes.rb 的相关线路
post '/settings/avatar/update', to: 'settings#update_avatar'
更新 2

找到我的 nginx 错误日志。顺便说一句,如果您使用 Homebrew,它位于 /usr/local/Cellar/nginx/1.4.0/logs/error.log
nginx/error.log
2014/02/01 13:05:54 [crit] 8787#0: *85813 open() "/usr/local/var/run/nginx/client_body_temp/0000000010" failed (13: Permission denied), client: 127.0.0.1, server: *.dev, request: "POST /settings/avatar/update HTTP/1.1", host: "allotrop.dev", referrer: "https://allotrop.dev/settings/avatar"

最佳答案

问题不在于 Rails,而在于 Nginx,这在 nginx error.log 中非常明显。 .这个问题帮助我理解了我正在处理的问题 - Rails 3 + carrierwave + nginx = permission denied .

Nginx 使用 client_body_temp_path directive指定它将临时存储来自用户请求的上传文件的位置。 Homebrew 已将其默认设置为 /usr/local/var/run/nginx .此文件夹还包含 fastcgi_temp , proxy_temp , scgi_tempuwsgi_temp为了我。 Nginx 工作进程与用户 nobody 一起运行他们无法访问这些文件夹。我将所有这些文件夹添加到 nobody用户,但这并没有帮助。

最后,我做到了
client_body_temp_path /tmp/nginx/;在我的 nginx.conf 的 HTTP 模块中让它工作。

做一个ls -l节目
drwx------ 2 nobody wheel 68 Feb 1 14:44 nginx
我不知道为什么这在 /tmp 内有效而不是在原始 /var/run/nginx 中.我相信当我使用其他临时文件夹或在生产中时我会遇到类似的问题。如果发生这种情况,将更新此线程。

我建议将其他相关日志(如 nginx 访问和错误日​​志、pow 访问和应用程序日志)符号链接(symbolic link)到 /log。 Rails 应用程序的目录。当您遇到棘手的错误时,它有助于查找其中一个错误。

关于ruby-on-rails - 在使用 Pow 和 Nginx 开发的 Rails 4 中,文件上传不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21494979/

相关文章:

mysql - ruby on rails,嵌套属性,采用最高属性

ruby-on-rails - 何时使用 "validates_associated"v "validate => true"

Nginx-重定向域尾随点

ruby-on-rails - 在 Pow 上运行的 Rails 应用程序不会因/lib 目录中的更改而重新加载

ruby-on-rails - rails : How to get parallels running with Pow

jquery - 如何使用jquery在collection_select中进行onchange

ruby-on-rails - LoadError 无法自动加载常量消息

python - 在 nginx 上使用 Django 设置套接字

Nginx:将非 www 重定向到 www https

ruby-on-rails - 远程查看 pow.cx 提供的网页