在Ruby中实际写入磁盘的用户是什么?写错误

时间:2011-12-02 18:11:26

标签: ruby linux ruby-on-rails-3 file-io permissions

我有以下环境:

  • 我的Ubuntu 10.10服务器有nginxpassengerruby 1.9.2ror 3.*postgresqldb不在游戏中这里)
  • 我的应用程序位于/var/www/(示例文件夹)
  • 我的机架用户为www-datanginx用户)

      

    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的写入磁盘模块会混淆吗?
  5. 或者它是Ruby中的错误?

2 个答案:

答案 0 :(得分:1)

  1. 管理权限的不是Ruby也不是Rails。这是乘客。 基本上,这取决于您如何配置乘客。如果它使用用户切换(我认为是默认设置),那么它将在拥有文件config/environment.rb(对于Rails应用程序)或config.ru(对于Rack应用程序)拥有的用户下运行,除非已在配置中被覆盖。 您可以在http://modrails.com/documentation/Users%20guide%20Nginx.html#user_switching
  2. 上详细了解相关信息
  3. 我不知道,文件系统中可能存在写缓存,但在这种情况下不会影响权限。
  4. 见第一名。
  5. 嗯,这是我的猜测:你再次尝试之前删除了文件吗?或者您更改了文件名?如果不是,那么根据我对它是如何工作的理解,该文件将具有尝试写入它的相同所有者,这意味着该过程可以对文件做任何想做的事情。只要进程有权写入文件,目录的实际权限就无关紧要。
  6. (例如,如果删除目录的读取权限,但保留文件,用户将无法列出目录中的文件,但如果他知道完整的文件名,则仍然可以访问该文件)

答案 1 :(得分:0)

为了记录,Jimmy在user_switching上是正确的。它基本上是一个用户权限问题(正如我想的那样),但无法抓住它。

事情是:

Phusion-Passenger documentation关于默认用户值:“默认值为nobody。”

这解释了为什么我必须将我的公共/文件夹访问设置为777和775无效。

我通过添加服务器{}块修改了我的nginx配置:

    passenger_user www-data;

然后重新启动整个事情,将我的公共/文件夹权限设置为755,然后一切正常。

相关问题