Apache Axis基础Web服务本地正常,远程CentOS7服务器运行异常求助
我之前部署Axis服务到CentOS7的Tomcat时也碰到过几乎一模一样的问题,结合你的场景,咱们来拆解原因和对应的解决办法:
核心原因
本地Windows能自动生成jwsClasses目录和文件,而远程CentOS7不行,主要是Linux的权限管控和安全机制导致的,具体分这几点:
Tomcat运行用户权限不足
Windows系统默认对文件目录的权限管控比较宽松,本地运行Tomcat的用户(比如你的登录用户)对WEB-INF目录有读写权限,所以Axis能自动生成编译所需的文件。但CentOS7上Tomcat通常是以tomcat用户运行的,如果这个用户对/usr/share/tomcat/webapps/axis/WEB-INF目录没有写入权限,自然无法创建jwsClasses文件夹和Test.java文件。SELinux安全限制
CentOS7默认开启SELinux,它会在文件系统权限之外再做一层安全校验。即使Tomcat用户有文件系统的写权限,SELinux的上下文设置也可能阻止Tomcat进程在WEB-INF目录下创建新文件或目录。配置差异(概率较低)
虽然你是直接拷贝官方axis目录,但不排除远程Tomcat的全局配置(比如server.xml、web.xml)或者Axis的局部配置(axis-web.xml)里有禁用动态JWS编译的选项。
解决步骤
第一步:排查并修复文件权限问题
先确认Tomcat的运行用户:
ps aux | grep tomcat输出里第一列就是运行Tomcat的用户(通常是
tomcat)。修改axis目录的所属权限:
# 把WEB-INF目录及其子目录的所属用户/组改为tomcat chown -R tomcat:tomcat /usr/share/tomcat/webapps/axis/WEB-INF # 设置目录读写权限,确保tomcat用户能写入 chmod -R 755 /usr/share/tomcat/webapps/axis/WEB-INF手动创建jwsClasses目录并设置权限(可选,提前规避自动创建失败的问题):
mkdir /usr/share/tomcat/webapps/axis/WEB-INF/jwsClasses chown tomcat:tomcat /usr/share/tomcat/webapps/axis/WEB-INF/jwsClasses重启Tomcat,调用客户端测试是否正常。
第二步:排查SELinux限制
如果权限修复后还是不行,大概率是SELinux的问题:
临时关闭SELinux测试:
setenforce 0重启Tomcat后再调用客户端,如果能正常生成文件,说明SELinux是元凶。
永久解决(推荐保留SELinux的安全防护):
修改WEB-INF目录的SELinux上下文,让Tomcat(属于httpd类服务)拥有读写权限:chcon -R system_u:object_r:httpd_sys_rw_content_t:s0 /usr/share/tomcat/webapps/axis/WEB-INF如果不需要SELinux(不推荐),可以修改配置文件永久关闭:
编辑/etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled,然后重启服务器。
第三步:验证Axis与Tomcat配置
如果上面两步都没解决,再检查配置:
- 打开
/usr/share/tomcat/webapps/axis/WEB-INF/web.xml,搜索disableJWS参数,确保它的值是false(默认应该是false,要是被改成true就会禁用JWS动态编译)。 - 检查Tomcat全局的
web.xml(/usr/share/tomcat/conf/web.xml),有没有添加限制WEB-INF写入的security-constraint配置,如果有,暂时注释掉测试。
内容的提问来源于stack exchange,提问作者Brent Sandstrom

