【网络架构】Tomcat部署与优化

目录

一、Tomcat介绍

1.1 什么是tomcat

二、Tomcat安装

三、Tomcat配置与核心组件

3.1 配置文件

3.2 组件分层

 3.3 核心组件

3.4 处理请求过程

3.5 Tomcat端口

四、Tomcat页面

4.1 状态页

4.1.1 开启允许远程状态页

 4.1.2 host manger

4.2 虚拟主机配置

4.3 Context配置

五、Tomcat优化


一、Tomcat介绍

1.1 什么是tomcat

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat具有处理HTML页面的功能,它还是一个Servlet和JSP容器

二、Tomcat安装

注意:安装tomcat 前必须先部署JDK

官方和镜像站点下载:

https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/

安装步骤:

rpm -ivh jdk-8u201-linux-x64.rpm
#安装JDK包
cd /usr/java/jdk1.8.0_201-amd64/
vim /etc/profile
#添加环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
:wq

source /etc/profile

tar zxvf apache-tomcat-9.0.16.tar.gz
#前往tomcat安装包目录解压
cp -r apache-tomcat-9.0.16 /usr/local/tomcat
cd /usr/local/tomcat/

useradd -s /sbin/nologin tomcat
chown tomcat:tomcat tomcat/ -R
#修改属主和属组

cat > /usr/lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

EOF

systemctl daemon-reload
systemctl start tomcat
ss -ntap |grep 8080

三、Tomcat配置与核心组件

3.1 配置文件

安装目录下 文件介绍

目录名字功能
bin存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件
conf存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
lib存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包
logs存放 Tomcat 日志 catalina.out
temp存放 Tomcat 运行时产生的文件
webapps存放项目资源的目录
workTomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存

conf子目录

文件名说明
server.xml主配置文件 全局生效
web.xml每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件
context.xml用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件
tomcat-users.xml用户认证的账号和密码文件
catalina.policy当使用security选项启动omcat时,用于为tomcat设置安全策略
catalina.propertiesTomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.propertiesTomcat日志系统相关的配置,可以修改日志级别和日志路径等

 注意配置文件对于大小写敏感

3.2 组件分层

顶级组件

Server,代表整个Tomcat容器,一台主机可以启动多tomcat 实例 ,需要确保端口不要产生冲突

服务类组件

Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine

连接器组件

Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。

容器类

EngineHost(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。

内嵌类

可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。

集群类组件

listener、cluster

 过程:

首先开启 tomcat进程, 会有 server 产生 ,

然后产生 一个 service管理组件 管理 所有其他组件的

用户发送请求httpd 请求过来

connector 连接器(默认监听)接收到此请求, 会转交给 engine (引擎)

engine (引擎) 会处理请求, 遍历 host (虚拟主机) 会交给 客户访问的host, 如果找不到交给默认的 host 会根据 上下文 context (上下文) 映射关系 去找相对应的文件

找到文件后, 交给 JSP 生成代码, 再交给 servlet 生成 html

原路返回反馈给用户

名称说明
server服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个
service服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine
connector连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine
Engine即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector
Host即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
Context应用的上下文,配置特定url路径映射和目录的映射关系: url => directory

 3.3 核心组件

  • Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个

  • 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个

    • 每个Service中,是Engine和其连接器Connector的关联配置

  • 可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应

  • Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host

    • Engine对请求头做了分析,将请求发送给相应的虚拟主机

    • 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机

    • Engine上的缺省虚拟主机可以修改

  • Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配

  • Context 定义应用程序单独的路径映射和配置

 范例:多个组件关系conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
   <Service name="Catalina">
     <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" />
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
          <Engine name="Catalina" defaultHost="localhost">
             <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">
                <Context >
                <Context />
             </Host>
          </Engine>
   </Service>
</Server>

3.4 处理请求过程

  • 假设来自客户的请求为: http://localhost:8080/test/index.jsp 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。

  • Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应

  • Engine获得请求192.168.91.100:8080/test/index.jsp,遍历它所有虚拟主机Host

  • Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context

  • Host匹配到路径为/test的Context

  • path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet

  • Context匹配到URLPATTERN为*.jsp的Sservlet,对应于]spServlet类构造HtpServletRequest对象和HttpServletResponse对象,作为参数调用)spSer let的doGet或doPost方法。

  • Context把执行完了之后的HttpServletResponse对象返回给Host

  • Host把HttpServletResponse对象返回给Engine

  • Engine把HttpServletResponse对象返回给Connector

  • Connector把HttpServletResponse对象返回给浏览器端

3.5 Tomcat端口

8080: 默认接收 http 请求的端口

8005: 安全端口,可以关闭tomcat

8009: apache 和 tomcat 联动 AJP 协议

四、Tomcat页面

4.1 状态页

默认的管理页面被禁用,启用方法如下

修改conf/conf/tomcat-users.xml

cd /usr/local/tomcat
ls conf/
cat conf/server.xml 


用户认证,配置文件是conf/tomcat-users.xml。
打开tomcat-users.xml,我们需要一个角色manager-gui
vim conf/tomcat-users.xml 

<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"/>
 <user username="admin" password="123456" roles="manager-gui"/>
</tomcat-users>
#修改全局配置文件需要重启服务生效


修改webapps/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="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreve
ntionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>


查看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则表达式为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"

4.1.1 开启允许远程状态页

 由于是访问的http://192.168.254.100:8080/manager/status manager 这个页面,所以需要manager 文件夹有权限

vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
#添加允许的  主机地址
< allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.\d+\.\d+\.\d+" />

 4.1.2 host manger

配置虚拟主机的设置

vim /usr/local/tomcat/conf/tomcat-users.xml
#最后一行加入,可以合并用户和组

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users>


此时还只是可以本地登录不能远程登录
vim  /usr/local/tomcat/webapps/host-manager/META-INF/context.xml

< allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.\d+\.\d+\.\d+" />

4.2 虚拟主机配置

有时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。例如现在新增两个域名 www.kgc.comwww.accp.com希望通过这两个域名访问到不同的项目内容。

 配置范例:

mkdir /data/web{1,2,3}/ROOT/   -pv
echo  web1 > /data/web1/ROOT/index.html
echo  web2 > /data/web2/ROOT/index.html
echo  web3> /data/web3/ROOT/index.html
chown -R tomcat.tomcat /data/


vim /usr/local/tomcat/conf/server.xml
#找到  host  主机项,注意根目录中一定要有  ROOT  这是默认的主目录
#注意默认的结束    </HOST>  这段要在默认结束的后面加上


<Host name="www.a.com"  appBase="/data/web1"
            unpackWARs="true" autoDeploy="true">
            </Host>

      <Host name="www.b.com"  appBase="/data/web2"
            unpackWARs="true" autoDeploy="true">
            </Host>

      <Host name="www.c.com"  appBase="/data/web3"
            unpackWARs="true" autoDeploy="true">
</Host>


vim /etc/hosts    #添加映射关系
192.168.254.40    www.a.com www.b.com www.c.com

4.3 Context配置

Context作用:

  • 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能

  • 应用独立配置,例如单独配置应用日志、单独配置应用访问控制

说明:

  • path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先更高

  • docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)

  • reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用。

 例子:

mkdir test
echo test > test/index.html
vim /usr/local/tomcat/conf/server.xml

<Host name="www.a.com"  appBase="/data/web1"
            unpackWARs="true" autoDeploy="true">
        <Context path="/test" docBase="/data/test" reloadable="false" />
        #如果  访问  www.a.com/test/   那么 就替换成"/data/test
</Host>

curl www.a.com:8080/test/
test

五、Tomcat优化

怎么查看线程数?

ss -natp | grep java 看pid

ps -T -p pid


配置文件优化
maxThreads (最大线程数/并发)

processorCache (进程缓冲)

acceptCount (等待队列数)

enableLookups (关闭DNS反向解析)

URIEncoding (网页字符集编码UTF-8)

maxKeepAliveRequests (长连接最大请求数)

connectionTimeout (连接超时时间)

compression (开启页面压缩)


系统内核优化

/etc/security/limits.conf 
nofile 
nproc  
memlock
/etc/sysct1.conf   
net .ipv4.tcp_tw_reuse=1   
net.ipv4.tcp_tw_recycle=1  
net.ipv4.tcp_fin_timeout=30  
net.ipv4.tcp_max_tw_buckets=5000              net.ipv4.ip_local_port_range=1024 65535

JVM优化

在 catalina.sh 中设置 JAVA_OPTS 参数。

JAVA OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2046m -Xx:PermSize-1024m -XX:MaxPermSize=1024m -Xmn768m"
-server 表示启用JDK的server模式,实现在多核服务器性能更佳 
 
-Xms2048m 
-Xmx2048m 设置JVM堆内存初始值和最大值一样大,一般设置为物理内存的 1/2

-XX:Permsize=1024m 
-XX:MaxPermsize=1024m
设置永久代《非堆内存) 初始值和最大最一样大,一般设置为物理内存的 1/4

初始值和最大最设置一样大的原因?
可以减少GC次数和内存伸缩带来的频繁内存中请,从而减少一定的系统开销。
        
-Xmn 设置JVM堆内存新生代的大小,一般设置为堆内存的 3/8

-xx:ParallelGCThreads=-2 设置并行GC(垃圾回收) 线程数,提高垃圾回收效率 
-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof  设置进程发生OOM异常退出会进行DUMP备份
-XX:+DisableExplicitGc 禁止调用System.gc()方法,防止误调用系统gc方法导致系统的JVM堆内存大起大落而使系统响应效率严重降低

参数说明举例
-Xms设置应用程序初始使用的堆内存大小(年轻代+老年代)-Xms2g
-Xmx设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降-Xms4g
-XX:NewSize设置初始新生代大小-XX:NewSize=128m
-XX:MaxNewSize设置最大新生代内存空间-XX:MaxNewSize=256m
-Xmnsize同时设置-XX:NewSize 和 -XX:MaxNewSize,代-Xmn1g
-XX:NewRatio以比例方式设置新生代和老年代-XX:NewRatio=2new/old=1/2
-XX:SurvivorRatio以比例方式设置eden和survivor(S0或S1)-XX:SurvivorRatio=6eden/survivor=6/1new/survivor=8/1
-Xss设置每个线程私有的栈空间大小,依据具体线程-Xss256k

 端口8005/tcp安全配置管理

在conf/server.xml 有以下内容

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      </Host>
    </Engine>
  </Service>
</Server>

8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。

此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成 0,会使用随机端口如:36913

port设为-1等无效端口,将关闭此功能此行不能被注释,否则无法启动tomcat服务


范例

<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">
  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值