У меня есть веб-приложение Java, которое работает под Apache Tomcat в Ubuntu Linux. Когда я обновился с Tomcat 9 с Tomcat 8, приложение больше не могло записывать файлы журнала в /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
Если я запустил следующий код в своем веб-приложении
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
пользователь
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
Я исчерпал всю отладку, которую умею делать. Что мешает моему веб-приложению записывать в этот каталог под tomcat 9? Что мне нужно сделать, чтобы это исправить.
Это вызвано новой изолированной программной средой systemd вокруг tomcat 9 как части Debian / Ubuntu. Чтобы решить эту проблему, вам нужно указать 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
После внесения этих изменений веб-приложения могут снова писать в свои собственные каталоги в /var/log
.
Источник: Заметки о выпуске Debian Tomcat 9
Ответ Стивена Остермиллера решает проблему.
Другой способ сделать это:
systemctl edit tomcat9.service
вставить
[Service]
ReadWritePaths=/var/log/
Это будет записано в /etc/systemd/system/tomcat9.service.d/override.conf.
Тогда сделай
systemctl daemon-reload
systemctl restart tomcat9.service
Вы можете вернуться к оригиналу с помощью
systemctl revert tomcat9.service