Tomcat运行报500错误提示index_jsp.class权限被拒绝如何解决
问题根因
该错误属于Linux文件权限不匹配导致的访问失败:Tomcat运行时需要读取JSP编译生成的index_jsp.class文件,但启动Tomcat的系统用户没有该文件以及父级目录的访问权限,哪怕文件物理存在也会抛出权限拒绝类的FileNotFoundException。
完整报错栈
Root Cause java.io.FileNotFoundException: /opt/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.class (Permission denied) java.io.FileInputStream.open0(Native Method) java.io.FileInputStream.open(FileInputStream.java:195) java.io.FileInputStream.<init>(FileInputStream.java:138) sun.misc.URLClassPath$FileLoader$1.getInputStream(URLClassPath.java:1397) sun.misc.Resource.cachedInputStream(Resource.java:77) sun.misc.Resource.getByteBuffer(Resource.java:160) java.net.URLClassLoader.defineClass(URLClassLoader.java:460) java.net.URLClassLoader.access$100(URLClassLoader.java:74) java.net.URLClassLoader$1.run(URLClassLoader.java:369) java.net.URLClassLoader$1.run(URLClassLoader.java:363) java.security.AccessController.doPrivileged(Native Method) java.net.URLClassLoader.findClass(URLClassLoader.java:362) org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:129) org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:58) org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:192) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) org.apache.jasper.servlet.JspServlet.init(JspServlet.java:135) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748)
权限核查步骤
- 第一步查询Tomcat进程的运行用户:执行命令
ps aux | grep tomcat,输出结果的第一列即为当前运行Tomcat服务的系统用户,常见值为tomcat、root等。 - 第二步查询目标class文件的权限归属:执行命令
ls -l /opt/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/index_jsp.class,查看输出中的属主用户、属组以及权限位,确认Tomcat运行用户是否有该文件的读取权限。 - 第三步逐级核查父目录执行权限:Linux系统下访问目录内的文件需要目录的执行(x)权限,依次执行以下命令确认每一级父目录的权限对Tomcat运行用户开放执行权限:
ls -ld /opt/tomcat/work/ ls -ld /opt/tomcat/work/Catalina/ ls -ld /opt/tomcat/work/Catalina/localhost/ ls -ld /opt/tomcat/work/Catalina/localhost/ROOT/ ls -ld /opt/tomcat/work/Catalina/localhost/ROOT/org/
修复配置方法
- 方案1(通用稳妥):将整个Tomcat目录的归属修改为Tomcat运行用户,假设查询到的运行用户和用户组都是tomcat,执行命令:
chown -R tomcat:tomcat /opt/tomcat/ - 方案2(仅修改工作目录):如果不需要修改全目录权限,单独修改work目录的归属和权限即可:
chown -R tomcat:tomcat /opt/tomcat/work/ chmod -R u+rwx,g+rwx,o+rx /opt/tomcat/work/
- 权限修改完成后重启Tomcat服务,重新访问应用即可验证问题是否解决。
内容的提问来源于stack exchange,提问作者Madhavi Thotta
相关产品推荐
相关产品推荐

