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 "%r" %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管理界面分两步:
- 创建tomcat管理员用户
- 配置允许其他网段访问管理界面(默认只允许网址访问)
首先添加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 "%r" %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目录下,其他目录中的资源照常。可以参考下图:
效果如下:
本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【67GYYVNU】获取授权信息。