Linux
即使 www-data 使用者具有組寫入權限,Nginx 的權限也被拒絕
即使 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 不存在
那麼為什麼不能寫入文件呢?
一個可能的原因:當您將
www-data
使用者添加到ubuntu
組時,它只會影響稍後啟動的會話。
su - www-data -s /bin/bash
創建一個新會話,所以它工作正常。但是 Nginx 仍然以www-data
使用者身份執行,因此我懷疑這是導致上述錯誤的原因。(如果您在執行 a 之前切換到
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
使用者後執行一次,使其立即生效。