Tomcat 7无写入权限求助:CentOS 7下无法创建目录/写入文件
你遇到的这个权限问题,大概率是SELinux安全机制限制导致的——即便你已经调整了目录的属主和权限,CentOS 7默认开启的SELinux会基于安全上下文控制进程的访问权限,这是很多人排查时容易忽略的关键点。
下面给你一步步的排查和解决方案:
1. 先验证SELinux是否是问题根源
首先检查SELinux的运行状态:
sestatus
如果输出里Current mode显示为enforcing,说明SELinux处于强制模式,很大概率是它阻止了Tomcat的写入操作。
你可以先临时关闭SELinux做测试:
setenforce 0
接着重启Tomcat服务:
systemctl restart tomcat
如果此时应用能正常创建目录和写入文件,那就实锤是SELinux的问题了。
2. 永久解决:调整SELinux安全上下文
临时关闭SELinux不是长久之计,我们需要给目标目录设置正确的SELinux上下文,让Tomcat拥有合法的写入权限:
具体步骤:
- 先查看Tomcat默认可写目录的SELinux上下文(比如
/var/lib/tomcat/webapps):
ls -Z /var/lib/tomcat/webapps
你会看到类似这样的输出:
drwxr-xr-x. tomcat tomcat system_u:object_r:tomcat_var_lib_t:s0 ROOT
其中tomcat_var_lib_t就是Tomcat可写目录的标准上下文类型。
- 给你的
/usr/share/tomcat/myDir目录添加这个上下文规则(永久生效):
semanage fcontext -a -t tomcat_var_lib_t "/usr/share/tomcat/myDir(/.*)?"
- 将上下文规则应用到目录及所有子内容:
restorecon -Rv /usr/share/tomcat/myDir
- 最后重启Tomcat服务:
systemctl restart tomcat
3. 更规范的替代方案:使用Tomcat默认可写目录
其实官方源安装的Tomcat已经把可写目录(temp、work、logs等)软链接到了/var下的对应路径(比如/var/cache/tomcat/temp、/var/log/tomcat),这些目录已经配置好了正确的SELinux上下文和权限。
你可以修改应用的配置,让它写入这些默认的可写目录,这样既不用额外调整SELinux,也更符合CentOS的系统规范。
4. 额外排查:检查ACL权限
如果调整SELinux后还是有问题,检查目录的ACL权限是否有额外限制:
getfacl /usr/share/tomcat/myDir
确保tomcat用户拥有读写执行权限,如果缺失,可以用以下命令添加:
setfacl -R -m u:tomcat:rwx /usr/share/tomcat/myDir
另外也要确认/usr/share目录的权限是否允许tomcat用户进入——默认/usr/share是drwxr-xr-x,其他用户有执行权限,若被修改过则需要调整回来。
内容的提问来源于stack exchange,提问作者Peter

