PHP-FPM + Laravel + Nginx + Ubuntu 权限

PHP-FPM + Laravel + Nginx + Ubuntu permission

这个问题我之前也搜索过,但是好像没有地方解释的很透彻,大部分都是一些问题,比如app/storage没有设置权限,所以webserver可以写入文件,但是我的问题似乎更大更根本,我希望有人能彻底解释应该如何设置,最好不需要设置 777.

权限

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

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

    据我所知,Nginx 设置为默认使用用户名 www-data 对吧?这是否意味着我必须分配我的用户,例如kevin 加入群组 www-data?当我初始化 git 时,使用 composer 创建项目,设置 SSH public/private 密钥,我需要属于组 www-data 还是我必须是 sudo 或什么?在我的生产服务器中,我尝试使用 sudo 以某种方式设置所有内容,这样可以更轻松地完成上述所有操作,但这是最佳做法吗?

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

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

  3. Public 文件夹,或者我的资源所在的地方

    这里我也有一些不一致,我在最后设置为777,以确保我的所有文件都可以被nginx访问。有时 nginx 会告诉我资产文件夹中的某些图像似乎被禁止,如果我设置为 777 或更改它只会 return HTTP 200 group 到 www-data:www-data,当我的图形设计师设计新图标时,我是否必须更改我从 Gimp、Photoshop 或从 Dropbox 下载或从我的电子邮件创建的每个图像的权限或组?

  4. 文件上传

    所以在某个时候,人们将能够上传他们的个人资料图片,或者当我 post 博客时我可以上传图片,这意味着在某些时候文件上传脚本将将文件从/tmp文件夹移动到我的public文件夹,它可能只需要写入public中的子目录或者有时需要根据某个[=创建一个文件夹33=] 并将文件移动到目录中,大多数时候我会得到一个错误,即目录似乎不可写或在脚本执行期间出现一些权限错误。这是否意味着 PHP 进程 也必须 运行 具有特定权限?还是说目录必须要有一定的权限?这个问题是和Nginx服务有关还是和PHP进程有关?

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

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

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

谢谢,如果有人能给我解释一下。我想如果我弄明白了,我会创建一个博客 post 之类的,感谢大家! :D

  1. 我通常做的是将所有 files/folders 组更改为 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 可以在那里创建 files/folders。

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

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