Tomcat你想了解的东西和部署方法都在这

Tomcat详解和安装教程

文章目录

  • Tomcat详解和安装教程
    • 一、详细了解Tomcat原理
      • 1、Tomcat三大核心组件
        • 1.1 web容器
        • 1.2 jsp容器
        • 1.3 servlet容器
      • 2、Tomcat核心功能
        • 2.1 Coyote连接器架构
        • 2.2 Container结构分析
        • 2.3 Tomcat请求过程
      • 3、Tomcat目录作用
    • 二、Tomcat部署步骤教程
      • 1、安装Tomcat服务
      • 2、配置虚拟主机
      • 3、Tomcat优化
        • 3.1 优化Tomcat启动速度
        • 3.2 优化配置
      • 4、Tomcat多实例部署
      • 5、Nginx+Tomcat负载均衡、动静分离

tomcat是免费的、开放的源代码的web应用服务器

一、详细了解Tomcat原理

1、Tomcat三大核心组件

Tomcat你想了解的东西和部署方法都在这_第1张图片

1.1 web容器

完成web服务器的功能

接受响应请求、展示动态页面、入口、出口

1.2 jsp容器

用于将jsp动态网页翻译成servlet

index.html 到nginx可以直接展示index.php

index.html Java环境 和数据库怎么进行交互

index.jsp --Java类代码—就是执行对接后端的执行代码,需要先翻译可以直接执行的代码方式格式serverlst代码格式

jsp通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态的创建网页

1.3 servlet容器

名字为catalina,用于处理servlet 代码

Servlet是Java servlet简称,可以理解为是一个服务连接器,是用Java编写的服务器端程序,具有独立与平台和

协议的特性,简单理解servlet就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建

因此Tomcat是web应用服务器,也是一个servlet/JSP容器,负责处理客户请求,吧请求传送给servlet,并将servlet的响应传送回给客户

2、Tomcat核心功能

tomcat核心功能有两个,分别是负责接受和反馈外部请求的连接器connector,和负责处理请求的容器container其中连接器和容器相辅相成,一起构成了基本的web服务service,每个tomcat服务器可以管理多个serbvice

connector:负责对外接受和响应请求,它是tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界

container:负责对内处理业务逻辑,其内部由engine、host、context和wrapper四个容器组成,用于管理和调用servlet相关逻辑

service:对外提供的web服务,主要包含connector和container两个核心组件,tomcat可以管理多个service,且各service之间相互独立

2.1 Coyote连接器架构

oyote是tomcat的Connector框架的名字,简单说就是coyote来处理底层的socket,并将http请求、响应等字节流层面的东西,包装成Request和Response两个类(这两个类是tomcat定义的,而非servlet中的ServletRequest和ServletResponse),供容器使用

Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了统一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote 将Socket输入转换封装为Request对象,交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输出流 。

Coyote作为独立的模块,只负责具体协议和IO的相关操作,与Servlet规范实现没有直接关系,因此即便是Request和Response对象也并未实现Servlet规范对应的接口, 而是在Catalina中将他们进一步封装为ServletRequest和ServletResponse
Tomcat你想了解的东西和部署方法都在这_第2张图片

2.2 Container结构分析

每个service会包含一个container容器,在container内部包含了4个子容器

4个容器的作用是

Engine:引擎 用来管理多个虚拟主机,一个service最多只能有一个Engine

Host:代表一个虚拟主机,也可以叫站点,通过配置Host就可以添加站点

Context:代表一个web应用,包含多个servlet封装器

Wrapper:封装器,容器的最底层,每一个wrapper封装着一个servlet,负责对象实例的创建执行和销毁功能

这4个容器属于父子关系

一个引擎可以管理多个虚拟机,每个虚拟主机可以管理多个web应用,每个web应用会有多个servlet封装器

Tomcat你想了解的东西和部署方法都在这_第3张图片

2.3 Tomcat请求过程

①用户在浏览器中输入网址,请求被发送到本机端口8080,被在那里监听的Connector 获得
②Connector 把该请求交给它所在的Service 的 Engine (Container)来处理,并等待 Engine 的回应
③请求在Enaine、Host、Context和Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等
④执行完之后的请求响应在Context、Host、Engine容器之间层层返回,最后返回给Connector,并通过Connector返回给客户端

Catalina

负责解析Tomcat的配置文件 , 以此来创建服务器Server组件,并根据 命令来对其进行管理

Tomcat你想了解的东西和部署方法都在这_第4张图片

3、Tomcat目录作用

Tomcat你想了解的东西和部署方法都在这_第5张图片

bin:存放启动和关闭Tomcat的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
conf:存放Tomcat服务器的各种配置文件,比较常用的是 server.xml、context .xml、tomcat-users .xml、web .xml四个文件
①server.xml:Tomcat的主配置文件,包含service,Connector,Bngine,Realm,Valve ,Hosts上组件的相关配置信息

②context.xml:所有host的默认配置信息

④tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息,Tomcat自带的manager默认情况下会用到此文件,在nomcat中添加/删除用户,为用户指|定角色等将通过编辑此文件实现

