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 不存在
那么为什么它不能写入文件呢?
可能的原因:当您将
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
)重启 Nginx 或
newgrp ubuntu
切换到www-data
用户后执行 a 使其立即生效。