我正在使用所有者设置为 _www:_www
的 Apache Web 服务器。我从不知道文件权限的最佳实践是什么,例如当我创建新的 Laravel 5 项目时。
Laravel 5 需要 /storage
文件夹是可写的。我找到了很多不同的方法来使它工作,我通常以递归方式使其 777
chmod 结束。我知道这不是最好的主意。
官方文档说:
Laravel 可能需要配置一些权限:存储和供应商中的文件夹需要 Web 服务器的写入权限。
这是否意味着网络服务器也需要访问 storage
和 vendor
文件夹本身,还是只需要访问它们的当前内容?
我认为更好的是更改 owner 而不是权限。我将 Laravel 的所有文件权限递归地更改为 _www:_www
,这使网站正常工作,就好像我将 chmod 更改为 777
。问题是现在我的文本编辑器每次我想保存任何文件时都会询问我密码,如果我尝试在 Finder 中更改任何内容,例如复制文件,也会发生同样的情况。
解决这些问题的正确方法是什么?
更改 chmod 更改文件的所有者以匹配 Web 服务器的所有者,并可能将文本编辑器(和 Finder?)设置为跳过询问密码,或者让它们使用 sudo 更改 Web 服务器的所有者以匹配 os 用户(我不知道后果)其他
777
太自由了,因为它包含了所有人的所有权限。
storage
和 bootstrap/cache
目录中的目录应该可以由您的 Web 服务器写入
只是为了让任何查看此讨论的人都明白......如果您授予任何文件夹 777 权限,则您允许任何人读取、写入和执行该目录中的任何文件......这意味着您已经给出任何人(全世界的任何黑客或恶意人员)都允许上传任何文件、病毒或任何其他文件,然后执行该文件......
如果您将文件夹权限设置为 777,则您已经向任何可以找到该目录的人打开了您的服务器。够清楚??? :)
基本上有两种方法可以设置您的所有权和权限。要么给自己所有权,要么让网络服务器成为所有文件的所有者。
Webserver 作为所有者(大多数人这样做的方式,以及 Laravel 文档的方式):
假设 www-data (它可能是别的东西)是您的网络服务器用户。
sudo chown -R www-data:www-data /path/to/your/laravel/root/directory
如果你这样做,网络服务器拥有所有文件,也是组,你将在上传文件或通过 FTP 处理文件时遇到一些问题,因为你的 FTP 客户端将以你的身份登录,而不是你的网络服务器,所以添加您的用户到 webserver 用户组:
sudo usermod -a -G www-data ubuntu
当然,这假设您的网络服务器以 www-data(Homestead 默认)运行,并且您的用户是 ubuntu(如果您使用 Homestead,它就是 vagrant)。
然后将所有目录设置为 755,将文件设置为 644... SET 文件权限
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 {} \;
SET 目录权限
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 755 {} \;
您的用户作为所有者
我更喜欢拥有所有的目录和文件(它使处理一切变得更加容易),所以,去你的 laravel 根目录:
cd /var/www/html/laravel >> assuming this is your current root directory
sudo chown -R $USER:www-data .
然后我给自己和网络服务器权限:
sudo find . -type f -exec chmod 664 {} \; sudo find . -type d -exec chmod 775 {} \;
然后赋予网络服务器读取和写入存储和缓存的权限
无论您设置哪种方式,您都需要为网络服务器授予存储、缓存和任何其他网络服务器也需要上传或写入的目录的读写权限(取决于您的情况),因此从上面的 bashy 运行命令:
sudo chgrp -R www-data storage bootstrap/cache sudo chmod -R ug+rwx storage bootstrap/cache
现在,您很安全,您的网站可以正常工作,并且您可以相当轻松地处理这些文件
出于明显的安全原因,storage
和 vendor
文件夹的权限应保持在 775
。
但是,您的计算机和服务器 Apache 都需要能够写入这些文件夹。例如:当您运行 php artisan
之类的命令时,您的计算机需要在 storage
中写入日志文件。
您需要做的就是将文件夹的所有权授予 Apache:
sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage
然后您需要将您的用户(由它的 username
引用)添加到服务器 Apache 所属的组。像这样:
sudo usermod -a -G www-data userName
注意:最常见的组名是 www-data
,但在您的情况下,将其替换为 _www
chown
命令应该包含 -R 标志。此外,在 laravel 5.1 和 5.2 中,您应该授予对 bootstrap/cache 目录的访问权限,而不是 vendor 目录。
your computer needs to write in the logs file in storage
是什么意思?来自服务器和个人计算机的用户之间的文件权限不共享。
在为 Laravel 应用程序设置权限时,我们遇到了许多边缘情况。我们创建一个单独的用户帐户 (deploy
) 来拥有 Laravel 应用程序文件夹并从 CLI 执行 Laravel 命令,并在 www-data
下运行 Web 服务器。这导致的一个问题是日志文件可能归 www-data
或 deploy
所有,具体取决于谁先写入日志文件,显然会阻止其他用户在将来写入它。
我发现唯一健全和安全的解决方案是使用 Linux ACL。该解决方案的目标是:
允许拥有/部署应用程序的用户对 Laravel 应用程序代码进行读写访问(我们使用名为 deploy 的用户)。允许 www-data 用户对 Laravel 应用程序代码进行读取访问,但不允许写入访问。完全防止任何其他用户访问 Laravel 应用程序代码/数据。允许 www-data 用户和应用程序用户(部署)对存储文件夹进行写访问,无论哪个用户拥有该文件(例如,部署和 www-data 都可以写入同一个日志文件)。
我们通过以下方式完成此操作:
application/ 文件夹中的所有文件都使用默认的 umask 0022 创建,这导致文件夹具有 drwxr-xr-x 权限和文件具有 -rw-r--r--。 sudo chown -R deploy:deploy application/ (或者简单地将您的应用程序部署为部署用户,这就是我们所做的)。 chgrp www-data application/ 以授予 www-data 组对应用程序的访问权限。 chmod 750 application/ 允许部署用户读/写,www-data 用户只读,并删除任何其他用户的所有权限。 setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/ 设置 storage/ 文件夹和所有子文件夹的默认权限。在 storage 文件夹中创建的任何新文件夹/文件都将继承这些权限(www-data 和 deploy 的 rwx)。 setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ 对任何现有文件/文件夹设置上述权限。
更改您的项目文件夹的权限,以便为拥有该目录的组中的任何用户启用读/写/执行(在您的情况下是 _www
):
chmod -R 775 /path/to/your/project
然后将您的 OS X 用户名添加到 _www
组以允许它访问该目录:
sudo dseditgroup -o edit -a yourusername -t user _www
dseditgroup
时,我收到一个错误:Username and password must be provided.
。
sudo
。
_www:_www
或 myuser:_www
?
_www:_www
,因为 775 表示组 _www
中的任何用户都将拥有对该文件夹的读/写/执行的完全权限,而您刚刚将您的用户名添加到该组。
chown myuser:_www
是什么意思?我知道第一个是用户,第二个是组,但它是指“这个用户和这个组中的任何人”还是“这个用户但只有他属于这个组”?
这对我有用:
cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/
仅当您使用 npm(VUE、编译 SASS 等)时才添加:
sudo chmod -R 777 ./node_modules/
它能做什么:
将所有文件权限更改为 644
将所有文件夹权限更改为 755
对于存储和引导缓存(laravel 用于创建和执行文件的特殊文件夹,外部不可用)将权限设置为 777,对于内部的任何内容
对于 nodeJS 可执行文件,同上
注意:也许您不能或不需要使用 sudo 前缀来执行此操作。这取决于您的用户的权限、组等...
Laravel 5.4 文档说:
安装 Laravel 后,可能需要配置一些权限。 storage 和 bootstrap/cache 目录中的目录应该可以被你的 Web 服务器写入,否则 Laravel 将无法运行。如果您使用的是 Homestead 虚拟机,则应该已经设置了这些权限。
此页面上有很多提到使用 777
权限的答案。 不要那样做。你会成为黑客的exposing yourself。
相反,请遵循其他人关于如何设置 755 权限(或更严格)的建议。您可能需要通过在终端中运行 whoami
来确定您的应用程序以哪个用户身份运行,然后使用 chown -R
更改某些目录的所有权。
这对我有用:
cd /code/laravel_project
php artisan cache:clear
php artisan config:clear
sudo service php7.4-fpm stop
sudo service nginx stop
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 755 bootstrap/cache
sudo service php7.4-fpm start && sudo service nginx start
受https://stackoverflow.com/a/45673457/470749启发
如果您无权使用 sudo ,因为许多其他答案需要...
您的服务器可能是共享主机,例如 Cloudways。
(在我的例子中,我已经将我的 Laravel 应用程序克隆到我的第二个 Cloudways 服务器中,但它并没有完全工作,因为 storage
和 bootstrap/cache
目录的权限被搞砸了。)
我需要使用:
Cloudways Platform > Server > Application Settings > Reset Permission
然后我可以在终端中运行 php artisan cache:clear
。
大多数文件夹应该是正常的“755”和文件,“644”
Laravel 需要一些文件夹对 Web 服务器用户是可写的。您可以在基于 unix 的操作系统上使用此命令。
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
添加到 composer.json
"scripts": {
"post-install-cmd": [
"chgrp -R www-data storage bootstrap/cache",
"chmod -R ug+rwx storage bootstrap/cache"
]
}
composer install
之后
正如已经发布的
您需要做的就是将文件夹的所有权授予 Apache:
但我为 chown 命令添加了 -R: sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
bgles 发布的解决方案在最初正确设置权限方面对我来说是正确的(我使用第二种方法),但它对于 Laravel 仍然存在潜在问题。
默认情况下,Apache 将创建具有 644 权限的文件。所以这几乎是存储/。因此,如果您删除 storage/framework/views 的内容,然后通过 Apache 访问页面,您会发现缓存视图已创建如下:
-rw-r--r-- 1 www-data www-data 1005 Dec 6 09:40 969370d7664df9c5206b90cd7c2c79c2
如果您运行“artisan serve”并访问不同的页面,您将获得不同的权限,因为 CLI PHP 的行为与 Apache 不同:
-rw-rw-r-- 1 user www-data 16191 Dec 6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e
这本身没什么大不了的,因为您不会在生产中执行任何这些操作。但是如果 Apache 创建了一个随后需要由用户写入的文件,它就会失败。当使用登录用户和工匠进行部署时,这可以应用于缓存文件、缓存视图和日志。一个简单的例子是“artisan cache:clear”,它将无法删除任何 www-data:www-data 644 的缓存文件。
这可以通过将工匠命令作为 www-data 运行来部分缓解,因此您将执行以下操作/编写脚本:
sudo -u www-data php artisan cache:clear
或者您将避免这种乏味并将其添加到您的 .bash_aliases 中:
alias art='sudo -u www-data php artisan'
这已经足够好了,并且不会以任何方式影响安全性。但是在开发机器上,运行测试和清理脚本会使这变得笨拙,除非您想设置别名以使用 'sudo -u www-data' 来运行 phpunit 以及您检查构建的所有其他内容,这可能会导致文件被创建。
解决方案是遵循 bgles 建议的第二部分,将以下内容添加到 /etc/apache2/envvars,然后重新启动(而不是重新加载)Apache:
umask 002
这将强制 Apache 默认将文件创建为 664。这本身就存在安全风险。然而,在这里主要讨论的 Laravel 环境(Homestead、Vagrant、Ubuntu)中,Web 服务器作为用户 www-data 在组 www-data 下运行。所以如果不随意让用户加入www-data组,应该不会有额外的风险。如果有人设法突破网络服务器,他们无论如何都具有 www-data 访问级别,因此不会丢失任何内容(尽管这不是与安全相关的最佳态度)。所以在生产环境中它是相对安全的,在单用户开发机器上,这不是问题。
最终,由于您的用户位于 www-data 组中,并且包含这些文件的所有目录都是 g+s (该文件始终在父目录的组下创建),因此用户或 www-data 创建的任何内容都将是 r/ w 为另一个。
这就是这里的目标。
编辑
在进一步研究上述设置权限的方法时,它看起来仍然足够好,但一些调整会有所帮助:
默认情况下,目录是 775,文件是 664,所有文件都有刚刚安装框架的用户的所有者和组。所以假设我们从那一点开始。
cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./
我们要做的第一件事是阻止其他所有人的访问,并使该组成为 www-data。只有 www-data 的所有者和成员可以访问该目录。
sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache
按照官方 Laravel 安装指南的建议,允许网络服务器创建 services.json 和compiled.php。设置组粘性位意味着这些将由具有一组 www-data 的创建者拥有。
find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage
我们对存储文件夹做同样的事情,以允许创建缓存、日志、会话和视图文件。我们使用 find 为目录和文件显式设置不同的目录权限。我们不需要在 bootstrap/cache 中这样做,因为那里(通常)没有任何子目录。
您可能需要重新应用任何可执行标志,并删除 vendor/* 并重新安装 composer 依赖项以重新创建 phpunit 等的链接,例如:
chmod +x .git/hooks/*
rm vendor/*
composer install -o
而已。除了上面解释的 Apache 的 umask 之外,这就是所有需要的,而不会使整个 projectroot 可由 www-data 写入,这与其他解决方案一样。因此,这种方式稍微安全一点,因为以 www-data 身份运行的入侵者具有更有限的写入访问权限。
结束编辑
Systemd 的变化
这适用于 php-fpm 的使用,但也可能适用于其他人。
需要覆盖标准的systemd服务,在override.conf文件中设置umask,重启服务:
sudo systemctl edit php7.0-fpm.service
Use:
[Service]
UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service
我已经在 EC2 实例上安装了 laravel,并花了 3 天时间来修复权限错误并最终修复它。所以我想和其他人分享这个经验。
用户问题 当我登录 ec2 实例时,我的用户名是 ec2-user,用户组是 ec2-user。该网站在 httpd 用户下运行:apache:apache 所以我们应该为 apache 设置权限。文件夹和文件权限 A. 文件夹结构首先,你应该确保你在 storage storage framework 缓存会话视图日志下有这样的文件夹结构文件夹结构可以根据你使用的 laravel 版本而有所不同。我的 laravel 版本是 5.2,你可以根据你的版本找到合适的结构。
B.权限一开始看到说明在storage下设置777删除file_put_contents: failed to open stream错误。所以我将权限 777 设置为 storage chmod -R 777 storage 但错误未修复。在这里,您应该考虑一个:谁将文件写入存储/会话和视图。那不是ec2-user,而是apache。是的,没错。 “apache”用户将文件(会话文件、编译视图文件)写入会话和视图文件夹。所以你应该给apache写这些文件夹的权限。默认情况下:SELinux 说 /var/www 文件夹应该被 apache 守护进程只读。
所以为此,我们可以将 selinux 设置为 0: setenforce 0
这可以暂时解决问题,但这会使 mysql 无法正常工作。所以这不是很好的解决方案。
您可以使用以下方法为存储文件夹设置读写上下文:(请记住 setenforce 1 进行测试)
chcon -Rt httpd_sys_content_rw_t storage/
然后你的问题就解决了。
并且不要忘记这个 composer update php artisan cache:clear 这些命令在之后或之前都会很有用。我希望你节省你的时间。祝你好运。哈肯
我也按照让用户成为所有者的方式,用户是www-data
的成员。
我的命令顺序有点不同:
cd /var/www/html/laravel-project-root
sudo chown -R $USER:www-data .
sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;
sudo find . -type d -exec chmod g+s {} \; <----- NOTE THIS
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
请注意这个答案的特殊性:我是唯一(在这里)将组位添加到每个文件夹的人。这样,如果某人或某物创建了一个新的子文件夹,它会自动将 www-data
作为组
当我们被迫部署一些使用 ftp 预加载的用户空间文件时,就会发生这种情况,因此即使由 ftp 客户端创建,新的子文件夹也始终属于 www-data 组
另请注意,如果您执行列表中的所有命令,则不需要 sudo chgrp -R www-data storage bootstrap/cache >。但是,如果你想修复一个 ftp 部署,例如,你没有执行第二行,那么这是需要的。
这是在 2017 年针对 5.1~5.2 版本编写的。在您在更高版本的 Laravel 上使用它之前,请先使用一些常识。
我决定编写自己的脚本来减轻设置项目的一些痛苦。
在项目根目录中运行以下命令:
wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh
等待引导完成,您就可以开始了。
Review the script 使用前。
我有以下配置:
NGINX(运行用户:nginx)
PHP-FPM
并按照@bgies 在接受的答案中建议的方式正确应用权限。我的问题是 php-fpm 配置的运行用户和组,最初是 apache
。
如果你使用 NGINX 和 php-fpm,你应该打开 php-fpm 的配置文件:
nano /etc/php-fpm.d/www.config
并将 user
和 group
选项的值替换为配置为使用的 NGINX;就我而言,两者都是 nginx
:
... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
保存并重启 nginx 和 php-fpm 服务。
对于 Laravel 开发人员来说,目录问题可能有点痛苦。在我的应用程序中,我正在动态创建目录并将文件成功移动到本地环境中的该目录。然后在服务器上,将文件移动到新创建的目录时出现错误。
以下是我所做的事情并最终获得了成功的结果。
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \; sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \; chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/ 在动态创建新目录时,我使用了命令 mkdir($save_path, 0755, true);
在生产服务器上进行这些更改后,我成功创建了新目录并将文件移动到它们。
最后,如果您在 Laravel 中使用 File 外观,您可以执行以下操作:File::makeDirectory($save_path, 0755, true);
如果您在某些文件中进行了一些代码更改,然后更改了一些权限,则设置正确的权限并再次提交可能比尝试选择具有权限更改的文件更容易。您将只剩下代码更改。
我会这样做:
sudo chown -R $USER:www-data laravel-project/
find laravel-project/ -type f -exec chmod 664 {} \;
find laravel-project/ -type d -exec chmod 775 {} \;
最后,您需要授予网络服务器修改 storage
和 bootstrap/cache
目录的权限:
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
sudo chown -R $USER:www-data your_directory_name_under_storage_app
它将为服务器用户和服务器提供文件访问所需的权限。
Mac OS 大苏尔
在我的情况下,工匠无法访问 /var/www/{project_name}/storage 来创建文件。在 /logs 文件夹中,所以我必须手动转到 /var 并创建 Laravel 需要创建符号链接的文件夹结构。添加对文件夹的访问权限 sudo chgrp -R $USER /var/www/project_name 然后我可以使用 php artisan storage:link 没有任何问题。
我找到了一个更好的解决方案。这是因为 php 默认以另一个用户身份运行。
所以要解决这个问题
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
然后编辑 user = "put user that owns the directories" group = "put user that owns the directories"
然后:
sudo systemctl reload php7.0-fpm
不定期副业成功案例分享
anyone
概念的误解太多。 Linux 的anyone
标志表示任何用户,而不是任何人。您仍然需要服务器访问权限。write
组权限,用户是否仍然无法上传文件?