12_企业架构之Tomcat部署使用

Tomcat

学习目标和内容

1、能够描述Tomcat的使用场景

2、能够简单描述Tomcat的工作原理

3、能够实现部署安装Tomcat

4、能够实现配置Tomcat的service服务和自启动

5、能够实现Tomcat的Host的配置

6、能够实现Nginx反向代理Tomcat

7、能够实现Nginx负载均衡到Tomcat

一、Tomcat介绍

1、简介

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat支持最新的Servlet和JSP规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

同类软件:

jboss jetty

weblogic ORACLE 商业用付费 EJB企业支持 重载配置

websphere IBM 商业授权

Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。

2、工作原理图示

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

1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。

2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。

3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。

4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。

5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。

6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。

7、Context把执行完之后的HttpServletResponse对象返回给Host。

8、Host把HttpServletResponse对象返回给Engine。

9、Engine把HttpServletResponse对象返回Connector。

10、Connector把HttpServletResponse对象返回给客户Browser。

二、安装和配置

1、安装方式介绍

①yum方式安装 加载epel源,版本目前为tomcat7.0

②二进制方式安装 直接下载,部署好java环境,即可运行(推荐)

③源码方式安装 需要下载Apache Ant进行编译安装

2、二进制安装

①上传获取软件

②部署java环境

shell > tar zxvf jdk-8u192-linux-x64.tar.gz
shell > mkdir /usr/local/java
shell > mv jdk1.8.0_192 /usr/local/java
#tomcat配置环境变量的两种方式  三种使用其中一种即可
#第一种tomat依赖JAVA_HOME环境变量
shell > echo "export JAVA_HOME=/usr/local/java/" >> /etc/profile
#第二种tomcat依赖java环境变量
shell > echo "PATH=/usr/local/java/bin:$PATH" >> /etc/profile
#第三中tomcat依赖JRE_HOME变量
shell > echo "export JRE_HOME=/usr/local/java/jre" >> /etc/profile
shell > . /etc/profile

如果配置JAVA_HOME路径配置到jdk下就可以,不需要配置到bin下。

如果配置java的环境环境变量PATH,就指定到bin下。

如果启动tomcat,遇到如下问题

①没有安装jre jdk

②环境变量没有配置

③启动的软件找不到需要的java相关软件

③部署tomcat

shell > tar xvf apache-tomcat-9.0.11.tar.gz
shelll > mv apache-tomcat-9.0.11 /usr/local/tomcat

软件部署之后的目录结构

3、目录介绍

bin 存放启动和关闭Tomcat的脚本文件

conf 存放Tomcat服务器的各种全局配置⽂文件,其中最重要的是server.xml和web.xml

lib 存放Tomcat服务器所需的各种JAR文件

logs 存放Tomcat执行时的日志文件

temp 此目录是tomcat存放的临时文件

webapps tomcat默认存放应用程序的目录,好比apache的默认网页存放路径是/var/www/html一样

work 用于存放JSP应用程序在部署时编译后产生的class文件

项目代码目录

docs tomcat文档

examples tomcat自带的一个独立的web应用程序例子

host-manager tomcat的主机管理应用程序

manager tomcat的管理应用程序

ROOT 指tomcat的应用程序的根,如果应用程序部署在ROOT中,则

可直接通过http://ip:port 访问到

配置文件目录

catalina.policy 配置tomcat对文件系统中目录或文件的读、写执行等权限,及对一些内存,session等的管理权限

catalina.properties 配置tomcat的classpath等

context.xml tomcat的默认context容器

logging.properties 配置tomcat的日志输出方式

server.xml tomcat的主配置文件 host配置

tomcat-users.xml tomcat的角色(授权用户)配置文件

web.xml tomcat的应用程序的部署描述符文件

4、启动相关说明

tomcat的相关管理命令在$prefix/bin目录下

经常使用的命令:

catalina.sh 主命令脚本

configtest.sh 检测配置文件

shutdown.sh 关闭

startup.sh 启动

version.sh 查看版本

①测试启动tomcat

shell > /usr/local/tomcat/bin/startup.sh
shell > ps aux |grep tomcat
shell > netstat -lntp |grep 8080

②查看页面效果

③测试关闭tomcat

5、配置服务

