【问题标题】:How to setup laravel file permission once and for all如何一劳永逸地设置 laravel 文件权限
【发布时间】:2021-01-13 14:47:55
【问题描述】:

我关注了这个answer 并做了以下事情:

sudo chown -R my-user:www-data /var/www/domain.com/
sudo find /var/www/domain.com/ -type f -exec chmod 664 {} \;
sudo find /var/www/domain.com/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data /var/www/domain.com/storage /var/www/domain.com/bootstrap/cache
sudo chmod -R ug+rwx /var/www/domain.com/storage /var/www/domain.com/bootstrap/cache

一切正常,但每当目录(在存储目录中)由 my-user 而不是 www-data 用户创建时,网络服务器就无法写入,反之亦然。除非我在创建目录后重新运行这些命令。

注意:有时我使用 my-user 运行创建目录的命令,有时使用 www-data 用户创建目录。 (在存储目录中)。

另外,my-user 已经在 www-data 组中。

如何避免权限错误?无需再次运行所有这些命令。

【问题讨论】:

  • 为什么不创建一个工匠命令。一旦您运行 artisan 命令,它就会在存储上创建一个具有您提供的名称的文件夹。然后也在相同的工匠命令上运行上述脚本。
  • 这个问题已经有答案了,请查看stackoverflow.com/questions/30639174/…
  • @AnkitJindal 您是否(完全)阅读了我的问题?我还没有在那里找到解决方案。如果您认为某个答案可以解决这个问题,可以直接链接到它

标签: php laravel nginx file-permissions laravel-7


【解决方案1】:

您提到您的用户与 www-data 用户属于同一组,因此来自this 的以下答案可能有效(我在 ubuntu 中尝试过,但类似的步骤可能在您的 *nix 操作系统中有效):

输入sudo gedit ~/.bashrc

查找任何umask 行并将其更改为umask 002,这意味着您和您的组可以为新文件和目录设置所有权限。在实践中,这意味着使用 664 权限创建新文件,使用 775 创建新目录

这应该涵盖使用您的用户帐户创建的新文件。当然,每次执行 sudo create this file 时都需要小心,因为这将为 root 用户创建它。

请注意,这不是一个完美的解决方案,因为仍然只有文件所有者和 root 用户可以做一些事情(例如更改所有者或权限),但它可能会涵盖大多数其他情况

【讨论】:

    【解决方案2】:

    sudo chown -R $USER:$USER * 在你的 laravel 项目文件夹的根目录下怎么样?
    要么
    sudo chown -R $USER:$USER [laravel folder name] 如果你在外部/在你的 laravel 文件夹/项目的父目录中?

    【讨论】:

    • /!\ 如果您错误地将上面的第一个命令运行在错误的文件夹中,它可能会严重破坏您的系统权限。尝试编写您的命令,这样您就不必单独使用通配符,尤其是当您要使用 sudo 执行该命令时。
    • 用“.”怎么样? ?
    • 可以理解,,,
    • "。"也不安全,因为如果您错误地在错误的目录中运行此命令,您可能会弄乱整个系统。有人不假思索地复制粘贴你的命令可能会犯这个错误。最安全的方法是提供完整路径sudo chown -R $USER:$USER /srv/www/myproject/,如果您曾经在错误的目录中运行此命令(例如,您在终端中按向上箭头并在不应该执行的位置执行命令),该命令将只适用到该特定文件夹。不是想教你,只是分享一个有用的提示:-)
    【解决方案3】:

    试试这个:

    # give the newly created files/directories the group of the parent directory 
    # e.g. the laravel group
    
    sudo find $project_Path/bootstrap/cache -type d -exec chmod g+s {} \;
    sudo find $project_Path/storage -type d -exec chmod g+s {} \;
    
    # let newly created files/directories inherit the default owner 
    # permissions up to maximum permission of rwx e.g. new files get 664, 
    # folders get 775
    
    sudo setfacl -R -d -m g::rwx ./storage
    sudo setfacl -R -d -m g::rwx ./bootstrap/cache
    

    【讨论】:

    • 我运行最后两个命令,应用程序抛出 500 服务器错误。
    • 你能给我500 server error的细节吗,请给我详细的异常。
    • 不抱歉,我无法复制该错误。可能是我的网站有问题。我真的不知道。
    【解决方案4】:

    一个 jr web 开发者的 webroot 区域出现了这个问题(我们阻止了他访问项目所在的一般 webroot 访问)。简单的解决方法是添加一个每分钟更改权限的 cronjob。

    【讨论】:

    • 一旦创建了目录,my-user 和 www-data 用户都应该可以立即访问它。如果不是,则会发生错误,因此延迟的 CronJob 将无法解决此问题。另外,正如问题中所述,我不希望重新运行命令。
    • 我不认为这是一个长期的方法
    【解决方案5】:

    我最好的解决方案是创建一个工匠命令。

    这样你就不用每次都使用linux创建文件夹和设置权限的方式了。

    所以创建一个执行如下的工匠命令

    php 工匠 createStorageFolder:FolderName

    这将自动将用户权限设置为 apache:apache 或类似的。如果没有也可以执行 linux/shell 命令来设置 artisan 方法的权限。

    【讨论】:

    • 这个“自动将用户权限设置为 apache:apache 或类似”如何?我看不出这如何回答我的问题。
    • 你可以在方法中运行 shell 命令。因此,只要在 storage 文件夹中创建文件夹,就可以在 artisan 命令中使用 shell 脚本设置权限。
    【解决方案6】:

    选项 1 将 www-data 组添加到我的用户:

    sudo adduser www-data my-user
    

    选项 2 将 php-fpm 的用户更改为 my-user (ref):

    在www.conf中找到options user和group,修改为[my-user] group=mygroup

    【讨论】:

    • 我已经尝试将我的用户添加到 www-data 组,还是一样。您的选项二似乎不是一个安全的解决方案。
    • 如果您的服务器只有 1 个虚拟主机,那么它是 100% 安全的,如果不是只在一个虚拟主机上进行操作
    • 选项 2 是要走的路,有 0 个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2016-07-20
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多