Rails Errno::EACCES 权限被拒绝

31

在 Apache 开发环境下使用 Rails 3.1 Passenger,当我访问一个路由的索引页面(即执行 GET 请求)时,会得到以下错误信息:

Errno::EACCES in Crb_agendas#index

Showing /var/www/crbagenda/app/views/layouts/application.html.erb where line #5 raised:

Permission denied - /var/www/crbagenda/tmp/cache/assets/E2C

Extracted source (around line #5):

2: <html>
3: <head>
4:   <title>CrbAgendas</title>
5:   <%= stylesheet_link_tag "application" %>
6:   <%= javascript_include_tag "application" %>
7:   <%= csrf_meta_tags %>
8: </head>

Rails.root: /var/www/crbagenda

当我访问提到的路径(/var/www/crbagenda/tmp/cache/assets/E2C)时,没有E2C文件夹,并且根目录(apache运行的用户)拥有assets目录...不确定我在这里做错了什么....或者还能展示些什么来帮助解决。


1
对我们来说,当我们从 uglifier 切换到 terser 进行 JS 压缩时,出现了这个问题。我不得不在 Staging/Production 中运行 rails assets:clobber,然后重新部署,一切都正常了。 - Joshua Pinter
10个回答

18

更新:是的,这个答案最初来自于无知,然后似乎得到了认可。无论如何,真正的答案可以在奥斯汀·托梅克(Austen Tomek)的回答中找到。

通过对tmp目录执行chmod 777来解决了这个问题,所以我猜测这是由于我的用户/权限设置引起的无知。


这也解决了我的问题。谢谢。 - alexganose
4
这真的不是解决问题的方式。这就像是说你的钥匙无法打开前门,所以你只是把锁拆了,然后就这样算了。请看奥斯汀的答案,那是一个更好的解决方法。 - Joshua Pinter
1
@JoshPinter,我的回答受到了很多关注,这让我感到有些尴尬。我更新了我的回答,添加了一个指向Austen的回答的链接。 - ScottJShea
@ScottJShea 不错。公平地说,我只是在生产环境中临时修复了这个问题,以保持应用程序的运行,但后来在维护期间纠正了权限。感谢您更新您的答案。 - Joshua Pinter
1
如果你在更新答案时说另一个答案更正确,那么最好选择另一个问题作为被接受的答案。这可能有助于防止人们在不理解情况的情况下删除锁定。 - Holger Just
@ScottJShea 谢谢!Stack Overflow通过像这样的行动保持其质量。 - Holger Just

17

当我遇到这个错误并运行chmod 777不是解决方案时,我在查找过程中发现了这篇文章。

您需要研究如何启用组权限并适当地配置apache设置。以下是一个详细介绍这一点并包含有用链接的Stack Exchange线程。确保Apache对适当的目录具有读取、写入和执行访问权限,但不要简单地让任何人修改该目录。找到系统的Apache组并运行chownchmod -g+[Apache需要的权限放在这里]我建议不要使用-R选项运行此命令,并积极了解特定目录所需的Apache权限。有关Apache权限和权限的最佳Linux权限的Stack Exchange线程链接


1
这似乎不能充分回答问题。也可能需要使用find应用权限,例如 find . -type f -not -user $USER -exec chown $UID:$GID {} \; - Kaia Leahy

16

我完全删除了 tmp 文件夹,这对我有用。它会被 Web 服务器重新生成。


我正在使用 Windows 10 Enterprise 进行工作,这对我也起作用了。然而,在 Windows 10 Home 上它对我无效,我必须更改项目目录中的权限。 - Casivio

8

这对我很有用:

sudo chown -R username app_path

5
只需在项目文件夹上运行chown命令即可。
chown -R www-data /var/www/

3

当我在Ubuntu 20.04上开发一个Rails 6应用程序时,遇到了同样的问题。

每次我运行rails assets:clobber命令完全删除public/assets中的旧资源时,都会出现以下错误:

errno::enotempty: directory not empty @ dir_s_rmdir

errno::eacces: permission denied @ apply2files

日志指向导致此错误的文件路径,在我的情况下是public/packs/manifest.json文件。

我尝试删除它或更改权限,但没有效果。 我还尝试删除项目中的tmp目录,但也没有用。

以下是我解决问题的方法

我使用ls -lh命令列出了该目录中的所有文件和目录,得到了以下输出:

-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem 1.7K Oct  6 20:29 404.html
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem 1.7K Oct  6 20:29 422.html
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem 1.6K Oct  6 20:29 500.html
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem    0 Oct  6 20:29 apple-touch-icon.png
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem    0 Oct  6 20:29 apple-touch-icon-precomposed.png
drwxr-xr-x 3 promisechukwuenyem promisechukwuenyem 4.0K Oct 13 09:20 armstrong_tools
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem    0 Oct  6 20:29 favicon.ico
drwxr-xr-x 3 root               root               4.0K Oct  8 13:06 packs
-rw-rw-r-- 1 promisechukwuenyem promisechukwuenyem   99 Oct  6 20:29 robots.txt

我发现 packs 目录的所有者是 root,与其他文件和目录的权限不同:

drwxr-xr-x 3 root               root               4.0K Oct  8 13:06 packs

我只需运行以下命令,将所有权从root更改为promisechukwuenyem:
sudo chown -R promisechukwuenyem:promisechukwuenyem packs/

现在,当我运行命令rails assets:clobber完全删除旧的资产在public/assets时,它可以正常工作。

就是这样。

希望这能帮到你。


1
在Windows上,只需以管理员身份打开命令提示符并执行gem install "lib"命令。

1
我正在使用Windows的VS Code,并使用Ubuntu子系统作为终端。我不得不将我的项目文件夹从Ubuntu子系统区域移动到Windows区域。所以每次我在Ubuntu上运行东西时,我都必须输入cd /mnt/c/projects/my_app。这似乎可以让应用程序运行并使数据库/服务器正常运行。Rhys

请查看其他提供的答案。 - L. Guthardt

0
感谢以上的帖子,我也解决了自己的问题。个人认为,一个重要的文件夹被标记为“隐藏”(按照错误路径 Error: Permission denied - .../_netrc (Errno::EACCES))。当我右键单击并将其文件夹选项设置为非隐藏时,一切都正常工作了!

-1
在我的情况下,更改目录的权限或所有权没有帮助(尽管这是必要的)。事实证明 Selinux 启动了(在 Fedora 中默认启用),禁用它就是解决方法:
$ sudo setenforce 0

要使更改永久生效,必须更改/etc/selinux/config文件中的设置:
SELINUX=disabled

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