⑤we.xml:遵循servlet规范标准的配置文件,用于配置servlet,并为所有的web应用程序提供包括MTME映射等默认配置信息

lib:存放Tomcat运行需要的库文件的jar包,一般不作任何改动,除非连接第三方服务,比
redis,那就需要添加相对应的jar包

logs:存放Tomcat执行时的日志
temp:存放Tomcat运行时产生的文件

webapps:存放 Tomcat默认的 web应用部署目录

work:Tomcat工作日录,存放jsp编译后产生的class文件,一般清除Tomcat缓存的时候会使用到

src:存放Tomcat的源代码
doc:存放Tomcat文档

二、Tomcat部署步骤教程

1、安装Tomcat服务

将数据包放在/opt目录下
rpm -ivh jdk-8u201-linux-x64.rpm     #解压jdk安装包,是Java语言的软件开发工具包
vim /etc/profile.d/java.sh			 #编写jdk系统变量
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
-----------------------------------------------------------------------------------
source /etc/proifle.d/java.sh        #加载jdk环境变量
tar zxvf apache-tomcat-9.0.16.tar.gz #解压tomcat安装包
mv apache-tomcat-9.0.16 /usr/local/tomcat   #移动解压完的到/usr/local/下重命名为tomcat
-----------------------------------------------------------------------------------
启动tomcat并测试
/usr/local/tomcat/bin/startup.sh   #或后台启动/usr/local/tomcat/bin/Catalina.sh run
netstat -natp |grep 8080
http://192.168.174.131:8080/       #默认端口

Tomcat你想了解的东西和部署方法都在这_第6张图片

2、配置虚拟主机

一台tomcat应用可以访问两个站点

创建两个项目目录和文件
mkdir /usr/local/tomacat/webapps/yzf      #设置yzf项目目录
mkdir /usr/local/tomacat/webapps/test     #设置test项目目录
echo "hello !! This is yzf !!" > /usr/local/tomcat/webapps/kgc/index.jsp
echo "hello !! This is test !!" > /usr/local/tomcat/webapps/test/index.jsp
-----------------------------------------------------------------------------------------
修改tomcat主配置文件server.xml
vim /usr/local/tomcat/conf/server.xml
将原来Host注销:
  
  
  

  
  
  
-----------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh    #关闭并启动tomcat
浏览器访问验证
访问www.yzf.com:8080   页面显示hello !! This is yzf !!
访问www.test.com:8080   页面显示hello !! This is test !!

字段解释

Host name :主机名

appBase : Tomcat程序 工作目录,相对路径为webapps,绝对路径为/usr/local/tomcat/webapps

unpackWARs :是否解压war包

autoDeploy :指示Tomcat运行时,如有新的WEB应用是否允许自动部署

xmlValidation :是否验证xml文件执行有效性检验的标志

xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web. xml文件执行有效性检验
(命名空间:在计算机系统中,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名)

docBase :WEB应用的目录

path :设置访问的URL为WEB应用的根目录 //相当于alins别名目录

reloadable :是否在程序有改动时重新载入

HTTP请求过程

①Connector连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求

②因为引擎的默认虚拟主机是wwa.yzf.com,并且虚拟主机的口录是webapps。所以请求找到了tomcat/webapps目录

③访问的路径为根路径,URI为空,即空是 web程序的应用名,也就是context。此时请求找到/usr/local/tomcat/webapps/ kgcl录,解析index.jpp 并返回。

3、Tomcat优化

3.1 优化Tomcat启动速度

vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.srcurity
   securerandom.source=file:/dev/urandom    #修改第117行修改random前面加u
-----------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh     #关闭并启

Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效

3.2 优化配置

生产环境配置

vim /usr/local/tomcat/conf/server.xml      #主配置文件路径
	#压缩类型
-----------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh    #关闭并启动

常用的优化相关参数如下

redirectPort :如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口

maxThreads :Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200

minSpareThreads :最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10

maxSpareThreads :最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定

URIEncoding :指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 Web服务器软件配置方便,需要分别指定

connnectionTimeout :网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以

enableLookups :是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false

disableUploadTimeout :上传时是否使用超时机制。应设置为 true

connectionUploadTimeout :上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

acceptCount :指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个

compression :是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽

compressionMinSize :表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048

compressableMimeType :压缩类型,指定对哪些类型的文件进行数据压缩

noCompressionUserAgents=“gozilla, traviata” :对于以下的浏览器,不启用压缩

4、Tomcat多实例部署

#安装好jdk、安装tomcat
tomcatcd /opt
tar zxvf apache-tomcat-9.0.16.tar.gzmkdir /usr/local/tomcat1
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
-----------------------------------------------------------------------------------------
#配置tomcat环境变量
vim /etc/profile.d/tomcat.sh
#tomcatl
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcatl
export TOMCAT_HOME1=/usr/local/tomcat/tomcatl
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
-----------------------------------------------------------------------------------------
source /etc/profile.d/tomcat.sh    	#加载环境变量
#修改tomcat2中的server.xml文件,要求各tomcat实例配置不能有重复的端口号
vim /usr/local/tomcat/tomcat2/conf/server.xml
  	#122行,修改Server prot,默认为8005->修改为8006
