RHEL——web应用服务器TOMCAT

java 全栈(前端+后端),用户想要访问java程序需要通过nginx,但nginx处理不了java,需要TOMCAT来处理java程序后将数据返回给nginx

#nginx(构建响应报文)------中间件------java(程序)

#中间件

  • 企业版:Oracle WebLogic、Red Hat JBoss EAP等

  • 社区版:Apache Tomcat等

一、WEB技术

1. 架构

C/S架构

客户端(应用)------服务

B/S架构

浏览器(网页)------服务


2. 前端三大核心技术

(1) HTML

HTML(HyperText Markup Language)是网页的骨架,用标签来定义网页有哪些内容

  • 不是编程语言(没有逻辑判断、循环)

  • 是标记语言(用一对对标签包裹内容)

  • 浏览器能直接识别和渲染


(2)css

CSS(Cascading Style Sheets)是网页的皮肤,控制 HTML 元素的外观(颜色、大小、位置、动画等)

  • 也是标记语言(不是编程语言)

  • 通过选择器找到 HTML 元素,然后设置样式

  • 支持层叠和继承


(3)JavaScript

JavaScript 是网页的灵魂(能做什么动作),让页面从"静态展示"变成"动态交互"

  • 是编程语言(有变量、循环、判断、函数),不是标记语言

  • 运行在浏览器端(也可以运行在服务器端,如 Node.js)

  • 可以动态操作 HTML 和 CSS(增删改查页面元素和样式)

  • 事件驱动(响应用户的点击、输入、滚动等操作)

  • 支持异步通信(AJAX/Fetch,不刷新页面获取数据)

用户和服务器进行交互时有同步和异步两种模式

同步:用户发来请求时,在网页中按顺序编写内容,如果上一行内容有错或者整个网页有一行错误,想要修改则会直接刷新整个网页,用户又要重新编写内容

异步:用户发来请求编写内容时,是不需要按顺序编写的,也不会因回到上一行修改而导致整个网页重新刷新


(4)JSP后端技术

HTML、CSS、JavaScript ------ 都是静态的,它们是浏览器直接运行的,内容写死在文件里,不会变化

JSP ------ 是动态的

  • JSP(JavaServer Pages)是 Java Web 技术

  • 运行在 服务器端(如 Tomcat)

  • 可以连接数据库、处理业务逻辑,动态生成 HTML 返回给浏览器


二、web框架

1. web资源和访问

用户通过电脑或手机来访问服务器


2. 后台应用架构

(1)单体架构

传统架构(单机系统),一个项目就是一个工程

all in one的架构方式,所有功能都放在一个应用里

Java实现:jsp、Servlet,打成一个包jar、war部署

易于开发和测试

如果某个功能模块出问题。需要修改就得重新打包


(2)微服务

SOA

  • 将功能分配到多个模块
  • 某个模块出问题就修复某个模块就行,不用重新修复整个应用

Microservice

  • 在SOA的基础是更加细化更多模块
  • 多人开发低,维护成本高

优点

  • 每个服务足够小,代码容易理解
  • 开发简单、效率高,可以由小团队(2-5)单独开发
  • 可以使用不同语言开发

缺点

  • 一个项目被拆分成多个工程,增加开发、测试、运维和监控等复查度
  • 要保证不同服务之间的数据一致,引入了分布式事务和异步补偿机制

微服务架构:Dubbo、Spring cloud


三、TOMCAT

1. TOMCAT实验环境

安装中间件TOMCAT要看企业用的最多的是哪个版本,不一定要下最新的版本

实验环境至少需要三台虚拟主机,一台用来做高新能web服务器(Nginx),两台用来做web应用服务器(rs1和rs2,用来部署TOMCAT)

安装Nginx:RHEL------高性能Web服务器-CSDN博客(三、Nginx源码编译)

下载TOMCAT9版本(目前企业用最多):Apache Tomcat® - Apache Tomcat 9 软件下载


2. 下载tomcat并部署

在rs1主机上下载tomcat和安装Java环境

