企业级web应用服务器之Tomcat

news2024/11/14 6:31:55

Tomcat介绍

Tomcat 由 Apache 软件基金会下属的 Jakarta 项目开发。它实现了 Java Servlet 和 JavaServer Pages(JSP)等 Java EE 技术规范,为基于 Java 的 Web 应用程序提供运行环境。

主要特点

  1. 轻量级

    • Tomcat 是一个相对轻量级的服务器,易于部署和使用。它占用系统资源较少,适合在各种规模的环境中运行,从开发环境到生产服务器都能胜任。
    • 启动速度快,能够快速响应开发和测试中的需求变化。
  2. 开源免费

    • 作为开源软件,Tomcat 允许开发者查看和修改源代码,这使得开发者可以根据自己的特定需求进行定制和扩展。
    • 免费的特性降低了开发和部署成本,受到众多企业和开发者的青睐。
  3. 兼容性强

    • 严格遵循 Java EE 规范,能够与各种符合规范的 Java Web 应用程序无缝集成。
    • 可以与其他开源软件和商业软件配合使用,如数据库服务器、应用服务器集群等,构建强大的企业级应用解决方案。
  4. 稳定性高

    • 经过多年的发展和广泛的使用,Tomcat 具有很高的稳定性。它在处理大量并发请求时表现出色,能够保证 Web 应用的持续稳定运行。
    • 提供了丰富的配置选项和管理工具,方便管理员对服务器进行监控和调优,进一步提高了稳定性。

工作原理

  1. 接受请求
    • Tomcat 监听特定的端口(通常是 8080),等待来自客户端(如浏览器)的 HTTP 请求。
  2. 解析请求
    • 当接收到请求后,Tomcat 解析请求的内容,包括请求的 URL、HTTP 方法(GET、POST 等)、请求头和请求体等信息。
  3. 调用 Servlet
    • 根据请求的 URL 和配置的 Servlet 映射关系,Tomcat 确定要调用的 Servlet。如果请求是静态资源(如 HTML、CSS、图片等),Tomcat 直接从文件系统中读取并返回给客户端。
    • 对于动态内容,Tomcat 会创建 Servlet 实例,并调用相应的方法来处理请求。Servlet 可以访问请求中的参数、会话信息等,并生成动态的响应内容。
  4. 生成响应
    • Servlet 处理完请求后,将生成的响应内容返回给 Tomcat。Tomcat 会将响应内容封装成 HTTP 响应格式,并发送回客户端。

Tomcat的部署

两台Tomcat主机,Tomcat-node2主机上的操作与Tomcat-node1上相同。

