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


相关推荐
漂流瓶jz2 小时前
Webpack如何实现万物皆可import?loader的使用/配置/手写实践
前端·javascript·webpack
ZC跨境爬虫2 小时前
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
前端·javascript·css·ui·交互
石山代码3 小时前
ArrayList / HashMap / ConcurrentHashMap
java·开发语言
修己xj3 小时前
告别手动存图!这款叫 Fatkun 的浏览器插件,简直是素材收集神器
前端
袋鼠云数栈4 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
AskHarries4 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
Moment4 小时前
长上下文会最终杀死 Rag 吗?
前端·javascript·后端
daidaidaiyu5 小时前
ThingsBoard 规则链系统源码分析和自定义定时器
java
qcx235 小时前
【系统学AI】25 论文导读 ①:两篇改变 AI 的开山之作——Attention Is All You Need & ReAct
前端·人工智能·react.js·transformer
小毛驴8505 小时前
spring-boot-maven-plugin,maven-compiler-plugin 功能对比
java·python·maven