root@rs1 \~# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

root@rs1 \~# yum install java-1.8.0-openjdk.x86_64 -y

部署tomcat

root@rs1 \~# ls

root@rs1 \~# tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local/

root@rs1 \~# cd /usr/local/

root@rs1 local# ls

root@rs1 local# mv apache-tomcat-9.0.115/ tomcat

root@rs1 local# cd tomcat/

root@rs1 tomcat# ls

root@rs1 tomcat# cd bin/

root@rs1 bin# ./startup.sh

root@rs1 bin# netstat -antlupe | grep 8080


3. 制作tomcat启动脚本

编写启动脚本

root@rs1 bin# 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环境,创建tomcat用户并进行测试

root@rs1 bin# vim /usr/local/tomcat/conf/tomcat.conf

1 JAVA_HOME=/etc/alternatives/jre

root@rs1 bin# useradd -s /sbin/nologin -M tomcat

root@rs1 bin# chown tomcat.tomcat /usr/local/tomcat/ -R

root@rs1 bin# systemctl daemon-reload

root@rs1 bin# systemctl enable --now tomcat.service

root@rs1 bin# systemctl restart tomcat.service

root@rs1 bin# netstat -antlupe | grep java


4. 在rs2上部署tomcat

###注意:在rs1上部署完tomcat后,在rs2上执行rs1一样的操作部署tomcat

将rs1上的tomcat程序和tomcat启动脚本拷贝到rs2上

root@rs1 local# scp -r tomcat/ root@192.168.153.20:/usr/local/

root@rs1 local# scp /lib/systemd/system/tomcat.service root@192.168.153.20:/lib/systemd/system/tomcat.service

在rs2上安装Java环境,并创建tomcat用户,启动tomcat服务

root@rs2 \~# yum install java-1.8.0-openjdk.x86_64 -y

root@rs2 \~# useradd -s /sbin/nologin -M tomcat

root@rs2 \~# chown tomcat.tomcat /usr/local/tomcat/ -R

root@rs2 \~# systemctl daemon-reload

root@rs2 \~# systemctl enable --now tomcat

root@rs2 \~# systemctl restart tomcat.service

root@rs2 \~# netstat -antlupe | grep 8080

root@rs2 \~# netstat -antlupe | grep java


四、nginx与tomcat整合

1. 单体架构

在nginx主机上配置,反向代理,单机运行

root@Nginx \~# vim /usr/local/nginx/conf/conf.d/vhosts.conf

root@Nginx \~# nginx -s reload


在rs1的tomcat默认发布目录/usr/local/tomcat/webapps/ROOT/上编写测试文件test.jsp

root@rs1 \~# vim /usr/local/tomcat/webapps/ROOT/test.jsp

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.util.*" %>

<html><head><title>Cluster App Test</title></head>

<body>

Server Info:

<%

out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

<%

out.println("<br> ID " + session.getId()+"<br>");

String dataName = request.getParameter("dataName");

if (dataName != null && dataName.length() > 0) {

String dataValue = request.getParameter("dataValue");

session.setAttribute(dataName, dataValue);

}

out.print("<b>Session list</b>");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String name = (String)e.nextElement();

String value = session.getAttribute(name).toString();

out.println( name + " = " + value+"<br>");

System.out.println( name + " = " + value);

}

%>

<form action="test.jsp" method="POST">

name:<input type=text size=20 name="dataName">

<br>

key:<input type=text size=20 name="dataValue">

<br>

<input type=submit>

</form>

</body>

</html>


将测试文件test.jsp也拷贝到rs2的默认发布目录上

root@rs1 \~# scp /usr/local/tomcat/webapps/ROOT/test.jsp root@192.168.153.20:/usr/local/tomcat/webapps/ROOT/test.jsp

在Windows主机(测试主机)中添加app.timinglee.org的域名解析

 2026-02-14   19:44.59   /home/mobaxterm  vim /etc/hosts

127.0.0.1 localhost

::1 localhost