# 安装Java环境
[root@tomcat-node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y

# 安装并启动Tomcat
[root@tomcat-node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat-node1 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat
[root@tomcat-node1 ~]# /usr/local/tomcat/bin/startup.sh

# 查看端口
[root@tomcat-node1 ~]# netstat -antlupe | grep java       
tcp6       0      0 :::8080                 :::*                    LISTEN      1001       84108      35429/java     

访问Tomcat
在这里插入图片描述

# 生成Tomcat的主配置文件
[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk

# 生成启动文件
[root@tomcat-node1 ~]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

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

[Install]
WantedBy=multi-user.target
结合反向代理实现Tomcat部署

在这里插入图片描述

  • standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐。

  • 反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat

    • LNMT:Linux + Nginx + MySQL + Tomcat
    • LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
  • 前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更适合

    • LNMT:Linux + Nginx + MySQL + Tomcat
  • 多级代理

    • LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
利用nginx反向代理实现

在这里插入图片描述

利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机

利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的host首部

[root@nginx-node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
    listen 80;
    server_name www.qwert.org;
    root /data/web/html;
    index index.html;
    
    location ~ \.jsp$ {
        proxy_pass http://tomcat;
    }
}
# 重启服务进行测试
# 浏览器中访问www.qwert.org/test.jsp
实现Tomcat中的负载均衡

动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载均衡。

当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由来,都是由于HTTP协议在设计之初没有想到未来的发展。

[root@nginx-node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
upstream tomcat {
      #ip_hash;
      hash $cookie_JSESSIONID;
      server 172.25.254.10:8080;
      server 172.25.254.20:8080;
}
server {
    listen 80;
    server_name www.qwert.org;
    root /data/web/html;
    index index.html;


    location ~ \.php$ {
        root /data/web/php;
        set $key $uri$args;
        srcache_fetch GET /memc $key;
        srcache_store PUT /memc $key;
        fastcgi_pass 172.25.254.100:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location ~ \.jsp$ {
        proxy_pass http://tomcat;
    }
}

# 重启服务进行测试
# 浏览器中访问www.qwert.org/test.jsp

Memcached

Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统memcached。虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。

Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的session实现session共享

Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page

Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等

Memcached 官网:http://memcached.org/

memcached的安装与启动
[root@tomcat-node1 ~]# yum install memcached -y
[root@tomcat-node1 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcat-node1 ~]# systemctl enable --now memcached
[root@tomcat-node1 ~]# netstat -antlupe | grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
980 97815 34711/memcached

# Tomcat-node2上操作相同

session会话保持

在这里插入图片描述

msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。

项目早期托管在google code,目前在Github

github网站链接: https://github.com/magro/memcached-session-manager

支持Tomcat的 6.x、7.x、8.x、9.x

  • Tomcat的Session管理类,Tomcat版本不同

    • memcached-session-manager-2.3.2.jar
    • memcached-session-manager-tc9-2.3.2.jar
  • Session数据的序列化、反序列化类

    • 官方推荐kyro
    • 在webapp中WEB-INF/lib/下
  • 驱动类

    • memcached(spymemcached.jar)
    • Redis(jedis.jar)
安装

参考链接: https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。

kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar

下载相关jar包,参考下面官方说明的下载链接

https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

# 修改Tomcat配置
[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/context.xml
====================省略=========================
<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
      failoverNodes="n1"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

[root@tomcat-node2 ~]# vim /usr/local/tomcat/conf/context.xml
=====================省略======================
<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
      failoverNodes="n2"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>


# nginx配置
[root@nginx-node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
upstream tomcat {
      #ip_hash;
      hash $cookie_JSESSIONID;
      server 172.25.254.10:8080;
      server 172.25.254.20:8080;
}
server {
    listen 80;
    server_name www.qwert.org;
    root /data/web/html;
    index index.html;


    location ~ \.php$ {
        root /data/web/php;
        set $key $uri$args;
        srcache_fetch GET /memc $key;
        srcache_store PUT /memc $key;
        fastcgi_pass 172.25.254.100:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }

    location ~ \.jsp$ {
        proxy_pass http://tomcat;
    }
}

# 重启nginx
# 重启memcached
# 重启tomcat
# 在两台tomcat都开启的情况下在浏览器访问www.qwert.org/test.jsp进行测试,然后停掉一台主机的tomcat继续提交信息看是否可以读取到之前的会话信息

在这里插入图片描述
在这里插入图片描述

停掉node1进行测试

在这里插入图片描述

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

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

相关文章

浏览器解析流程

思考 不知道大家是否思考过这几个问题&#xff1a; 当我们在浏览器中输入url后&#xff0c;到底发生了什么&#xff1f; h5&#xff0c;css&#xff0c;js代码执行的顺序是什么&#xff1f;什么情况下会阻塞页面&#xff1f;又有什么办法可以提高页面响应速度呢&#xff1f; 如…

再说圆的面积

在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积&#xff0c;本文使用蒙特卡洛方法求解圆面积。 取&#xff08;0&#xff0c;1&#xff09;* (0,1)区间&#xff0c;也就是单位圆第一象限的端点区间对应的正方形区间。下面是计算机给出的结果&#xff1a;很显然第一象限…

基于vue3和audio封装的简易音频播放器

样式如图所示 <template><div class"audio-player"><div class"player_top" flex-ac flex-justify-between ><div class"fileName genericTitle" fs-28 l-height-32 height-64 pr-42 flex-ac><span class"t…

UE管理内容 —— FBX Morph Target Pipeline

目录 Naming Setting Up Morph Targets Importing Morph Targets Morph Target 是特定网格体的顶点位置的快照&#xff0c;该网格体在某种程度上已经变形&#xff1b;例如&#xff0c;可以使用一个角色模型&#xff0c;对其面部进行重塑以创建一个面部表情&#xff0c;然后将…

Linux 流式DMA映射(DMA Streaming Mapping)

流式DMA相关的接口为dma_map_sg(),dma_unmap_sg(),dma_map_single(),dma_unmap_single()。流式DMA一般用于已经分配好的内存&#xff0c;然后再对其进行DMA操作&#xff0c;而不是提前申请好一块cache一致性的内存给DMA用。例如从协议栈里发下来的一个包&#xff0c;想通过网卡…

day41| 01背包问题一 01背包问题二(滚动数组篇)416. 分割等和子集 1049.最后一块石头的重量II 494. 目标和 474. 一和零

文章目录 背景介绍01背包问题一思路方法一方法二01背包问题二(滚动数组篇)思路方法一方法二416. 分割等和子集思路方法一1049.最后一块石头的重量II思路方法一494. 目标和思路方法方法二 回溯法474. 一和零思路方法总结由于笔试的时候会判重,而这里面的代码都是我自己写的,…

不同场景下的负载均衡器

负载均衡主要用于分配来自互联网或局域网的请求或任务负载到多个服务器中。 这样做可以避免任何单个服务器的过载&#xff0c;提高响应速度&#xff0c;增加系统的整体处理能力&#xff0c;并确保系统的高可用性和可靠性。 负载均衡器大概可以分为 3 类&#xff0c;包括&#…

Argo/BGC-Argo数据下载

BGC-Argo官方网站 网址&#xff1a; https://biogeochemical-argo.org/data-access.php 信息&#xff1a;提供BGC-Argo位置及剖面预览 数据ftp下载&#xff1a;ftp://ftp.ifremer.fr/ifremer/argo 或者 ftp://usgodae.org/pub/outgoing/argo 问题&#xff1a;dac文件按照数据中…

Image Stride(内存图像行跨度)

When a video image is stored in memory, the memory buffer might contain extra padding bytes after each row of pixels. The padding bytes affect how the image is store in memory, but do not affect how the image is displayed. 当视频图像存储在内存时&#xff0…

EVE-NG安装部署使用

EVE-NG安装部署使用 一、EVE的虚拟化安装1、下载EVE-NG(社区版)2、导入虚拟机-配置-登录二、EVE中设备的连接sercureCRT连接wireshark连接一、EVE的虚拟化安装 1、下载EVE-NG(社区版) 官网下载地址(科学上网): https://www.eve-ng.net/index.php/download/ 中文网下载…

基于python django的图书数据分析系统,包括图书推荐和可视化大屏分析,带有后台

研究背景 随着数字化技术的发展&#xff0c;图书管理与数据分析在图书馆和在线图书销售平台中变得越来越重要。传统的图书管理方式通常只关注图书的借阅和归还&#xff0c;忽视了数据分析在图书管理中的潜力。通过对图书借阅、购买、和用户偏好等数据的分析&#xff0c;能够深入…

数论之组合数

组合数1&#xff1a; 预处理每一个组合数的大小 类似于dp&#xff0c;从a个苹果里面选b个出来&#xff1a;首先从a个苹果里面拿出来一个&#xff0c;这样就分成了两种&#xff0c;一种是包括这个拿出来的苹果的方案数&#xff0c;此时就只需要拿b-1个苹果。一种是不包括这种苹…

嵌入式笔记:半加器与全加器

一&#xff0c;门电路 本文使用digital软件中的双掷继电器来实现以下的门电路&#xff0c;并结合这些门电路实现半加器与八位全加器。 与门 当输入信号A&#xff0c;B都置高电平时&#xff0c;继电器带电具有磁性&#xff0c;将下方双刀开关吸附&#xff0c;使电路导通。在输出…

C++20中的约束与概念

类模板、函数模板和非模板函数(通常是类模板的成员)可能与约束(constraint)相关联&#xff0c;该约束指定对模板参数的要求(requirements)&#xff0c;可用于选择最合适的函数重载和模板特化。约束是使用模板时需要通过模板参数满足的条件或要求。这些要求的命名集合称为概念(c…

Ai+若依(系统接口--Swagger):04篇

Swagger&#xff0c;能够自动生成 API 的同步在线文档&#xff0c;并提供Web界面进行接口调用和测试。 可以直接去测试&#xff1a;--有的接口测试需要权限 我们可以去这样操作 F12 报错404 是因为多了个前缀 /dev-api 我们去后台删掉&#xff1a; 重启刷新&#xff1a;

day 39 代码随想录 | 打家劫舍 动态规划

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

Ruby+Watir进行web UI自动化测试

1.新建工程文件 打开RubyMine&#xff0c;新建一个工程文件目录如下&#xff1a; login_mail.rb文件 # encoding:UTF-8 # frozen_string_literal: true当(/^打开谷歌浏览器&#xff0c;进入163邮箱登陆页面$/) do$driver Watir::Browser.new :chromesleep(2)$driver.window.…

裸机:串口通信

串口通信的基本原理 单工通信和双工通信 (1)单工就是单方向&#xff0c;双工就是双方同时收发&#xff0c;同时只能但方向但是方向可以改变叫半双工 (2)如果只能A发B收则单工&#xff0c;A发B收或者B发A收&#xff08;两个方向不能同时&#xff09;叫半双工&#xff0c;A发B收…

【C++】类与对象篇一

【C】类与对象篇一 一 .面向过程和面向对象初步认识二 .类的详解1.类的引入2.类的定义3.类的访问限定符及封装&#xff08;面试题&#xff09;4.类的作用域5.类的实例化6.类对象模型 三 . 结构体内存对齐规则&#xff08;面试题&#xff09;四 . this指针1.this指针的特性2.thi…

WOFOST的web应用

目录 运行可视化 参考链接 https://github.com/irripro/WOFOST_streamlit/tree/main 运行 运行主程序.py之后&#xff0c;得到一串命令 将该命令放到命令台中运行 然后会转到WOFOST的web端上 可视化 目前好像只支持欧洲区域的模拟运行