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" />

  1. 原则上只需要添加第二行,但是实际使用中会提示The main resource set specified [XXX] is not valid有篇文章 提到了需要添加默认的路径监听根目录才能正确运行,于是把默认的tomcat/webapps引入,正确执行了。如果把path绑定根目录应该不需要这一行
  2. docBase应该对应的是一个目录,不过由于这里文件已经确定了,所以直接指定到 war 包。

参考资料