tomcat

Java体系

  • Java编程语言
  • Java类文件:java类文件为java编译后的文件
  • JavaAPI:java类文件库
  • JavaVM(JVM)
    • class loader:编译和类库文件加载器
    • 执行引擎

JRE(Java Runtime Enviroment):

是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。

JDK(Java Development Kit):

又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

运行jsp的web容器

jsp技术将java代码嵌入html文件中,建立了一种动态网页的编写标准,它的技术基础是serverlet技术,当用户请求一个jsp文件时,jsp会将代码转换成serverlet(即标准的java代码),java代码再交由低层的jdk执行。常见的容器有websphere,weblogic,tomcat。

 

tomcat简介

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0。

tomcat就是中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中。而tomcat本身的运行也依赖于jdk环境。

tomcat应用场景:lnmt

tomcat部署

tomcat官网: http://tomcat.apache.org/

Tomcat目录结构

目录含义
conf/ tomcat配置文件
.. server.xml 主配置文件
.. web.xml 补充额外功能
.. tomcat-user.xml tomcat管理端配置文件 用户名 密码
logs 日志
.. catalina.out tomcat最全日志 查看error startup时间
.. catalina.data.log catalina.out切割日志
.. localhost_access_log_data.txt tomcat访问日志
webapps tomcat站点目录

 

配置jdk

[root@localhost ~]# tar -xzvf jdk-8u281-linux-x64.tar.gz  -C /usr/local/

[root@localhost ~]# vim /etc/profile
.......................
.....................
export JAVA_HOME=/usr/local/jdk1.8.0_281/
export JRE_HOME=/usr/local/jdk1.8.0_281/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export TOMCAT8080_HOME=/usr/local/tomcat

 解压缩tomcat

[root@loclhost ~]# tar -zxvf apache-tomcat-8.5.65.tar.gz  -C /usr/local/

[root@localhost ~]# ln -s /usr/local/apache-tomcat-8.5.65    /usr/local/tomcat

 放行端口

firewall-cmd  --zone=public --add-port=8080/tcp --permanent
 
firewall-cmd  --reload

写一个hello world的java测试页面 

[root@localhost ~]# mkdir /usr/local/tomcat/webapps/test
[root@localhost ~]# vim /usr/local/tomcat/webapps/test/index.jsp
<html>
<head>
        <title>test page</title>
</head>
<body>
        <%
            out.println("Hello World");
        %>
</body>
</html>

  启动服务

