没有CHMOD 777,无法在NGINX中创建文本文件或将其追加到文本文件中

时间:2019-04-13 17:59:57

标签: php nginx file-put-contents

使用Lightsail NGINX实例,并在PHP文件中得到一行内容,这行将无法满足我的需要

$s = 'Hello world';
$myfile = file_put_contents('log.txt', $s.PHP_EOL , FILE_APPEND | LOCK_EX);

如果它不存在,我希望它创建log.txt文件。如果有,我要附加它。它也不做。

如果我创建文件,它将无法正常工作。仅当我通过SSH将文件更改为777时,它才能起作用。

但是,将来要做的工作是制作文件,因此出于777安全性之外的原因,这种手动方法将不可行。

我了解这取决于安全性设置,但实际上不确定如何做才能确保此安全性,同时仍然允许PHP访问创建/附加到文本文件

看来我有一个叫www-data的用户。我尝试过:

sudo chown -R www-data:www-data html
sudo chmod -R g+s html

仍然无法创建文件。

如果我报告错误,我会得到:

file_put_contents(log.txt): failed to open stream: Permission denied

谢谢

3 个答案:

答案 0 :(得分:1)

我真的很想知道人们在完全缺乏OP服务器设置细节的情况下如何建议chmodchown

根据目前为止提到的所有内容,我可以假定,OP的运行方式如下:

  • NGINX以www-data的身份运行。
  • PHP-FPM以不同的用户名运行(因此出现权限问题)。假设PHP-FPM池的用户名是foo

让我们概述这种设置的最佳实践。这样一来,您将很快获得良好的状态,而不会遇到权限问题。

谁必须拥有文件

通常(无论是否有多站点服务器),都需要一个拥有站点文件的特定用户。该用户应该从不www-data。为此,它必须是您创建的单独用户:foo

通常,同一用户foo将被设置为与其一起运行PHP-FPM池。

因此,请为foo用户设置正确的所有权:

chown -R foo:foo /path/to/your/site/html

由于PHP-FPM脚本以foo身份运行,现在目录和其中的所有文件都由同一foo拥有,因此PHP-FPM可以在那里毫无问题地完成工作。这样,您将绝对不会有PHP无法创建/访问内容的可能性。

授予对Web服务器的访问权限

请记住,该设置涉及两个用户:一个是Web服务器(www-data),一个是PHP-FPM(foo)。

现在文件已归foo所有,我们需要向www-data授予 read 读取权限。为什么只看书?因为NGINX与在此设置中写入文件系统无关。它只需要读取文件并遍历目录。

通常如何通过使Web服务器的用户成为站点用户组的成员来完成此授予。一开始很难理解,但是我会更加冗长:

假设有一个站点文件data.txt,该站点文件现在由foo:foo拥有-Linux中的所有权是双重的:文件由foo用户和{{1 }}组。

目前foo组只有一个成员:foo用户。

我们需要做的是向foo组添加另一个成员:foo用户。

因此:

www-data

此后,usermod -a -G foo www-data 组具有以下成员:foo用户,foo用户。

现在我们可以继续使用权限了:)

应该具有什么权限

现在我们已经完成了所有权,剩下的重要一点是通过这种方式调整所有文件和目录的权限:

  • 目录应允许组的遍历(www-data
  • 文件应允许读取(+x)组

+r必须具有这些权限才能读取每个网站文件和目录。

您很有可能不需要显式设置这些设置,因为www-data设置(在这里我将不涉及此主题)将已经使所有文件都具有这些权限。

但是,如果您需要修复自己的东西,可以这样做:

umask

大写的chmod -R g+rX /path/to/your/site/html 确保仅为目录设置X

确保安全

在为这种设置设置了正确的文件和组所有权之后,您可以更加安全并设置更具限制性的+x

例如,Magento secure chmod遵循该设置的约定,因此您可以使用chmod的PHP文件chmod和媒体文件0400的{​​{1}}权限:)

除非您要处理的是真正奇怪的用例,否则最后0640位应该始终为0。

答案 1 :(得分:0)

我认为,实现目标的更好方法是chown命令。这将更改文件的所有权。

尝试运行

chown username yourfile

您也可以将其用于文件夹

chown -R username yourfolder

以您为例,您可能需要更改文件log.txt的所有权

答案 2 :(得分:0)

尝试将所有权更改为nginx用户。

chown nginx: log.txt