Загрузка файла не работает с Rails 4 в разработке с использованием Pow и Nginx

Я использую 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 без упоминания в журнале. нет записи в производственном журнале , Rails 3.2.13, ошибка 500 в разработке без журнала и Как правильно диагностировать ошибку 500 (Rails, Passenger, Nginx, Postgres)

Но это разовые ошибки, и они, похоже, не связаны с проблемой, с которой я столкнулся. Было бы здорово, если бы кто-нибудь мог указать мне в правильном направлении.

Обновление 1

Соответствующая строка из route.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"


person rohitmishra    schedule 01.02.2014    source источник
comment
Можете ли вы проверить метод: «ИСПРАВЛЕНИЕ» в вашей форме? Если это не так, будет хорошо, если вы сможете обновить файл маршрутов здесь.   -  person Sunil    schedule 01.02.2014
comment
Использование Patch не помогает. Я добавил соответствующий маршрут в вопрос.   -  person rohitmishra    schedule 01.02.2014


Ответы (1)


Проблема не в Rails, а в Nginx, что хорошо видно из файла nginx error.log. Этот вопрос помог мне понять, с чем я имею дело - Rails 3 + CarrierWave + nginx = разрешение отклонено .

Nginx использует директиву client_body_temp_path, чтобы указать место, где он будет временно хранить загруженные файлы от пользователя. запрос. Homebrew установил его по умолчанию на /usr/local/var/run/nginx. Эта папка также содержит fastcgi_temp, proxy_temp, scgi_temp и uwsgi_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 и журнал приложения, в каталог /log вашего приложения Rails. Это помогает в поиске ошибок в одном из них, когда вы сталкиваетесь с хитрой ошибкой.

person rohitmishra    schedule 01.02.2014
comment
Спасибо, @movingahead, добавление client_body_temp_path /tmp/nginx/; решил и мою проблему :-) - person jolyonruss; 25.06.2014
comment
Добавление client_body_temp_path /tmp/nginx/; у меня тоже работало!! это должно быть помечено как правильный ответ. - person marman; 02.07.2014
comment
Установка client_body_temp_path на что-либо под /tmp оказалось ненадежным, потому что OS X иногда очищала эти каталоги. Я вернулся, чтобы выяснить, почему исходные настройки по умолчанию, установленные во время установки (в разделе /usr/local/var/run/nginx), не работали, и обнаружил, что nginx необходимо установить разрешения на выполнение для всех каталогов-предков (источник: nginxlibrary.com/403-forbidden-error). В моем случае chmod o+x /usr/local/var устранил проблему без необходимости менять nginx.conf. - person exbinary; 12.01.2015
comment
Была полностью такая же проблема, даже изменение папок /usr/local/var/run/nginx не решило проблему с разрешениями, но client_body_temp_path /tmp/nginx/; ответил. Спасибо! - person Maksim Luzik; 28.04.2017
comment
Полностью спас меня здесь! Спасибо!! - person madav; 22.03.2020