Nginx 无法写入日志文件,即使其用户具有写组访问权限。以下是一些详细信息:
www-data 用户位于 ubuntu 组:
$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data),1000(ubuntu)
/opt/logs/ 是组可写的:
$ ls -ld /opt/logs/
drwxrwxr-x 2 ubuntu ubuntu 4096 2012-07-27 02:47 /opt/logs/
www-data 用户可以按预期创建 /opt/logs/1:
$ su www-data
$ touch /opt/logs/1
$ ls -l /opt/logs/1
-rw-rw-r-- 1 www-data www-data 0 2012-07-27 02:47 /opt/logs/1
Nginx 用户:组:
var_dump(system('whoami'), system('groups'));
// string 'www-data' (length=8)
// string 'www-data ubuntu' (length=15)
但是 Nginx 不能这样写:
Warning: file_put_contents(/opt/logs/Error.log) function.file-put-contents failed to open stream: Permission denied
/opt/logs/Error.log 不存在
那么为什么它不能写入文件?
答案1
可能的原因是:当您将www-data
用户添加到ubuntu
组时,它只会影响稍后启动的会话。
su - www-data -s /bin/bash
创建了一个新会话,因此它工作正常。但是 Nginx 仍然以用户身份运行www-data
,因此我怀疑这是导致上述错误的原因。
(如果你www-data
在执行之前切换到用户usermod -a -G ubuntu www-data
,我很确定你只会uid=33(www-data) gid=33(www-data) groups=33(www-data)
在输入时看到id
)
newgrp ubuntu
重新启动 Nginx 或切换到用户后执行www-data
以使其立即生效。