[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh

测试访问

[root@localhost ~] curl 192.168.248.40:8080/test/
hello world

Tomcat管理端

  • 搭建与测试的时候开启管理端 开启管理端
  • 生产环境 关闭管理端

开启管理端

# 8.0这样配置就完成了 
# 8.5之后管理跟严格了
# 要配置tomcat-user.xml之外
# 还限制只能再本地使访问管理
[root@localhost ~]# cd /usr/local/tomcat/
[root@localhost tomcat]# vim conf/tomcat-users.xml
..............
.............
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
.................

 

 解除本地限制

[root@localhost tomcat]# find -type f -name "*.xml" | xargs  grep '127'
./webapps/host-manager/META-INF/context.xml:         allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
./webapps/host-manager/WEB-INF/manager.xml:         allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
./webapps/manager/META-INF/context.xml:         allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />

[root@localhost tomcat]# sed -i.bak 's#127#\d+#g' ./webapps/host-manager/META-INF/context.xml ./webapps/manager/META-INF/context.xml

[root@localhost tomcat]# /usr/local/tomcat/bin/shutdown.sh

[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh

 

tomcat 多实例

在一台服务器上运行多个tomcat

注意事项: 端口与路径不同

root@localhost ~]# tar xf apache-tomcat-8.5.65.tar.gz
[root@localhost ~]# cp -r  apache-tomcat-8.5.65 /usr/local/tomcat8081
[root@localhost ~]# cp -r  apache-tomcat-8.5.65 /usr/local/tomcat8082

[root@localhost ~]# cd /usr/local/
[root@localhost local]# sed -i.bak 's#8080#8081#g' tomcat8081/conf/server.xml 
[root@localhost local]# sed -i.bak 's#8005#8006#g' tomcat8081/conf/server.xml
[root@localhost local]# sed -i.bak 's#8009#8010#g' tomcat8081/conf/server.xml

[root@localhost local]# sed -i.bak 's#8080#8082#g' tomcat8082/conf/server.xml
[root@localhost local]# sed -i.bak 's#8005#8007#g' tomcat8082/conf/server.xml 
[root@localhost local]# sed -i.bak 's#8009#8011#g' tomcat8082/conf/server.xml

#启动服务
[root@localhost local]# tomcat8081/bin/startup.sh
[root@localhost local]# tomcat8082/bin/startup.sh 

#检测是否启动
[root@localhost local]# ss -lntup| grep java
tcp    LISTEN     0      1        [::ffff:127.0.0.1]:8005               [::]:*                   users:(("java",pid=2193,fd=69))
tcp    LISTEN     0      1        [::ffff:127.0.0.1]:8006               [::]:*                   users:(("java",pid=12271,fd=69))
tcp    LISTEN     0      1        [::ffff:127.0.0.1]:8007               [::]:*                   users:(("java",pid=12311,fd=69))
tcp    LISTEN     0      100    [::]:8080               [::]:*                   users:(("java",pid=2193,fd=55))
tcp    LISTEN     0      100    [::]:8081               [::]:*                   users:(("java",pid=12271,fd=55))
tcp    LISTEN     0      100    [::]:8082               [::]:*                   users:(("java",pid=12311,fd=55))

#防火墙放行
[root@localhost local]# firewall-cmd  --zone=public --add-port=8081/tcp --permanent
[root@localhost local]# firewall-cmd  --zone=public --add-port=8082/tcp --permanent
[root@localhost local]# firewall-cmd  --reload

#网页访问

tomcat 3种工作模式

模式header 2  
bio blocking io tomcat 7及之前使用,同步模型、阻塞 一个线程处理一个进程,缺点:并发高式,线程数较多,浪费资源
nio now ip tomcat 8及以后,异步非阻塞 nio1(默认的) nio2可以通过少量的线程处理大量的请求
apr Apache Portable Rutime   tomcat对静态文件的处理性能。 tomcat apr在tomcat上运行高并发应用的首选

bio(blocking I/O),阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包),对于每一个请求都要创建一个线程来进行处理,所以开销较大不适合处理高并发的场景。

nio基于缓冲区、并能提供非阻塞I/O操作的Java API实现,比传统的I/O处理方式(bio)有更高的并发运行性能

apr(Apache Portable Runtime/Apache可移植运行库)是Apache HTTP服务器的支持库。从操作系统级别解决异步I/O问题,大幅度提高服务器的并发处理性能,也是Tomcat生产环境运行的首选方式。要tomcat支持apr,必须安装apr和native,这样tomcat才可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。

 

nio2模式

#配置server.xml文件  
  <Connector port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />

#apr模式需要一些插件
[root@localhost tomcat8081]# yum -y install apr apr-devel tomcat-native

#修改server.xml文件
    <Connector port="8081" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" />


#centos8中 yum源中没有tomcat-native 需要编译安装,默认在下载的tomcat里的bin目录带的有该项目的tar包 

开启tomcat远程监控

#修改 tomcat/bin/catalina.sh

#CATALINA_OPTS java内置变量 修改Java启动参数(tomcat)

CATALINA_OPTS   #java启动参数 

CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.mam=nagement.jmxremote  #开启tomcat远程监控功能
-Dcom.sun.mam=nagement.jmxremote.port=12345  #指定端口 ,还会生产两个随机端口
-Dcom.sun.mam=nagement.jmxremote.authenticate=false   #是否开启认证
-Dcom.sun.mam=nagement.jmxremote.ssl=false  #是否开启https
-Djava.rmi.server.hostname=192.168.248.20" #服务器IP,生产环境使用内网

[root@localhost tomcat]# sed -n "2p" bin/catalina.sh 
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote   -Dcom.sun.management.jmxremote.port=1111   -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40

#重启服务