192.168.153.100 www.timinglee.org lee.timinglee.org bbs.timinglee.org login.timinglee.org www.lee.org www.lee.com php.timinglee.org app.timinglee.org

在浏览器上访问app.timinglee.org/test.jsp


2. tomcat负载均衡

root@Nginx \~# vim /usr/local/nginx/conf/conf.d/vhosts.conf

root@Nginx \~# nginx -s reload


再次访问app.timinglee.org/test.jsp,填写表格是不会乱跳到另一个服务器上,真正实现负载均衡


五、session共享服务器

1. msm介绍

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

通过tomcat+memcache实现session会话领丢失


2. 下载模块

下载模块,将模块放到/usr/local/tomcat/lib目录下

下载链接:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

打不开github可以下载瓦特工具箱(Steam++官网) - Watt Toolkit加速github


将模块拷贝到rs1和rs2的tomcat的/lib目录下

root@rs1 \~# ls

root@rs1 \~# unzip jar.zip

root@rs1 \~# cp jar/* /usr/local/tomcat/lib/

root@rs1 \~# ls /usr/local/tomcat/lib/

root@rs1 \~# scp jar/* root@192.168.153.20:/usr/local/tomcat/lib/

到rs2查看/usr/local/tomcat/lib/目录下是否有下好的模块

root@rs2 \~# ls /usr/local/tomcat/lib/


3. 安装memcache

在rs1和rs2上安装memcache,并开启memcache服务

root@rs1 \~# dnf install memcached -y

root@rs1 \~# vim /etc/sysconfig/memcached

root@rs1 \~# systemctl restart memcached.service

root@rs1 \~# netstat -antluple | grep memcached


4. 配置tomcat

在rs1和rs2的/usr/local/tomcat/conf/context.xml

参考模板:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration

root@rs1 \~# vim /usr/local/tomcat/conf/context.xml

29 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

30 memcachedNodes="n1:192.168.153.10:11211,n2:192.168.153.20:11211"

31 failoverNodes="n1"

32 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

33 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

34 />

root@rs1 \~# systemctl restart tomcat.service

root@rs2 \~# vim /usr/local/tomcat/conf/context.xml

29 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

30 memcachedNodes="n1:192.168.153.10:11211,n2:192.168.153.20:11211"

31 failoverNodes="n2"

32 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

33 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

34 />

root@rs2 \~# systemctl restart tomcat.service


5. 测试共享服务器

rs1和rs2都在线的情况下访问app.timinglee.org/test.jsp


当rs2挂掉后,再次访问app.timinglee.org/test.jsp到rs1上是否有之前rs2的会话数据

root@rs2 \~# systemctl stop tomcat.service


激活rs2的tomcat服务,关闭rs1的tomcat服务,在rs2上查看是否有rs1的会话数据

root@rs2 \~# systemctl restart tomcat.service

root@rs1 \~# systemctl stop tomcat.service


相关推荐
lichenyang45333 分钟前
为什么需要双线程通信、JavaScriptProxy 和 runJavaScript 分别干什么
前端
以和为贵42 分钟前
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
前端·人工智能·面试
风止何安啊1 小时前
网课倍速痛点解决:一套前端代码实现自由控速播放器
前端·javascript·node.js
张不才1 小时前
CPU 100% 了怎么办?Java 性能排障的标准化操作
java·后端
牧艺1 小时前
用 Next.js + React Three Fiber 打造 3D 快递仓储可视化
前端·three.js
锋行天下2 小时前
如何用Vite实现Vue组件的按需打包和远程加载
前端·vue.js·前端框架
光影少年2 小时前
原生DOM操作在React 中的注意事项
前端·javascript·react.js
shepherd1112 小时前
吞吐量提升 10 倍:高并发大批量数据处理任务的架构演进与性能调优
java·后端·架构
禅思院4 小时前
前端部署“三层漏斗”完全指南:从CI/CD到自动回滚的工程化实战【开题】
前端·架构·前端框架
快乐肚皮5 小时前
深入理解Loop Engineering
前端·后端