修改为8081
	 #116行,修改Connector portAJP/1.3,默认为8009 ->修改为8010
-----------------------------------------------------------------------------------------
#修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/tomcat1/bin/startup.sh和shutdown.sh
--两个脚本第21行插入以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat2/bin/startup.sh和shutdown.sh
--两个脚本第21行插入以下内容
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
-----------------------------------------------------------------------------------------
#启动两个tomcat
/usr/local/tomcat/tomcat1/bin/startup.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
netstat -natp | grep java
#浏览器访问测试
192.168.174.131:8080
192.168.174.131:8081

名词解释

Connector port:第一个连接器默认监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的web应用时,使用的就是这个连接器,第二个连接器默认监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器

5、Nginx+Tomcat负载均衡、动静分离

Nginx 服务器:192.168.80.10:80
Tomcat服务器1:192.168.80.100:80
Tomcat服务器2:192.168.174.131:8080 192.168.174.131:8081

安装部署nginx负载均衡器

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/

cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \									#启用文件修改支持
--with-http_stub_status_module \					#启用状态统计
--with-http_gzip_static_module \					#启用 gzip静态压缩
--with-http_flv_module \							#启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用 SSL模块,提供SSL加密功能
--with-stream										#启用 stream模块,提供4层调度
-----------------------------------------------------------------------------------------
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream

make -j4 && make install  							#安装并编译
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/  #优化启动路径
vim /lib/systemd/system/nginx.service				#添加 Nginx 系统服务
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
-----------------------------------------------------------------------------------------
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

部署2台Tomcat 应用服务器

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/     #解压安装包
vim /etc/profile
export JAVA_HOME=/usr/local1/jdk1.8.0_91        	  #路径为版本名不同可以修改
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
-----------------------------------------------------------------------------------------
source /etc/profile
tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh
netstat -ntap | grep 8080

动静分离配置

#Tomcat1 server 配置
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


JSP test1 page   #指定为 test1 页面


<% out.println("动态页面 1,http://www.test1.com");%>


-----------------------------------------------------------------------------------------
vim /usr/local/tomcat/conf/server.xml
#由于主机名name配置都为localhost,需要删除或注释前面的HOST配置,添加下面内容

	
	

-----------------------------------------------------------------------------------------
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

#Tomcat2 server 配置
mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


JSP test2 page   #指定为 test2 页面


<% out.println("动态页面 2,http://www.test2.com");%>


-----------------------------------------------------------------------------------------
vim /usr/local/tomcat/tomcat1/conf/server.xml
#删除或注释前面的HOST配置,添加下面内容

	

-----------------------------------------------------------------------------------------
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

#toacmat shell 脚本  case 
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


JSP test3 page   #指定为 test3 页面


<% out.println("动态页面 3,http://www.test3.com");%>


-----------------------------------------------------------------------------------------
vim /usr/local/tomcat/tomcat2/conf/server.xml
#删除或注释前面的HOST配置,添加下面内容

	

-----------------------------------------------------------------------------------------
/usr/local/tomcat/tomcat2/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh 
Nginx server 配置
#准备静态页面和静态图片
echo '

这是静态页面

' > /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cp /root/game.jpg /usr/local/nginx/html/img vim /usr/local/nginx/conf/nginx.conf ...... http { ...... #gzip on; #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大 upstream tomcat_server { server 192.168.80.100:8080 weight=1; server 192.168.80.101:8080 weight=1; server 192.168.80.101:8081 weight=1; } server { listen 80; server_name www.yzf.com; charset utf-8; #access_log logs/host.access.log main; #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理 location ~ .*\.jsp$ { proxy_pass http://tomcat_server; #设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。 proxy_set_header HOST $host; #设置后端的Web服务器可以获取远程客户端的真实IP #把$remote_addr赋值给X-Real-IP,来获取源IP proxy_set_header X-Real-IP $remote_addr; #在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #配置Nginx处理静态图片请求 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ { root /usr/local/nginx/html/img; expires 10d; } location / { root html; index index.html index.htm; } ...... } ...... } ----------------------------------------------------------------------------------------- 4.测试效果 测试静态页面效果 浏览器访问 http://192.168.80.10/ 浏览器访问 http://192.168.80.10/game.jpg 测试负载均衡效果,不断刷新浏览器测试 浏览器访问 http://192.168.80.10/index.jsp

Nginx 负载均衡模式

  • rr 负载均衡模式

每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配

  • 权重

  • least_conn 最少连接

优先将客户端请求调度到当前连接最少的服务器。

  • ip_hash 负载均衡模式

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash。

  • fair(第三方)负载均衡模式

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  • url_hash(第三方)负载均衡模式

基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。

扩展

Nginx四层代理
./configure --with-steam    #添加编译组件
#需在HTTP上添加
stream {
  upstream appserver {
    server 192.168.80.100:8080 weight=1;     
    server 192.168.80.101:8080 weight=1;
    server 192.168.80.101:8081 weight=1;
}
  server {
  listen 8080;
  proxy_pass appserver;

http {     

你可能感兴趣的:(tomcat,servlet,java)