Laravel日誌文件寫入失敗(permission denied)

導讀 用過Laravel的小夥伴一開始安裝完框架後可能都遇到過daily 日誌文件寫入失敗的問題,接下來咱們就來詳細說下日誌文件寫入失敗的緣由以及對應的解決方案。

在講這個問題以前可能須要簡單介紹下Linux系統下的文件的Ownership和Permission。php

•Ownershiphtml

◦Userlinux

User是文件的全部者,默認狀況下,用戶建立了一個文件,該文件的全部者就是該用戶。laravel

◦Groupweb

一個用戶組能包含多個用戶,全部屬於這個組的用戶都有相同的權限來訪問文件。假設你有一個項目,不少用戶都須要訪問這個項目文件的權限,你不須要手動賦予這些用戶全部權限,你只須要把這些用戶加到一個組裏面,賦予這些組有訪問文件的權限,這樣一來就僅僅只有組裏面的成員能對文件進行讀寫操做。服務器

◦Other框架

任何其餘的用戶都能訪問文件,所以,給Other用戶賦予權限,至關於全部用戶都擁有這個權限。網站

•Permissiondebug

在 UNIX/Linux 系統中每個文件和目錄都有3中權限,如下就是對三個全部者的討論。日誌

  • ◦Read:這個權限賦予你打開和讀取文件的權限。擁有目錄的讀權限,你能列出其內容。
  • ◦Write:擁有了讀權限,你能修改文件的內容。擁有了目錄的寫權限,你能添加、移除以及重命名該目錄下的文件。考慮一種場景,當你擁有文件的寫權限,可是沒有文件存儲目錄的寫權限,你仍是能修改文件的內容,但不能重命名、移動以及移除目錄下的文件。
  • ◦Execute:在Windows系統中,一個可執行的程序一般都有.exe後綴,你能很方便的運行它。在 UNIX/Linux 中,除非被賦予可執行權限,不然你將不能運行該程序。若是未受權可執行權限,你讓然能夠看並修改程序代碼(被授予讀和寫權限),可是沒法運行它。

linux下文件信息的顯示截圖
Laravel日誌文件寫入失敗(permission denied)Laravel日誌文件寫入失敗(permission denied)
linux下目錄的信息顯示截圖
Laravel日誌文件寫入失敗(permission denied)Laravel日誌文件寫入失敗(permission denied)
以上的截圖顯示了一個文件和文件夾的信息,咱們能夠看到:

  • •r 表明可讀, w 表明可寫, x 表明可執行。
  • •第一位文件顯示 - ,文件顯示 d 。
  • •上面第一張圖片, rw-rw-r-— 中。第一組 rw- 表示文件的全部者對文件有可讀、可寫、不可執行的權限。第二組 rw- 表示文件所屬的組內用戶對該文件有可讀、可寫、不可執行的權限。第三組 r-— 表示其餘任何用戶對該文件有可讀、不可寫、不可執行的權限。
  • •rw-rw-r-- 用二進制表示爲 664 ,每一位若有權限則爲 1 ,不然爲 0 ,第一個三位 rw- 用二進制表示爲 110 轉化爲十進制就是 6,後面兩組依次類推,最後獲得 664 。
  • •上面第一張圖片的 dior www-data 表示該文件的全部者是 dior 用戶,文件屬於 www-data 組。

咱們知道不少應用系統中的日誌是寫文件的,且是以日期來命名文件的。因此第一次建立日誌的用戶就顯得尤其重要,若是文件建立的 Onwer和 Group 不對,其餘的用戶觸發寫入日誌文件就會失敗。

接下來咱們討論下有多少種不一樣的用戶可能建立日誌文件:

  • •Crontab中執行的定時任務,跟建立 Crontab 的用戶有關,此時建立的文件 Owner 和 Group 值分別是該用戶以及默認的 Group 。
  • •一些常駐的後臺進程,好比Laravel中的 queue work ,此時建立的日誌文件 Owner 和 Group 值分別是執行該進程的用戶以及所屬的默認 Group 。
  • •正經常使用戶訪問網站產生的日誌文件,此時建立的日誌文件的 Owner 和 Group 都是 www-data , www-data 用戶是web服務器默認的用戶。

由以上的分析,咱們大概已經找到了解決問題的方法。

  • •執行用戶建立日誌文件的權限爲 664 比較恰當,這就須要當前用戶的umask爲 0002 。
  • •當前執行用戶的默認 Group 應該設置爲 www-data 。

下面就說下個人具體解決方案:

指定www-data用戶執行crontab:

sudo crontab -u www-data -e

Laravel中修改建立日誌文件的權限:

編輯 confog/logging.php 文件
添加 'permission' => 0664
'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 14,
        'permission' => 0664,
],

原文來自: https://www.linuxprobe.com/laravel-permission-denied.html

相關文章
相關標籤/搜索