Tomcat优化

安全优化

server.xml文件

降权启动(强制)

# 在普通用户下运行和维护tomcat,降权启动/监牢模式
[root@localhost tomcat]# useradd tomcat
[root@localhost tomcat]# chown  -R tomcat.tomcat /usr/local/tomcat
[root@localhost local]# su - tomcat
[tomcat@localhost ~]$ /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_281/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:    -Dcom.sun.management.jmxremote   -Dcom.sun.management.jmxremote.port=1111   -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40
Tomcat started.
[tomcat@localhost ~]$ ss -lntup|grep java
tcp    LISTEN     0      50     [::]:1111               [::]:*                   users:(("java",pid=2040,fd=21))
tcp    LISTEN     0      50     [::]:41783              [::]:*                   users:(("java",pid=2040,fd=20))
tcp    LISTEN     0      50     [::]:35996              [::]:*                   users:(("java",pid=2040,fd=22))
tcp    LISTEN     0      100    [::]:8080               [::]:*                   users:(("java",pid=2040,fd=59

#通过普通用户自启
vim /etc/rc.local
su - 用户 -c "/usr/local/tomcat/bin/startup.sh"

 注意事项 1-1024之间是特权端口,只能root使用

文件列表访问控制(强制),默认展示站点目录下所有内容

nginx  网站文件列表功能 autoindex on:
tomcat  关闭
conf/web.xml文件中
..........................
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
............................

版本信息隐藏

#第一种
cd /usr/local/tomcat/lib
unzip catalina.jar
vim  org/apache/catalina/util/ServerInfo.properties
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Nov 7 2018 10:05:27 UTC

jar uvf catalina.jar  org/apache/catalina/util/ServerInfo.properties
cd /usr/local/tomcat/lib/

#第二种,添加报错页面
vim conf/web.xml
    <error-page>
    <error-code>403</error-code>
    <location>/403.jsp</location>
    </error-page>
    <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
    </error-page>
    <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
    </error-page>

Server header重写

conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               server="nginx/1.26.1" #添加此行
               redirectPort="8443" />

日志访问格式

#User-Agent 用户的浏览器 客户端
#Referer  从什么地方跳转过来
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u  %t %s %b %{Referer}i %{User-Agent}i %D" />

tomcat性能优化

  • 调优 参数数值调整方式:
    • 参考值(基准) 不设置数值,通过压力参数软件,看看tomcat性能
    • 增加优化参数,通用压力测试软件
压力测试工具 
ab/webbench http压力测试
stress 压力测试 cpu 内存 swap.....
jmeter 压力测试java(tomcat)
dd/fio 测试磁盘性能
mysqlslap 压力测试数据库(mysql)
loadrunner 专业测试工具

优化参数

maxThreads="500" #最大的线程数量 
acceptCount=""   #当达到最大线程数量的时候 列队长度,一版和maxThreads一致
acceptorThreadCount="2" #分为几对,一般与cpu核心一致默认是1
minSoareTherads="10"  #空闲时候最小进程
enableLookups="false" #禁止DNS逆向处理,route -n/apr -n
compression="true" #开启tomcat压缩功能,一般是静态资源
compressionMinSize="2048" #压缩文件最小是2048个字节
compressableMimeType="text/html,text/plain,/text/css,application/javascript,application/json,application/x-font-tty,application/x-font-otf"  #压缩那些类型的文件
disableUploadTimeout="true" #上传文件的超时时间
redirectPort="8443"


maxTherads: 
    如果操作是纯粹的计算,那么影响系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该 尽量设小,降低同一时间争抢cpu的线程个数。
    如果是操作是纯粹的IO或数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设置大,这样才能提高同时处理多个请求的个数

java启动参数优化

# catalina.sh文件中添加
# 设置 jvm初始内存大小和jvm最大内存大小

# -Xms jvm初始内存
# -Xmx jvm最大内存
# 一般 -Xmx是-Xms的两倍
# gc 定期清理jvm内存
#-Xlog  执行gc的日志
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat.gc.log'
原文地址:https://www.cnblogs.com/diqiyao/p/14752993.html