5

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

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

试过这个

原始上传按钮

然后去了这个

简单上传表格

当前头像.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 中的请求标头

完整的请求标头

扩展的请求标头部分

扩展的请求标头部分

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 entryRails 3.2.13, 500 error in development with no log 以及如何正确诊断 500 错误(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"

4

1 回答 1

23

问题不在于 Rails,而在于 Nginx,从nginx error.log. 这个问题帮助我理解了我在处理什么 - Rails 3 +carrierwave + nginx = permission denied

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

最后,我做到了

client_body_temp_path /tmp/nginx/;在我的 HTTP 模块中nginx.conf使其工作。

ls -l节目

drwx------ 2 nobody wheel 68 Feb 1 14:44 nginx

我不知道为什么这在/tmp原来的内部而不是内部起作用/var/run/nginx。我相信当我使用其他临时文件夹或在生产中时我会遇到类似的问题。如果发生这种情况,将更新此线程。

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

于 2014-02-01T09:34:49.347 回答