使用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
谢谢
答案 0 :(得分:1)
我真的很想知道人们在完全缺乏OP服务器设置细节的情况下如何建议chmod
或chown
。
根据目前为止提到的所有内容,我可以假定,OP的运行方式如下:
www-data
的身份运行。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服务器(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