[英]Can't create text file or append to it in NGINX without CHMOD 777
使用Lightsail NGINX實例並在PHP文件中獲得一行內容,這行不通
$s = 'Hello world';
$myfile = file_put_contents('log.txt', $s.PHP_EOL , FILE_APPEND | LOCK_EX);
我希望它創建log.txt文件(如果不存在)。 如果有,我要附加它。 它也不做。
如果我創建該文件,它將無法正常工作。 僅當我通過SSH將文件chmod改為777時,它才能工作。
但是,將來的工作是制作文件,因此出於777安全性之外的原因,這種手動方法將不可行。
我知道這取決於安全性設置,但實際上不確定如何做才能使其盡可能安全,同時仍然允許PHP訪問創建/附加到文本文件的權限
看來我有一個叫www-data的用戶。 我努力了:
sudo chown -R www-data:www-data html
sudo chmod -R g+s html
仍然無法創建文件。
如果我在錯誤報告上輸入:
file_put_contents(log.txt): failed to open stream: Permission denied
謝謝
我真的很想知道人們在完全缺乏OP服務器設置細節的情況下如何建議使用chmod
或chown
。
根據到目前為止提到的所有內容,我可以假設 OP是以這種方式運行的:
www-data
運行。 foo
。 讓我們概述這種設置的最佳實踐。 這樣一來,您將很快獲得無權限問題的良好狀態。
通常(無論是否有多站點服務器),您都需要一個擁有站點文件的特定用戶。 該用戶永遠不能是www-data
。 它必須是為此目的而創建的單獨用戶: foo
。
通常,該用戶foo
將被設置為與其一起運行PHP-FPM池。
因此,為foo
用戶設置正確的所有權:
chown -R foo:foo /path/to/your/site/html
由於PHP-FPM腳本以foo
身份運行,因此目錄和其中的所有文件都由該foo
擁有,因此PHP-FPM可以在那里毫無問題地完成工作。 這樣,您將絕對不會有PHP無法創建/訪問內容的可能性。
請記住,該設置涉及兩個用戶:一個是Web服務器的( www-data
),一個是PHP-FPM的( foo
)。
現在文件已由foo
正確擁有,我們需要授予將它們讀取到www-data
的權限。 為什么只看書? 因為NGINX與在此設置中寫入文件系統無關。 它只需要讀取文件和遍歷目錄。
通常是通過使Web服務器的用戶成為站點用戶組的成員來完成授予的 。 一開始很難理解,但是我會更加冗長:
假設有一個站點文件data.txt
,該站點文件現在由foo:foo
擁有-Linux中的所有權是雙重所有權:該文件由foo
用戶和foo
組擁有。
現在, foo
組只有一個成員: foo
用戶。
我們需要做的是將另一個成員添加到foo
組: www-data
用戶。
從而:
usermod -a -G foo www-data
之后, foo
組具有以下成員: foo
用戶, www-data
用戶。
現在我們可以繼續使用權限了:)
現在,我們已經完成了所有權,剩下的重要一點是,以這種方式調整所有文件和目錄的權限:
+x
) +r
) 這些權限是www-data
能夠讀取每個網站文件和目錄所必需的。
最有可能的是,您不需要顯式設置這些設置,因為umask
設置(此處將不涉及本主題)將已經使所有文件都具有這些權限。
但是,如果您需要修理自己的東西,可以這樣做:
chmod -R g+rX /path/to/your/site/html
大寫的X
確保僅對目錄設置+x
。
在為這種設置設置了正確的文件和組所有權之后,您可以進一步提高安全性並設置更具限制性的chmod
。
例如, Magento安全chmod遵循該安裝程序的約定,因此您可以使用chmod
權限(對於PHP文件為0400
,對於媒體文件為0640
:)
除非您要處理一個真正奇怪的用例,否則最后一個chmod
位應始終為0。
我認為,實現目標的更好方法是chown命令。 這將更改文件的所有權。
試運行
chown username yourfile
您也可以將其用於文件夾
chown -R username yourfolder
就您而言,您可能需要更改文件log.txt的所有權
嘗試將所有權更改為nginx用戶。
chown nginx: log.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.