Linux

即使 www-data 使用者具有組寫入權限,Nginx 的權限也被拒絕

  • September 6, 2012

即使 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使用者後執行一次,使其立即生效。

引用自:https://serverfault.com/questions/411704