【问题标题】:PHP-FPM + Laravel + Nginx + Ubuntu permissionPHP-FPM + Laravel + Nginx + Ubuntu 权限
【发布时间】:2015-04-08 03:30:37
【问题描述】:

我之前尝试搜索过这个问题,但似乎无处详细解释,主要是app/storage等问题没有设置权限,因此网络服务器可以写入文件,但我的问题似乎更大更重要的是,我希望有人能彻底解释这应该如何设置,最好不需要设置777的权限。

所以我的堆栈是 Ubuntu 14.04PHP 5.6PHP-FPM 因为我使用 nginx 1.4.6 我使用 Laravel 4.2 作为框架,另外一个我使用 Git 作为我的版本控制工具。那么,允许以下操作的必要步骤是什么:

  1. 设置初始项目,Git 和 Nginx:

    据我所知,Nginx 设置为默认使用用户名www-data 对吗?这是否意味着我必须分配我的用户,例如kevinwww-data?当我初始化 git 时,使用 composer 创建项目,设置 SSH 公钥/私钥,我需要属于组 www-data 还是必须是 sudo 或什么?在我的生产服务器中,我尝试使用sudo 来设置所有内容,它可以更轻松地完成上述所有操作,但这是最佳实践吗?

  2. 使app/storage 对网络服务器可写:

    我认为这对 Laravel 来说是第二个也是最重要的,因为除非这样,否则 Laravel 将无法运行,我知道这个文件夹必须可由网络服务器 (nginx) 写入,所以我需要将其设置为sudo chown -R www-data:www-data app/storagesudo chmod -R 664 app/storage 对吗?但不知何故,这似乎并不总是有效,因为在我的开发过程中,有时它会告诉不能将视图的缓存写入app/storage 文件夹,所以最后我必须将其设置为777775 如果我幸运的话。

  3. 公共文件夹,或我的资产所在位置

    这里我也有一些不一致,我在末尾设置了777,以确保我所有的文件都可以被nginx访问。有时 nginx 会告诉我,我的资产文件夹中的某些图像似乎被禁止,如果我设置为 777 或将组更改为 www-data:www-data,它只会返回 HTTP 200,我有吗更改我从 Gimp、Photoshop 创建的每张图片的权限或组,或者当我从 Dropbox 下载的图片或我的平面设计师设计新图标时从我的电子邮件中创建的图片?

  4. 文件上传

    所以在某个时候,人们将能够上传他们的个人资料图片,或者当我发布博客时我可以上传图片,这意味着文件上传脚本会在某个时候将文件从 @ 987654338@ 文件夹到我的public 文件夹,可能只需要写入public 的子目录,或者有时可能需要基于某个id 创建一个文件夹并将文件移动到目录中,大部分时间在执行脚本期间,我会收到一个错误,即目录似乎不可写或某些权限错误。这是否意味着 PHP 进程 也必须在某些权限下运行?或者这是否意味着该目录必须具有一定的权限?这个问题是与Nginx服务有关还是与PHP进程有关?

    我有使用 roumen/sitemapjlapp/swaggervel 等软件包的经验,他们似乎使用相同的 Facade File,但不知何故他们没有任何权限问题,我尝试复制他们的代码行为但我遇到了上面的问题。

  5. 队列、Artisan、其他基于命令行的执行脚本

    最后,是基于命令行的执行脚本,它的行为是否与通过与网络服务器交互执行的脚本相同,例如上面的文件上传,还是我需要为其他不一致做准备?

谢谢,如果有人可以向我解释一下。我想如果我弄明白了,我会写一篇博客之类的,谢谢大家! :D

【问题讨论】:

  • 哦,还有一件事,请不要 Homestead 回答-.-

标签: php ubuntu laravel nginx user-permissions


【解决方案1】:
  1. 我通常做的是将所有文件/文件夹组更改为带有sudo chgrp -R www-data laravel-folder 的 www-data。这样我仍然是所有者,并且网络服务器具有组权限。

  2. 当 www-data 拥有组所有权时,sudo chmod -R g+w app/storage 允许网络服务器写入存储子文件夹。或者您也可以使用sudo chmod -R 775 app/storage。不要用777,没必要让大家写你的文件夹。

  3. 对于所有新资产,我总是集体更改组所有权。或者,如果很多地方有新文件,请再次执行sudo chgrp -R www-data laravel-folder。一个命令,一切都具有适当的组所有权。 无需更改 public 文件夹 (755) 的默认权限。 Nginx 不会在那里保存文件。

  4. 用户发送的所有文件都应位于storage。您可以为头像创建一个子文件夹,另一个用于其他用户文件。这就是为什么这个文件夹被称为storage(不言自明)。它可由网络服务器写入,因此 nginx 可以在那里创建文件/文件夹。

  5. 当您像我上面描述的那样调整权限/组所有权时,artisan 或 CLI 命令应该没有问题。

我建议你阅读这篇How to Install Laravel with an Nginx Web Server on Ubuntu 14.04 文章。

【讨论】:

  • 只是一个快速的后续问题,webserver(nginx)通常会在用户www-data和组www-data下运行对吧?因此,laravel 目录中任何将被分配到组www-data 并具有 775 权限的文件夹都可以被网络服务器写入。对吗?
  • @Kevin 775 中的第二个“7”表示readable, writeable and executable by group,组为www-data,因此允许www-data 组成员(nginx)写入此类文件夹。
  • 好的,谢谢,我之前有点明白这个概念,但有时在开发过程中出现了问题。实际上,我之前也按照您的链接进行了安装。在第一次初始设置时一切顺利,我想我需要从基础开始重新考虑这些东西。我发现它是新的,虽然上传的文件(例如个人资料图片)应该保存在存储中,我认为这些文件不应该从外部访问,但有些东西直接放在那里是有意义的。感谢您的回复。我真的很感激。
  • @Kevin app/storage(在 Laravel 4 中)或 storage(在 Laravel 5 中)文件夹无法从外部访问。只有public 文件夹是。使用您的代码将存储区中的员工带到用户那里。他们不直接访问该区域。此操作的安全性取决于代码的质量。我认为你应该深入阅读 Laravel 文档。
  • 是的,我知道,这就是为什么上传个人资料图片等文件并非易事
猜你喜欢
  • 2018-07-17
  • 2017-07-14
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多