tomcat是一个基于java的web服务软件,其支持使用jsp或servelt来进行网页的搭建。
tomcat默认不在CentOS8的软件源中,需要自己手动下载安装,tomcat官网

本文使用tomcat9.0.37作为样例演示,不同版本的tomcat使用操作略有不同,需要注意。

安装

在进行tomcat安装之前先安装一些依赖的软件包

dnf install java-1.8.0-openjdk    # tomcat的运行环境
dnf install apr-devel java-1.8.0-openjdk-devel redhat-rpm-config openssl-devel    # 编译tomcat-native所需要的头文件

配置java的环境变量,然后使用命令source java-openjdk.sh执行生效即可。

# file: /etc/profile.d/java-openjdk.sh

# java-openjdk environment initialization

if [ -z "$JAVA_HOME" ]; then
    export JAVA_HOME="/usr/lib/jvm/java"
fi

if [ -z "$CLASSPATH" ]; then
    export CLASSPATH="$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
fi

解压安装tomcat二进制包。

tar -xf apache-tomcat-9.0.37.tar.gz  -C /opt/    # 解压二进制安装包
cd /opt/    # 切换到/opt目录
ln -s apache-tomcat-9.0.37/ tomcat    # 创建一个软连接,方便操作使用
ln -s /opt/tomcat/bin/catalina.sh  /usr/sbin/catalina # 创建一个管理程序的软连接,方便使用
useradd -r -s /sbin/nologin -M -d /opt/tomcat/ -c tomcat tomcat    # 创建用户
cd tomcat && chown tomcat:tomcat -R ./

现在安装tomcat-native,该软件包的源码默认存放在 bin 目录下,自行解压编译安装即可。
如果不想编译安装也可以直接使用epel库中的tomcat-native。

cd  $(mktemp -d)    # 进入到一个临时目录
cp /opt/tomcat/bin/tomcat-native.tar.gz  ./
tar -xf tomcat-native.tar.gz
cd tomcat-native-1.2.24-src/native/
./configure  --libdir=/usr/lib64/ --with-ssl    # 应为我使用的是64位操作系统,所以这里需要指定安装到lib64目录中
make install

编写一个systemd的unit,方便使用

# file: /etc/systemd/system/tomcat.service

[Unit]
Description=Tomcat web server
After=syslog.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking

User=tomcat
Group=tomcat

ExecStart=/usr/sbin/catalina start
ExecStop=/usr/sbin/catalina stop

现在安装完了tomcat,可以尝试以下启动程序了

systemctl daemon-reload
systemctl start tomat
net -ltn    # 查询是否监听在8080端口
firewall-cmd --add-port=8080/tcp --permanent

目录结构

  • bin:管理脚本
  • lib:运行库
  • conf:配置文件
  • logs:日志
  • temp:临时目录
  • webapps:站点应用目录,其中由一个ROOT目录,作为默认的根页面。
  • work:webapps中的源码编译完后存放位置,无需改动,tomcat会根据请求自动加载更新

基础配置

tomcat使用xml来进行服务配置,其主要配置文件为conf/server.xml,以下是配置文件的注释
注意在编写配置文件时一定要要注意大小写,tomcat严格区分大小写,不能写错了,可以查看日志来配置文件是否由错误。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"><!--服务根节属性
  port指定关闭监听端口,设置为-1表示禁用,shutdown指定关闭口令
  用法:使用nc连接该端口然后发送口令就会关闭服务了-->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!--加载监听器,当发生特定事件时将执行操作
  这里是日志监听器。className指定要引入的java类名称-->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources><!--定义全局JNDI资源-->
  <!--Resource定义全局的可用资源,例如数据库、jar包或HTML等,这里加载了tomcat用户数据库-->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina"><!--共享引擎(Engine)的分组连接器(Connector),整个配置文件最重要的部分-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> <!--指定连接器的相关属性-->
    <Engine name="Catalina" defaultHost="localhost"><!--指定接收处理特定Service的请求
    name指定引擎名称,需要全局唯一,defaultHost指定默认host,如果虚拟主机不匹配则将都转发到指定host-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/><!--设置用户和角色
               在默认webapps中host-manager和manager两个程序需要使用到该用户数据库-->
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"><!--指定虚拟主机-->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!--处理和过滤去要求,这里是记录请求日志-->
      </Host>
    </Engine>
  </Service>
</Server>

配置SSL

这里使用openssl来搭建,tomcat同时支持keystore,本文不过多讨论。
首先创建证书。注意:这里创建的是自签证书,仅作实验使用。

mkdir -p conf/certs/ && cd  conf/certs/
openssl genrsa -out tomcat.key 1024
openssl req -new -x509 -key tomcat.key -out tomcat.pem

然后在server.xml中的service属性中添加子属性,内容如下:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateFile="conf/certs/tomcat.pem"
                         certificateKeyFile="conf/certs/tomcat.key"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

注:这一段,在默认配置中已以注销的形式存在,只需要稍加修改即可。

然后重启服务器即可

systemctl restart tomcat
firewall-cmd --add-port=8443/tcp --permanent

启用web管理界面

启动web管理界面分两步:

  1. 创建tomcat管理员用户
  2. 配置允许其他网段访问管理界面(默认只允许网址访问)

首先添加tomcat用户,这需要在conf/tomcat-user.xml文件中进行配置

<!--file: /opt/tomcat/conf/tomcat-user.xml -->

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
  <!--添加以下部分即可-->
  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>
  <user username="admin" password="123456" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>

然后在每个webapps中修改访问规则
例如host-manager就需要如下进行修改,编辑文件webapps/host-manager/META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^.*$" /><!--只需要修改这一行即可-->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

这样就可以访问使用web管理界面了

配置多虚拟主机

server.xml文件中的engine属性下添加子属性,内容如下:

      <Host name="server2.somata.net" appBase="myapps"
              unpackWARs="true" autoDeploy="true">
        <Context path="/rewrite" docBase="/opt/tomcat/others/rewrite" />
        <!--默认 docBase 使用的路径是相对于 appBase 的,所以这里需要使用绝对路径-->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="server2_somata_net_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

这里添加了一台server2.somata.net的虚拟主机,同时设置日志和路径重写。
待会访问的时候需要使用域名访问,不可以使用IP进行访问,否则将因为匹配不到虚拟主机而重定向到默认虚拟主机localhost中。

然后创建以下网页文件:

mkdir -p myapps/{ROOT,normal,default} others/rewrite

这里在每个目录中都创建一个index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<html>
    <head>
        <meta charset="utf-8">
        <title>主页</title><!-可以对这个文件做出不同的修改以区别不同文件-->
    </head>
    <body>
        <p>请求地址:<%=request.getRequestURL()%><p>
        <p>客户端IP:<%=request.getRemoteAddr()%><p>
    </body>
</html>

tomcat的路径匹配机制和httpd略有不同,如果访问根目录资源,将重定向到ROOT目录下,其他目录中的资源照常。可以参考下图:
tomcat路径机制
效果如下:

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【67GYYVNU】获取授权信息。

最后修改:2020 年 09 月 02 日 10 : 19 AM
如果觉得我的文章对你有用,请随意赞赏