我正在使用 Pow 和 Nginx 为开发中的 Rails 4 应用程序提供服务。一个简单的文件上传返回 500 错误并且请求没有到达 Rails Controller 。我认为是这种情况,因为 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 中的请求 header
扩展的请求 header 部分
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_temp
和 uwsgi_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/