tomcat提供了方便的启动命令脚本,但是却没有提供服务器中经常管理使用的service脚本。可以自行编写服务管理脚本

①编辑启动脚本,生成tomcat.pid

②脚本实现

6、配置开机自启动服务

根据编写的service脚本,通过chkconfig管理即可

自行编写的service脚本,使用chkconfig管理启动,需要加入chkconfig参数

三、企业中常见使用方式

1、简单代码测试

①默认访问目录

②编写测试文件

③查看测试效果

2、基于域名访问的Host配置

tomcat单实例运行多个tomcat应用的案列

①建立项目目录并写入测试文件

②编辑配置文件

shell > /usr/local/tomcat/conf/server.xml

name可以填写域名

③检测配置并重启

shell > service tomcat configtest
shell > service tomcat restart

④访问主机解析域名

⑤测试访问

Tip:

tomcat支持serverlet和jsp规范

项目源码:

①jsp jsp=>java代码=>class字节码=>加载jvm运行=>解析字符串=>container容器=>connector连接=>浏览器

②java代码

3、服务器状态查看

默认访问报错

①去掉访问IP限制

②创建用户和密码开启访问权限

③查看页面

4、应用管理查看

①测试关闭

②访问测试

start之后即可重新访问正常显示

5、虚拟机Host管理查看

遇到上面类似的错误

修改host-manager目录下的context.xml

6、Nginx前端反向代理

实际业务环境中,用户是直接通过域名访问。基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端tomcat的方式,来实现用户可以直接通过域名访问到tomcat的webapp

动静分离:动态页面的请求交由后端处理(tomcat+java),静态资源直接返回

实现配置

