/tmp目录权限被拒绝

26

我刚刚部署了一个运行在 Ruby 1.9.2 上的 Rails 3 应用程序,但是遇到了一些错误。

  1. application.css 没有被编译。所以我在 production.rb 中设置了预编译为 false;
  2. 然后我遇到了:cannot generate tempfile,所以我执行了 rake tmp:clear
  3. 现在我遇到了 ActionView::Template::Error (Permission denied - /srv/www/appname/tmp/cache/assets): 我还没有找到解决方法。

请帮忙解决。

10个回答

39

如果你的Web服务器运行在*nix上并且使用的user:grouphttp:http,那么执行以下操作:

sudo chown -R http:http /srv/www/appname/

还有一个愚蠢的问题,/tmp/cache/assets 是否存在?

如果存在,并且如 @leonel 指出的那样,你可能还需要更改权限:

chmod 777 /srv/www/appname/tmp/cache

在设置777权限时一定要小心,只有在验证权限问题后,才将其重置为最少权限。


4
那个命令会把所有权都给任何人吗?我必须将缓存的权限更改为drwxrwxrwx。 - leonel
1
@leonel 给出了正确的答案:chmod 777 /srv/www/appname/tmp/cache 对我解决了这个问题。 - kgadek
6
在赋予任何目录777权限时请小心:参见 修复建议“chmod 777”的答案 - JAL

8

很可能你正在使用Apache Passenger运行应用程序。

你需要将config/environment.rb的所有者更改为有权限访问应用程序文件夹的人。

chown -R www-data:www-data /path/to/app

4
  1. Make the tmp folder of your project writable:

    chown -R group:user /path/to/rails/app/tmp
    chmod -R 777 /path/to/rails/app/tmp
    
  2. In your console, run rake tmp:cache:clear

  3. Restart your application.


4
停止。不要这样做!这可能非常危险。请参见修复建议“chmod 777”的答案 - JAL
2
rake tmp:cache:clear 解决问题!只需要这个!!谢谢 - EderRoger

2
现在对于我们使用Windows的人来说 - 如果您是管理员并看到此错误信息
ActionView::Template::Error (Permission denied @ utime_failed) C:/User/..../tmp/cache/assets/sprochets/v3.0/E5/E5PZx-mq8.cache

那么这是Windows上的权限和所有权设置问题。您可以进入应用程序中的tmp文件夹,并在文件夹上为自己(用户)授予**读取,写入和执行**的权限。单击[此处][1]查看如何授予权限。
快速修复。打开终端并以管理员身份运行以下命令。
    takeown /f <location of your app tmp folder> /r /d y

然后重新启动你的服务器。

2

你可能没有以当前运行服务器的用户身份创建Rails应用程序。您可以粘贴ls -alh /srv/www/appname/tmp/cache/assets的输出,并告诉我们运行Web服务器的用户是谁?


不,我是在我的开发机上创建了这个应用程序,然后使用FTP将其上传到生产机器。我认为运行服务器的用户是root。我已经让它工作了,但我不得不更改缓存文件夹的权限为drwxrwxrwx。如果有更好的方法,请告诉我。这是ls-alh命令的输出:http://pastebin.com/v1sH5Qhb - leonel
1
不在nogroup组中的用户无法向您的文件夹写入。 您需要更改tmp文件夹的所有者/组。 - Marc Plano-Lesay

1
我们需要授予权限,以便系统根用户可以访问所需的目录。
sudo chmod 777 -R your_project_directory_to_be_access

在您的情况下,您可以使用以下内容:
sudo chmod 777 -R /srv/www/appname/tmp/

出于安全考虑,请记住以下内容:

chmod 777 赋予所有人读、写和执行权限,对大多数问题来说绝对是过度的。


1
我最近遇到了这个错误。Apache不能写入tmp目录。

无法生成临时文件 /tmp/RackRewindableInput2xxxxxxxxxxxxxxxxx' /app-lib/lib/ruby/1.8/tempfile.rb:52:ininitialize' app-dir/vendor/gems/rack-1.0.1/lib/rack/rewindable_input.rb:73:in new' app-dir/vendor/gems/rack-1.0.1/lib/rack/rewindable_input.rb:73:inmake_rewindable' app-dir/vendor/gems/rack-1.0.1/lib/rack/rewindable_input.rb:26:in read' app-dir/vendor/gems/rack-1.0.1/lib/rack/request.rb:134:inPOST'

我检查了tmp目录的权限,它有权限让所有组都可以写入它。 我更改了tmp目录的所有者,但也没有解决错误。

罪魁祸首是tmp目录中充满了太多的大文件,看起来某种方式下Apache没有足够的空间来写入这个新文件。 清除了所有的临时和旧文件。问题得到了解决。


1

我认为一个更好的解决方案是不给每个人管理tmp文件夹的权限,可以这样实现:

 sudo rake tmp:cache:clear

这将清空临时文件夹,当您再次运行rails server时,它将不会出现错误。

-1
在我的本地主机上,出现了这个错误,执行命令chmod 777 C:/Sites/project_name/tmp/cache/解决了我的问题。

-2

很可能您已经给了应用程序的主文件夹读取和执行模式的权限。但是,为了从应用程序生成新文件,您还需要为所需文件夹授予写入权限。例如:yUML使用tmp文件夹来生成文件。我给了tmp文件夹写入权限:

chmod -R 777 /usr/share/nginx/html/yuml_product/tmp

解决了我的问题。


2
停止!不要这样做!这可能非常危险。请参阅修复建议“chmod 777”的答案 - JAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接