tomcat
tomcat是apache软件基金会(apache software foundation)的jakarta 项目中的一个核心项目,由apache、sun和其他一些公司及个人共同开发而成。
tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试jsp程序的首选
tomcat官网: http://tomcat.apache.org
tomcat安装

tomcat是java语言编写程序,首先在虚拟机中安装jdk
注意:.rpm包如果依赖一些组件,需要我们手动解决安装依赖
安装jdk的rpm包
[root@localhost tmp]# cd /tmp
[root@localhost tmp]# rpm -ivh jdk-8u251-linux-x64.rpm
警告:jdk-8u251-linux-x64.rpm: 头v3 rsa/sha256 signature, 密钥 id ec551f03: nokey
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_251-fcs ################################# [100%]unpacking jar files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...此时:jdk已经被安装在了 /usr/java/jdk1.80_xxx 目录下。
配置环境变量
[root@localhost java]# vi /etc/profile 在profile中尾部追加一下3行配置 export java_home=/usr/java/default export path=$path:$java_home/bin export classpath=. //刷新环境变量 [root@localhost java]# source /etc/profile 如果刷新环境变量时,有异常信息,大多是配置环境变量的关键字有错
安装tomcat
#获取tomcat压缩包 #解压 [root@localhost opt]# tar -xzvf apache-tomcat-8.5.78.tar.gz
tomcat为java语言编写,不需要编译安装,解压即用
启停命令
注意:tomcat兼容linux和windows系统,其中.bat文件为windows系统可用.sh文件为linux系统可用
启动tomcat
[root@localhost bin]# /opt/apache-tomcat-8.5.78/bin/startup.sh
访问tomcat
#查看tomcat程序占用端口 [root@localhost bin]# netstat -tunlp
#浏览器输入访问地址 http://主机ip:8080
关闭tomat
#方法一,运行shutdown.sh脚本 [root@localhost bin]# /opt/apache-tomcat-8.5.78/bin/shutdown.sh #方法二,通过8005端口关闭,此端口只能本机访问 [root@localhost bin]# telnet 127.0.0.1 8005 #通过telnet连接8005端口 trying 127.0.0.1... connected to 127.0.0.1. escape character is '^]'. shutdown #输入shutdown
简单的tomcat项目部署演示
将项目放入tomcat的webapps文件夹中

开启tomcat
[root@localhost webapps]# /opt/apache-tomcat-8.5.78/bin/startup.sh
访问项目
访问路径为 http://主机ip:8080/项目名/资源名

