Permissions

Tomcat 9 下的應用程序日誌記錄中斷:/var/log/myapp 的權限被拒絕

  • July 24, 2020

我有一個在 Ubuntu Linux 上的 Apache Tomcat 下執行的 Java webapp。當我從 Tomcat 8 從 Tomcat 9 升級時,應用程序不再能夠將日誌文件寫入/var/log/myapp. 我不知道為什麼它沒有權限登錄到這個位置。

我的第一個想法是使用者改變了。Tomcat 8 在tomcat8:tomcat8使用者下執行。Tomcat 9 在tomcat:tomcat使用者下執行。我用這些權限更新了目錄。tomcat使用者和組都有tomcat寫權限。

我還檢查了該目錄的寫入和執行權限。該目錄具有寫入和執行權限,所有父目錄都具有執行權限。

/var/log/myapp/ drwxrwxr-x  tomcat tomcat
/var/log        drwxrwxr-x  root syslog 
/var            drwxr-xr-x  root root            
/               drwxr-xr-x  root root

如果我在我的 Web 應用程序下執行以下程式碼

   File logdir =  new File("/var/log/myapp");
   setAttribute("debug", 
       "<br>user: " + System.getProperty("user.name") +
       "<br>execute: " + logdir.canExecute() +
       "<br>read: " + logdir.canRead() +
       "<br>write: " + logdir.canWrite()
   );

它列印出沒有寫權限

user: tomcat
execute: true
read: true
write: false 

tomcat如果我以使用者身份在 main 方法中執行類似的程式碼

File logdir =  new File("/var/log/myapp");
   System.out.println("\n user: " + System.getProperty("user.name") +
       "\n execute: " + logdir.canExecute() +
       "\n read: " + logdir.canRead() +
       "\n write: " + logdir.canWrite()
       );

它列印出它有寫權限

user: tomcat
execute: true
read: true
write: true

我已經用盡了所有我知道該怎麼做的調試。是什麼阻止我的 Web 應用程序寫入 tomcat 9 下的這個目錄?我需要做什麼來修復它。

這是由作為 Debian/Ubuntu 一部分的 tomcat 9 周圍的新 systemd 沙盒引起的。要解決這個問題,您需要告訴 systemd 允許對 Tomcat 的其他目錄進行讀寫訪問。

sudo mkdir -p /etc/systemd/system/tomcat9.service.d
echo -e "[Service]\nReadWritePaths=/var/log/" | sudo tee /etc/systemd/system/tomcat9.service.d/logging-allow.conf
sudo systemctl daemon-reload
sudo systemctl restart tomcat9

進行這些更改後,Web 應用程序可以再次寫入自己的/var/log.

資料來源:Debian Tomcat 9 發行說明

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