我使用的Apache Web服务器的所有者设置为_www:_www。我从来不知道文件权限的最佳实践是什么,例如当我创建新的Laravel 5项目时。

Laravel 5要求/storage文件夹是可写的。我发现了很多不同的方法来让它工作,我通常以递归地使它为777 chmod结束。但我知道这不是个好主意。

官方医生说:

Laravel可能需要配置一些权限:其中的文件夹 存储和供应商要求web服务器进行写访问。

这是否意味着web服务器也需要访问存储和供应商文件夹本身,还是只需要访问它们的当前内容?

我认为更好的是更改所有者而不是权限。我将所有Laravel的文件权限递归地更改为_www:_www,这使得网站正常工作,就像我将chmod更改为777一样。问题是,现在每次我想保存任何文件时,我的文本编辑器都会要求我输入密码,如果我试图在Finder中更改任何内容,比如复制一个文件,也会发生同样的情况。

解决这些问题的正确方法是什么?

改变chmod 更改文件的所有者以匹配 web服务器,也许设置文本编辑器(和Finder?)跳过 询问密码,或者让他们使用sudo 更改web服务器的所有者以匹配操作系统用户(我不这样做 知道后果) 其他的东西


修改项目文件夹的权限,允许组内的任何用户(在你的例子中是_www)读/写/执行ec:

chmod -R 775 /path/to/your/project

然后将你的OS X用户名添加到_www组,允许它访问目录:

sudo dseditgroup -o edit -a yourusername -t user _www

出于明显的安全原因,存储和供应商文件夹的权限应该保持在775。

但是,您的计算机和服务器Apache都需要能够在这些文件夹中进行写操作。例如:当你运行像php artisan这样的命令时,你的计算机需要写入存储中的日志文件。

你所需要做的就是把文件夹的所有权交给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

然后需要将用户(由用户名引用)添加到服务器Apache所属的组中。像这样:

sudo usermod -a -G www-data userName

注意:通常情况下,组名是www-data,但在您的示例中,将其替换为_www


对于观看这个讨论的人来说,这是显而易见的....如果你给你的任何文件夹777权限,你就允许任何人读、写和执行....目录下的任何文件这意味着你给了任何人(任何黑客或恶意的人在整个世界)上传任何文件,病毒或任何其他文件的权限,然后执行该文件…

如果您正在将文件夹权限设置为777,则您已经打开了您的 任何能找到该目录的人的服务器。够清楚? ?:)

设置所有权和权限基本上有两种方法。要么你给自己所有权,要么你让web服务器成为所有文件的所有者。

web服务器作为所有者(大多数人这样做,以及Laravel文档的方式):

假设www-data(它可能是其他东西)是您的web服务器用户。

sudo chown -R www-data:www-data /path/to/your/laravel/root/directory

如果你这样做,webserver拥有所有的文件,也是组,你将会有一些问题,通过FTP上传文件或使用文件,因为你的FTP客户端将以你的身份登录,而不是你的webserver,所以把你的用户添加到webserver用户组:

sudo usermod -a -G www-data ubuntu

当然,这是假设你的服务器运行为www-data (Homestead默认),你的用户是ubuntu(如果你使用Homestead,它是流浪者)。

然后将所有目录设置为755,文件设置为644… SET文件权限

sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 {} \;    

设置目录权限

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 .

然后我给自己和webserver权限:

sudo find . -type f -exec chmod 664 {} \;   
sudo find . -type d -exec chmod 775 {} \;

然后给web服务器读写存储和缓存的权限

无论你用哪种方式设置它,你都需要给web服务器读写权限,用于存储,缓存和任何其他web服务器需要上传或写入的目录(取决于你的情况),所以运行上面bashy的命令:

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

现在,你是安全的,你的网站工作,你可以相当容易地处理文件


如前所述

你所需要做的就是把文件夹的所有权交给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权限的文件。所以这几乎是存储中的任何东西/。所以,如果你删除了存储/框架/视图的内容,然后通过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

This will force Apache to create files as 664 by default. In itself, this can present a security risk. However, on the Laravel environments mostly being discussed here (Homestead, Vagrant, Ubuntu) the web server runs as user www-data under group www-data. So if you do not arbitrarily allow users to join www-data group, there should be no additional risk. If someone manages to break out of the webserver, they have www-data access level anyway so nothing is lost (though that's not the best attitude to have relating to security admittedly). So on production it's relatively safe, and on a single-user development machine, it's just not an issue.

最终,由于您的用户在www-data组中,并且包含这些文件的所有目录都是g+s(文件总是在父目录的组下创建),用户或www-data创建的任何内容都将是r/w。

这就是我们的目的。

edit

在进一步研究上述设置权限的方法时,它看起来仍然足够好,但一些调整可以有所帮助:

默认情况下,目录是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

允许web服务器创建服务。如官方Laravel安装指南所建议的那样。设置组粘性位意味着这些将由创建者拥有一组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,这是所有需要的,而不是使整个项目根可被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

在为Laravel应用程序设置权限时,我们遇到了许多边缘情况。我们创建了一个单独的用户帐户(deploy),用于拥有Laravel应用程序文件夹并从CLI执行Laravel命令,并在www-data下运行web服务器。这导致的一个问题是,日志文件可能由www-data或deploy拥有,这取决于谁先写入日志文件,这显然阻止了其他用户将来写入它。

我发现唯一明智而安全的解决方案是使用Linux acl。这个解决方案的目标是:

To allow the user who owns/deploys the application read and write access to the Laravel application code (we use a user named deploy). To allow the www-data user read access to Laravel application code, but not write access. To prevent any other users from accessing the Laravel application code/data at all. To allow both the www-data user and the application user (deploy) write access to the storage folder, regardless of which user owns the file (so both deploy and www-data can write to the same log file for example).

我们做到了以下几点:

All files within the application/ folder are created with the default umask of 0022, which results in folders having drwxr-xr-x permissions and files having -rw-r--r--. sudo chown -R deploy:deploy application/ (or simply deploy your application as the deploy user, which is what we do). chgrp www-data application/ to give the www-data group access to the application. chmod 750 application/ to allow the deploy user read/write, the www-data user read-only, and to remove all permissions to any other users. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/ to set the default permissions on the storage/ folder and all subfolders. Any new folders/files created in the storage folder will inherit these permissions (rwx for both www-data and deploy). setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ to set the above permissions on any existing files/folders.


这是在2017年编写的,大约版本5.1~5.2。在Laravel的后续版本中使用此功能之前,请先了解一些常识。

我决定编写自己的脚本,以减轻建立项目的痛苦。

在项目根目录中运行以下命令:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

等待引导完成,然后就可以开始了。

使用前请检查脚本。


Laravel 5.4文档说:

在安装Laravel之后,您可能需要配置一些权限。 存储和引导/缓存目录中的目录 你的web服务器应该可以写,否则Laravel将无法运行。如果你 正在使用Homestead虚拟机,这些权限应该 已经设置好了。

本页上有很多答案提到使用777权限。不要那样做。你会把自己暴露在黑客面前。

相反,请遵循其他人关于如何将权限设置为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服务器上,它不能完全工作,因为存储和引导/缓存目录的权限被弄乱了。)

