Tomcat 非正常操作
虽然作为最常用的 Java 中最常用 Tomcat,但是不幸的是,一些问题踩坑耗时反而比冷门技术更长……
部分操作属于逆着趋势而行,比如正常人可能都希望非 Root 启动 Tomcat,但是真正需要这么做的时候,反而更难检索到相关资料。
Root 启动 Tomcat9
修改为 root 启动 tomcat9
如果是非 root 用户的其他用户,需要修改相关文件权限
root 用户不需要修改,本身就有权限
sudo chown -R <username> /usr/share/tomcat9/conf/ sudo chgrp -R <username> /usr/share/tomcat9/conf/ sudo chown -R <username> /usr/share/tomcat9/webapps/ sudo chgrp -R <username> /usr/share/tomcat9/webapps/
要实现 root 用户启动,需要修改 systemctl 的启动文件
sudo vim /usr/lib/systemd/system/tomcat9.service
将-user tomcat9 \
删除即可(修改为-user root \
会出现蜜汁权限问题,虽然是 root 用户 ,但是并没有各种权限)
[Unit] Description=Tomcat 9 servlet container After=network.target [Service] Type=forking PIDFile=/var/run/tomcat9.pid Environment=CATALINA_PID=/var/run/tomcat9.pid Environment=TOMCAT_JAVA_HOME=/usr/lib/jvm/default-runtime Environment=CATALINA_HOME=/usr/share/tomcat9 Environment=CATALINA_BASE=/usr/share/tomcat9 Environment=CATALINA_OPTS= Environment=ERRFILE=SYSLOG Environment=OUTFILE=SYSLOG ExecStart=/usr/bin/jsvc \ -Dcatalina.home=${CATALINA_HOME} \ -Dcatalina.base=${CATALINA_BASE} \ -Djava.io.tmpdir=/var/tmp/tomcat9/temp \ -cp /usr/share/java/commons-daemon.jar:/usr/share/java/eclipse-ecj.jar:${CATALINA_HOME}/bin/bootstrap.jar:${CATALINA_HOME}/bin/tomcat-juli.jar \ -user tomcat9 \ -java-home ${TOMCAT_JAVA_HOME} \ -pidfile /var/run/tomcat10.pid \ -errfile ${ERRFILE} \ -outfile ${OUTFILE} \ $CATALINA_OPTS \ org.apache.catalina.startup.Bootstrap ExecStop=/usr/bin/jsvc \ -pidfile /var/run/tomcat10.pid \ -stop \ org.apache.catalina.startup.Bootstrap [Install] WantedBy=multi-user.target
添加其他目录并绑定非根目录
一般而言,需要把编译出来的 war 包 放置在tomcat/webapps
目录中,但是一些情况下可能并不希望都放在这里(比如放在这个目录通常是需要一些特殊权限的,如果能确保不同用户只能放在自己的目录,tomcat 去各个目录获取 war 包可能会更方便一点。
要添加其他目录,需要修改server.xml
文件
sudo vim /usr/share/tomcat9/conf/server.xml
在文件末尾,有一个<Host></Host>
部分,需要在其中添加如下两行即可。
<Context path="" docBase="" debug="1" reloadable="true" crossContext="true" /> <Context path="/xxx" docBase="/path-to-your-war/xxx.war" debug="1" reloadable="true" crossContext="true" />
注
- 原则上只需要添加第二行,但是实际使用中会提示
The main resource set specified [XXX] is not valid
。有篇文章 提到了需要添加默认的路径监听根目录才能正确运行,于是把默认的tomcat/webapps
引入,正确执行了。如果把path
绑定根目录应该不需要这一行 docBase
应该对应的是一个目录,不过由于这里文件已经确定了,所以直接指定到 war 包。