tomcat主配置文件解析
tomcat配置文件被存放在conf中,其中最主要的配置文件为server.xml
#配置文件示例
<?xml version="1.0" encoding="utf-8"?>
<server port="8005" shutdown="shutdown">
<listener classname="org.apache.catalina.startup.versionloggerlistener" />
<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>
<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">
<connector port="8080" protocol="http/1.1"
connectiontimeout="20000"
redirectport="8443" />
<engine name="catalina" defaulthost="localhost">
<realm classname="org.apache.catalina.realm.lockoutrealm">
<realm classname="org.apache.catalina.realm.userdatabaserealm"
resourcename="userdatabase"/>
</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>server
是整个配置文件的根元素。表示整个catalina容器。
#参数信息
classname:实现了org.apache.catalina.server接口的类名,默认实现了 org.apache.catalina.core.standardserver类;
port:tomcat服务器监听用于关闭tomcat服务器的命令(必须);
shutdown:发送到端口上用于关闭tomcat服务器的命令;connector
连接器,负责接收客户的请求,以及向客户端回送响应的消息
#参数解析
allowtrace:是否允许http的trace方法,默认为false;
emptysessionpath:如果设置为true,用户的所有路径都将设置为/,默认为false;
enablelookups:调用request、getremotehost()执行dns查询,以返回远程主机的主机名,如果设置为false,则直接返回ip地址;
maxpostsize:指定post方式请求的最大量,没有指定默认为2097152;
protocol:值必须为http1.1,如果使用ajp处理器,该值必须为ajp/1.3;
proxyname:如这个连接器正在一个代理配置中被使用,指定这个属性,在request.getservername()时返回;
redirectport:如连接器不支持ssl请求,如收到ssl请求,catalina容器将会自动重定向指定的端口号,让其进行处理;
scheme:设置协议的名字,在request.getscheme()时返回,ssl连接器设为”https”,默认为”http”;
secure:在ssl连接器可将其设置为true,默认为false;
uriencoding:用于解码url的字符编码,没有指定默认值为iso-8859-1;
usebodyencodingforuri:主要用于tomcat4.1.x中,指示是否使用在contenttype中指定的编码来取代uriencoding,用于解码uri查询参数,默认为false;
xpoweredby:为true时,tomcat使用规范建议的报头表明支持servlet的规范版本,默认为false;
acceptcount:当所有的可能处理的线程都正在使用时,在队列中排队请求的最大数目。当队列已满,任何接收到的请求都会被拒绝,默认值为10;
buffersize:设由连接器创建输入流缓冲区的大小,以字节为单位。默认情况下,缓存区大的大小为2048字节;
compressablemimetype:mime的列表,默认以逗号分隔。默认值是text/html,text/xml,text/plain;
compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off;
connectiontimeout:设置连接的超时值,以毫秒为单位。默认值为60000=60秒;
disableuploadtimeout:允许servlet容器,正在执行使用一个较长的连接超时值,以使servlet有较长的时间来完成它的执行,默认值为false;
maxhttpheadersize:http请求和响应头的最大量,以字节为单位,默认值为4096字节;
maxkeepaliverequest:服务器关闭之前,客户端发送的流水线最大数目。默认值为100;
maxsparethreads:允许存在空闲线程的最大数目,默认值为50;
minsparethreads:设当连接器第一次启协创建线程的数目,确保至少有这么多的空闲线程可用。默认值为4;
port:服务端套接字监听的tcp端口号,默认值为8080(必须);
socketbuffer:设socket输出缓冲区的大小(以字节为单位),-1表示禁止缓冲,默认值为9000字节;
tonodelay:为true时,可以提高性能。默认值为true;
threadpriority:设jvm中请求处理线程优先级。默认值为normal-priority;engine
为特定的service处理所有的请示。每个service只能包含一个engine元素,它负责接收和处理此service所有的连接器收到的请求,向连接发回响应,并最终显示在客户端。<engine>至少有一个<host>元素,必须至少有一个<host>属性的名字与defaulthost指定的名字相匹配。
#参数解析 classname:实现org.apache.catalina.engine接口,默认实现类为org.apache.catalina.core.standardengine类; defaulthost:默认主机名,值必须与<service>的name值相匹配; name:指定engine的逻辑名字(必须); jvmroute:在负载匀衡中使用的标识符,必须唯一;
host
表示一个虚拟主机,为特定的虚拟主机处理所有请求
appbase:设定应用程序的基目录,绝对路径或相对于%catalina_home%的路径名;autodeploy:指示tomcat运行时,如有新的web程序加开appbase指定的目录下,是否为自动布署,默认值为true;classname:实现了org.apache.catalina.host接口的类,标准实现类为org.apache.catalina.core.standardhost类;deployonstartup:tomcat启动时,是否自动部署appbase属性指定目录下所有的web应用程序,默认值为true;name:虚拟主机的网络名(必须);
context
一个web应用程序,处理当前web应用程序的所有请求,每一个<context>必须使用唯一的上下文路径
classname:实现了org.apache.catalina.context接口的类,标准实现类org.apache.catalina.core.standardcontext类;cookies:是否将cookie应用于session,默认值为true;crosscontext:是否允许跨域访问,为true时,在程序内调用servletcontext.getcontext()方法将返回一个虚拟主机上其它web程序的请求调度器;默认值为false,调 径用getcontext()返回为null;docbase:绝对路径或相对于host的appbase 属性的相对路径;privileged:为true,允许web应用程序使用容器的servlet;path:指定上下文路径。一个虚拟主机中,上下文路径必须唯一;reloadable:为true,tomcat运行时,如果web-inf/classes和web-inf/lib目录中有改变,tomcat会自动重新加载该web应用程序。虽方便,但开销也大,默认值为false,我们在调用可以打开,发布后再关闭;cachemaxsize:静态资源缓存最大值,以kb为单位,默认值为10240kb;cachingallowed:是否允许静态资源缓存,默认为true;casesensitive:默认为true,资源文件名大小写敏感,如果为false大小写不敏感;unpackwar:默认为true;workdir:为web应用程序内部的servlet指定临时读写的目录路径名。如没有设置,则tomcat会在%catalina_home%/work目录下提供一个合适的目录;
<server port="8005" shutdown="shutdown">
<listener classname="org.apache.catalina.startup.versionloggerlistener" />
<listener classname="org.apache.catalina.security.securitylistener" />
<listener classname="org.apache.catalina.core.aprlifecyclelistener" sslengine="on" />
<listener classname="org.apache.catalina.core.jasperlistener" />
<listener classname="org.apache.catalina.core.jrememoryleakpreventionlistener" />
<listener classname="org.apache.catalina.mbeans.globalresourceslifecyclelistener" />
<listener classname="org.apache.catalina.core.threadlocalleakpreventionlistener" />
<globalnamingresources>
<!-- 全局命名资源,来定义一些外部访问资源,其作用是为所有引擎应用程序所引用的外部资源的定义 -->
<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>
<!-- 定义的一个名叫“userdatabase”的认证资源,将conf/tomcat-users.xml加载至内存中,在需要认证的时候到内存中进行认证 -->
<service name="catalina">
<!-- # 定义service组件,同来关联connector和engine,一个engine可以对应多个connector,每个service中只能一个engine -->
<connector port="80" protocol="http/1.1" connectiontimeout="20000" redirectport="8443" />
<!-- 修改http/1.1的connector监听端口为80.客户端通过浏览器访问的请求,只能通过http传递给tomcat。还可以设置server与uriencoding参数 -->
<engine name="catalina" defaulthost="test.com">
<!--修改当前engine,默认主机是:www.test.com,此处写主机域名或ip -->
<realm classname="org.apache.catalina.realm.lockoutrealm">
<realm classname="org.apache.catalina.realm.userdatabaserealm"
resourcename="userdatabase"/>
</realm>
<!-- realm组件,定义对当前容器内的应用程序访问的认证,通过外部资源userdatabase进行认证 -->
<host name="test.com" appbase="/web" unpackwars="true" autodeploy="true">
<!-- 定义一个主机,域名为:test.com,应用程序的目录是/web,设置自动部署,自动解压 -->
<alias>www.test.com</alias>
<!-- 定义一个别名www.test.com,此处写主机域名或ip-->
<context path="" docbase="www/" reloadable="true" />
<!-- 定义该应用程序,访问路径"",即访问www.test.com即可访问,网页目录为:相对于appbase下的www/,即/web/www,并且当该应用程序下web.xml或者类等有相关变化时,自动重载当前配置,即不用重启tomcat使部署的新应用程序生效 -->
<context path="/bbs" docbase="/web/bbs" reloadable="true" />
<!-- 定义另外一个独立的应用程序(虚拟主机),访问路径为:www.test.com/bbs,该应用程序网页目录为/web/bbs -->
<valve classname="org.apache.catalina.valves.accesslogvalve" directory="/web/www/logs"
prefix="www_access." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 定义一个valve组件,用来记录tomcat的访问日志,日志存放目录为:/web/www/logs如果定义为相对路径则是相当于$catalina_home,并非相对于appbase,这个要注意。定义日志文件前缀为www_access.并以.log结尾,pattern定义日志内容格式,具体字段表示可以查看tomcat官方文档 -->
</host>
<host name="manager.test.com" appbase="webapps" unpackwars="true" autodeploy="true">
<!-- 定义一个主机名为man.test.com,应用程序目录是$catalina_home/webapps,自动解压,自动部署 -->
<valve classname="org.apache.catalina.valves.remoteaddrvalve" allow="172.16.100.*" />
<!-- 定义远程地址访问策略,仅允许172.16.100.*网段访问该主机,其他的将被拒绝访问 -->
<valve classname="org.apache.catalina.valves.accesslogvalve" directory="/web/bbs/logs"
prefix="bbs_access." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 定义该主机的访问日志 -->
</host>
</engine>
</service>
</server
log相关的日志
- catalina.2024-08-14.log 运行时的错误信息日志
- host-manager.2024-08-14.log 记录网上对tomcat做的配置
- localhost_access_log.2024-08-14.txt 访问日志,直到谁访问了我
- catalina.out 运行的报错信息日志总和
- localhost.2024-08-14.log tomcat启动请求信息
- manager.2024-08-14.log 和host-manager.2024-08-14.log一样,一般都是空的,不是空的时那就是被入侵了
tomcat部署项目
tomcat除了可以部署文件夹之外,还可以部署编程人员打包好的.war和.jar文件
部署jpress---war
配置数据库环境
#创建ipress分库,并设置编码为utf8 mysql> create database jpress default character set utf8; #创建用户 mysql> grant all on jpress.* to jpress@'%' identified by '111111';
部署项目
将war包放入tomcat的项目目录