配置文件参考:

 server{listen       80;server_name  tomcat.devops.com;#和tomcat的host配置一致root /usr/local/tomcat/webapps/devops/ROOT;#静态不需要进行转发location ~ \.(html|css|js|png|jpg|jpeg)$ {#default_type text/plain;#echo 'html';#alias /;#root /usr/local/tomcat/webapps/devops/ROOT;}#其他识别不是静态资源的,统统发送到后端tomcatlocation / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host      $host;proxy_set_header X-Real-IP $remote_addr;#default_type text/plain;#echo $host;#echo $remote_addr;#echo $proxy_add_x_forwarded_for;}}

nginx单独访问静态页面,出现403的问题:

分析:没有读权限

解决方案:

当nginx和tomcat网站根目录一致的情况,注意nginx是否有权限读到tomcat网站目录的权限。

一般性解决方案网站目录文件夹,赋予一个公共用户www

shell > cd /usr/local/tomcat
shell > chown -R www:www webapps

访问查看:

7、Nginx负载均衡

随着业务的发展,单实例服务已经不能够满足业务使用需要

pv 页面访问数量

qps 每秒查询次数 并发量

DAU 每日活跃用户数

单实例无法满足,扩容为多实例

常见的业务运行方式

单实例单应用 一个tomcat一个webapps

单实例多应用 一个tomcat多个webapps host

多实例单应用 多个tomcat同一个webapps

多实例实现方式:

①多台服务器一个运行一个实例(性能好)

②单台服务器运行多个实例(监听不同的端口,性价比高)伪集群

多实例多应用

业务流程图示

server04 nginx负载均衡

server01 tomcat1

server03 tomcat2

实施步骤:

①复制虚拟机,多实例

两台tomcat里项目里的内容要一致

在server03上配置和server01一样的实现:

1>建立项目文件夹目录,绑定host主机域名

2>nginx做反向代理

②配置nginx负载均衡

在server04上进行配置

upstream tomcat {#ip_hash;server 192.168.17.102:80;server 192.168.17.101:80;}server {listen 80;server_name tomcat.devops.com;location / {proxy_pass http://tomcat;proxy_set_header Host      $host;proxy_set_header X-Real-IP $remote_addr;}}

四、项目部署

1、项目介绍

ZrLog是使用 Java 开发的博客/CMS程序,具有简约,易用,组件化,内存占用低等特点。自带 Markdown 编辑器,让更多的精力放在写作上。

GitHub - 94fzb/zrlog: ZrLog是使用 Java 开发的博客/CMS程序,具有简约,易用,组件化,内存占用低等特点。自带 Markdown 编辑器,让更多的精力放在写作上,而不是花费大量时间在学习程序的使用上。

2、项目部署

①解析域名

注意域名解析需要先解析到单例服务器,不要给负载均衡

②建立项目目录,上传项目程序

③绑定域名

④开源项目的初始化过程

需要建立一个数据库

此项目的数据库密码配置文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux的定时任务Corntab

安装crontab # yum安装crontab yum install -y crontab# 开机自启crond服务并现在启动 systemctl enable --now crondcron系统任务调度 系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。 在/etc/crontab文件,这…

机器学习之全面了解回归学习器

我们将和大家一起探讨机器学习与数据科学的主题。 本文主要讨论大家针对回归学习器提出的问题。我将概要介绍,然后探讨以下五个问题: 1. 能否将回归学习器用于时序数据? 2. 该如何缩短训练时间? 3. 该如何解释不同模型的结果和…

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况: 压根没安装下载了但没设为库或方法不对 大多数为第一种情况: 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

JNPF低代码平台详解 -- 系统架构

目录 一、技术介绍 技术架构 二、设计原理 三、界面展示 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 8.分布式调度 9.消息中心 四、功能框架 JNPF低代码是一款新奇、实用、高效的企业级软件开发工具,支持企…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以…

Rust的eBFP框架Aya(一) - Linux内核网络基础

前言 在我的Rust入门及实战系列文章中已经说明, Rust是一门内存安全的高性能编程语言,从它的这些优秀特性来看,就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为,不能说它们不好,只能说是杀鸡…

2017下半年软工(桥接模式)

题目——桥接模式(抽象调用实现部分) package org.example.桥接模式;/*** 桥接模式的核心思想是将抽象部分与它的实现部分分离,使它们可以独立变化,就是说你在实现部分:WinImp、LinuxImp基础上还能加上RedHatImp&#…

uniapp 输入框输入时,会将内容顶上去的解决方案

// 设置页面最小高度 export const setPageMinHeight () > {return {position: relative,min-height: uni.getSystemInfoSync().windowHeight px} }页面使用: import {setPageMinHeight} from "/utils/uniUtil";data() {return {minHeight: setPag…

Unity 状态系统

状态系统 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

官方officevisio在线安装包

在线安装包,在线就是要有网络环境,你能搜到这篇博客,就初步具备网络环境 visio在线安装包.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 在线安装包如下,双击执行安装即可,可供选择的64/32位 软件的激活与…

【扩散模型】ControlNet从原理到实战

ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 Cont…

Linux系统上RabbitMQ安装教程

一、安装前环境准备 Linux:CentOS 7.9 RabbitMQ Erlang 1、系统内须有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下载安装包 1)首先&a…

[linux] kaggle 数据集用linux下载

你可以通过以下步骤获取Kaggle的下载链接并在Linux中进行下载: 首先,确保你已经安装了Python和Kaggle API。如果没有安装,你可以通过以下命令安装: pip install kaggle 接着,你需要在Kaggle网站上获取API Token。登录…

【PyTorch】 暂退法(dropout)

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 主要代码2.2.2. 完整代码2.2.3. 输出结果 1. 理论介绍 线性模型泛化的可靠性是有代价的,因为线性模型没有考虑到特征之间的交互作用,由此模型灵活性受限。泛化性和灵活性之间的基本权…

Docker构建自定义镜像

创建一个docker-demo的文件夹,放入需要构建的文件 主要是配置Dockerfile文件 第一种配置方法 # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

Java基础50题: 21.实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值.

概述 实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值. 代码 public static void printArray(int[] array) {for (int i 0; i < array.length; i) {System.out.println(array[i] " ");}System.out.println();}public static…

【日常总结】mybatis-plus WHERE BINARY 中文查不出来

目录 一、场景 二、问题 三、原因 四、解决方案 五、拓展&#xff08;全表全字段修改字符集一键更改&#xff09; 准备工作&#xff1a;做好整个库备份 1. 全表一键修改 Stage 1&#xff1a;运行如下查询 Stage 2&#xff1a;复制sql语句 Stage 3&#xff1a;执行即可…

100. 相同的树(Java)

目录 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;深度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 方法二&#xff1a;广度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给你两棵二叉树的根节点 p 和…

L1-028:判断素数

题目描述 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于231的需要判断的正整数。 输出格式&#xff1a; 对每个需要判断的…