Nginx

Nginx 萬用字元子域自動創建訪問日誌文件

  • November 16, 2019

我在 NGINX 上有近 200 個子域並有指令

access_log  /var/log/nginx/$host-access.log;

問題是實際上不存在任何子域訪問日誌文件,因此錯誤日誌載入了類似的錯誤

(13: Permission denied) while logging request...

這是一個 Wordpress 多站點安裝,因此子域是在 WP 數據庫中創建的。NGINX 在收到請求之前一無所知。

這應該如何處理?我考慮過編寫一個 PHP 腳本來解析 URI 並檢查日誌文件是否存在,如果不存在就編寫它。我不在乎是否沒有記錄第一個請求。或者有沒有辦法讓 NGINX 最初創建日誌文件,如果它不存在?我知道這會從錯誤的請求中創建一些垃圾日誌文件。PHP 腳本會避免這種情況。任何建議表示讚賞!

在文件名中使用$host不是一個好方法。這意味著您的 Web 伺服器可能會通過發送具有數百萬個不同Host:標頭內容的請求而受到攻擊。這可能會導致文件系統中的 inode 耗盡。

為防止這種情況,您應該在 nginxserver_name指令中列出所有子域,然後將$server_name其用作日誌文件名中的變數。對於預設虛擬主機,您可以使用一個日誌文件或根本不使用日誌文件。

但是,要解決您目前的權限問題,您應該確保執行 nginx 的使用者對 nginx 日誌目錄具有寫入權限。

例如,您應該應用以下內容:

  • 日誌文件目錄位於/var/log/nginx
  • 日誌目錄所有者是www-data
  • nginx 以www-data使用者身份執行
  • 日誌目錄權限為0755

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