即使 www-data 用户具有组写访问权限,Nginx 的权限也被拒绝

即使 www-data 用户具有组写访问权限,Nginx 的权限也被拒绝

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以使其立即生效。

相关内容