5

私は Pow と Nginx を使用して、開発中の Rails 4 アプリを提供しています。単純なファイルのアップロードで 500 エラーが返され、リクエストが Rails コントローラーに到達していません。Railsログにリクエストに関する言及がないため、これが当てはまると思います。エラーについての言及がなければ、ここで何が問題になっているのかわかりません。

私はAjaxファイルのアップロードから始めましたが、それを単純なフォームに置き換えましたが、これも機能していません。

これを試した

オリジナルアップロードボタン

そして、これに行きました

簡単アップロードフォーム

現在の avatar.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 エラーを返し、ログに言及されていないことについての他 の質問 ありますPostgres)

しかし、これらは 1 回限りのエラーであり、私が直面している問題とは関係がないようです。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.

更新 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_tempますuwsgi_temp。Nginx ワーカー プロセスはユーザーnobodyで実行され、これらのフォルダーにアクセスできませんでした。これらすべてのフォルダーをnobodyユーザーに投げかけましたが、それは役に立ちませんでした。

最後に、私はやった

client_body_temp_path /tmp/nginx/;my の 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 に答える