我需要使用:

Cloudways平台>服务器>应用程序设置>重置权限

然后我可以在终端中运行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

我已经在EC2实例上安装了laravel,并花了3天的时间来修复权限错误,最终修复了它。 所以我想和其他人分享这段经历。

user problem When I logged in ec2 instance, my username is ec2-user and usergroup is ec2-user. And the website works under of httpd user: apache: apache so we should set the permission for apache. folder and file permission A. folder structure first, you should make sure that you have such folder structure like this under storage storage framework cache sessions views logs The folder structure can be different according to the laravel version you use. my laravel version is 5.2 and you could find the appropriate structure according to your version.

B. permission At first, I see the instructions to set 777 under storage to remove file_put_contents: failed to open stream error. So i setup permission 777 to storage chmod -R 777 storage But the error was not fixed. here, you should consider one: who writes files to storage/ sessions and views. That is not ec2-user, but apache. Yes, right. "apache" user writes file (session file, compiled view file) to the session and view folder. So you should give apache to write permission to these folder. By default: SELinux say the /var/www folder should be read-only by the apache deamon.

因此,我们可以将selinux设置为0: setenforce 0

这可以暂时解决问题,但这使mysql无法工作。 所以这不是一个很好的解。

你可以用以下方法设置一个读写上下文到存储文件夹(记得setenforce 1来测试它)

chcon -Rt httpd_sys_content_rw_t storage/

这样你的问题就解决了。

别忘了这一点 作曲家更新 PHP工匠缓存:清除 这些命令将在之后或之前使用。 我希望你节省时间。 祝你好运。Hacken


我找到了一个更好的解决办法。 这是因为php默认以另一个用户运行。

所以要解决这个问题

Sudo nano /etc/php/7.0/fpm/pool.d/www.conf

然后编辑 用户= "把拥有目录的用户" Group = "put拥有目录的用户"

然后:

Sudo systemctl reload php7.0-fpm


添加到composer.json

"scripts": {
    "post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
}

安装composer后


我有以下配置:

NGINX(运行用户:NGINX) PHP-FPM

并正确应用权限@bgies建议在接受的答案。在我的案例中,问题是php-fpm配置的运行用户和组最初是apache。

如果你使用NGINX和php-fpm,你应该打开php-fpm的配置文件:

nano /etc/php-fpm.d/www.config

并将用户和组选项的值替换为一个NGINX配置工作;在我的例子中,两者都是nginx:

... ; Unix用户/进程组 ; 备注:非必选用户。如果未设置组,则默认用户组 ;将被使用。 ; RPM: apache选择能够以httpd的方式访问某些目录 User = nginx ; RPM:在日志目录下保留一个允许写入的组。 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 facade,你可以这样做: 文件::makeDirectory($save_path, 0755, true);


这招对我很管用:

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做前缀。这取决于你的用户权限、组等等。


我会这样做:

sudo chown -R $USER:www-data laravel-project/ 

find laravel-project/ -type f -exec chmod 664 {} \;

find laravel-project/ -type d -exec chmod 775 {} \;

最后,你需要给webserver修改存储和引导/缓存目录的权限:

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工匠存储:链接没有任何问题。


如果在某些文件中有一些代码更改,然后又有一些权限更改,那么设置正确的权限并再次提交可能比尝试选择权限更改的文件更容易。 您将只剩下代码更改。


我还遵循了以用户为所有者的方式,用户是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预加载,因此新的子文件夹文件夹总是属于www-data组,即使是由ftp客户端创建的

还要注意 sudo chgrp -R www-data storage bootstrap/cache > .使用实例 如果执行列表中的所有命令,则不需要。但如果你想修复一个ftp部署,例如,你没有执行第二行,所以这是需要的。


我已经使用这个代码片段3年多了。


laravel new demo 

cd demo 

sudo find ./ -type f -exec chmod 664 {} \;    
sudo find ./  -type d -exec chmod 775 {} \;

sudo chgrp -Rf www-data storage bootstrap/cache
sudo chmod -Rf ug+rwx storage bootstrap/cache
sudo chmod -Rf 775 storage/ bootstrap/

php artisan storage:link

@realtebo的推荐看起来不错。我会试试的。

sudo find . -type d -exec chmod g+s {} \;  <----- NOTE THIS