启动tomcat
[root@localhost webapps]# /opt/apache-tomcat-8.5.78/bin/startup.sh

访问项目

配置数据库信息

配置网站信息
访问网站,登录
http://主机ip:8080/jpress-web-newest/admin/login

部署当当网--文件夹
配置数据库
# 创建分库 mysql> create database dang; # 创建用户 mysql> grant all on dang.* to dang@'%' identified by '111111'; # 导入数据 mysql> use dang mysql> source /opt/dang.sql
修改项目中数据库连接配置
位置:\web-inf\classes


部署项目

启动项目
[root@localhost myweb]# /opt/apache-tomcat-8.5.78/bin/startup.sh
访问
http://主机ip:8080/dang/book/bookface.do

tomcat优化
常用优化手段固定,需要多看多记忆
安全优化
telnet管理端口保护(强制)
| 类别 | 配置内容及说明 | 标准配置 | 备注 |
|---|---|---|---|
| telnet管理端口保护 | 1.修改默认的8005管理端口为不易猜测的端口(大于1024);2.修改shutdown指令为其他字符串; | <server port="**8527**" shutdown="**dangerous**"> | 1.以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间 |
降权启动(强制)
| 类别 | 配置内容及说明 | 标准配置 | 备注 |
|---|---|---|---|
| 降权启动 | 1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发; | 避免一旦tomcat 服务被入侵,黑客直接获取高级用户权限危害整个server的安全; |
文件列表访问控制(强制)
| 类别 | 配置内容及说明 | 标准配置 | 备注 |
|---|---|---|---|
| 文件列表访问控制 | 1.conf/web.xml文件中default部分listings的配置必须为false; | <init-param><param-name>listings</param-name><param-value>false</param-value></init-param> | false为不列出目录文件,true为允许列出,默认为false; |
起停脚本权限回收(推荐)
| 类别 | 配置内容及说明 | 标准配置或操作 | 备注 |
|---|---|---|---|
| 起停脚本权限回收 | 去除其他用户对tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限; | chmod -r 744 tomcat/bin/* | 防止其他用户有起停线上tomcat的权限; |
访问日志格式规范(推荐)
conf/server.xml
| 类别 | 配置内容及说明 | 标准配置或操作 | 备注 |
|---|---|---|---|
| 访问日志格式规范 | 开启tomcat默认访问日志中的referer和user-agent记录 | <valve classname="org.apache.catalina.valves.accesslogvalve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t %r %s %b %{referer}i %{user-agent}i %d" resolvehosts="false"/> | 开启referer和user-agent是为了一旦出现安全问题能够更好的根据日志进行问题排查; |
性能优化
上策:优化代码
- 该项需要开发经验足够丰富,对开发人员要求较高
中策:jvm**优化机制** 垃圾回收机制 把不需要的内存回收
- 优化jvm--优化垃圾回收策略
- 优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码
# tomcat分配1g内存模板 java_opts="-djava.awt.headless=true -dfile.encoding=utf-8 -server -xms1024m -xmx1024m -xx:newsize=512m -xx:maxnewsize=512m -xx:permsize=512m -xx:maxpermsize=512m" # 重启服务 su -c '/home/tomcat/tomcat8_1/bin/shutdown.sh' tomcat su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
下策:加足够大的内存
- 该项的资金投入较大
下下策:每天0点定时重启tomcat
- 使用较为广泛
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论