Какой пользователь на самом деле пишет на диске в Ruby? Ошибка записи - PullRequest
1 голос
/ 02 декабря 2011

У меня следующая среда:

  • У меня есть сервер Ubuntu 10.10 с nginx, passenger, ruby 1.9.2, ror 3.*, postgresql (db здесь нет в игре)
  • У меня есть приложение, которое находится на /var/www/ (пример папки)
  • Мой пользователь стойки www-data (nginx пользователь также)

    www-data 21977 0,1 7,2 53324 44420? Sl Dec01 2:21 Стойка: / var / www /
    www-data 1187 0,0 0,4 10620 2468? S Nov24 2:47 nginx: рабочий процесс

  • Моя папка /var/www/public принадлежит www-data и находится в 755

    drwxr-xr-x 7 www-data www-data 4096 2011-12-02 16:13 public

И я получаю следующую ошибку (соответствующие части):

Errno::EACCES in AnswerLinesController#export_csv
Permission denied - public/survey_70_result_csv.csv
app/controllers/answer_lines_controller.rb:647:in `initialize'
app/controllers/answer_lines_controller.rb:647:in `open'
app/controllers/answer_lines_controller.rb:647:in `export_csv'

Затем я поворачиваю свою папку /public на 775, тот же результат. Затем я включаю свою папку /public в 777, работает! Ради забавы я снова пытаюсь превратить мою папку /public в 755. Это работает.

  1. Как Ruby (или Ruby On Rails?) Фактически управляет правами / разрешениями?
  2. Есть ли какие-либо разрешения или кэширование записи?
  3. Кто на самом деле пишет на диске? Пользователь Ruby? (В таком случае www-data?)
  4. Как объяснить тот факт, что сначала он не работает в 755, затем он работает в 777, а затем, наконец, работает в 755? Кто вызывает проблемы? Слой файловой системы или модуль записи на диск в Ruby, который будет сбит с толку?

Или это ошибка в Ruby?

Ответы [ 2 ]

1 голос
/ 02 декабря 2011
  1. Это не Ruby и не Rails, которые управляют разрешениями.Это Пассажир.В основном это зависит от того, как вы настроили пассажира.Если он использует переключение пользователей (которое, я думаю, используется по умолчанию), он будет работать под пользователем, которому принадлежит файл config/environment.rb (для приложений Rails) или config.ru (для приложений Rack), если только он не был переопределен вконфиг.Вы можете прочитать больше об этом на http://modrails.com/documentation/Users%20guide%20Nginx.html#user_switching
  2. Не то, что я знаю, возможно, в файловой системе есть кэширование записи, но ни одно из них не должно влиять на разрешения в этом случае.
  3. См.номер один.
  4. Ну, это мое предположение: вы удалили файл перед повторной попыткой?Или вы изменили имя файла?Если нет, то, в соответствии с моим пониманием того, как он работает, у файла уже будет тот же владелец, который пытается записать в него, что означает, что процесс может делать с файлом все, что он хочет.Фактические права доступа к каталогу не имеют значения, если у процесса есть права на запись в файл.

(например, если вы удалите разрешение на чтение каталога, но сохранитечто касается файла, пользователь не сможет перечислить файлы в каталоге, но если он знает полное имя файла, он все равно сможет получить доступ к файлу)

0 голосов
/ 03 декабря 2011

Кстати, Джимми был прав на переключение пользователя.По сути, это была проблема с правами доступа пользователя (как я и думал), но я не мог ее понять.

Дело в том:

С Документация Phusion-Passenger о пользовательском значении по умолчанию: «Значением по умолчанию является никто.»

Что объясняет, почему я должен был установить доступ к моей публичной / папке на 777, а 775 не работал.

Я изменил свою конфигурацию nginx, добавив в блок сервера {}:

    passenger_user www-data;

Затем перезапустил все это, вернул мои права на общедоступные / папки на 755, а затем все заработало.

...