# 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:https://blog.csdn.net/Forget_8/article/details/157556220?spm=1001.2014.3001.5502#t26
# 下载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#add-memcached-session-manager-jars-to-tomcat
# 打不开github可以下载瓦特工具箱(Steam++官网) – Watt Toolkit加速github


# 将模块拷贝到rs1和rs2的tomcat的/lib目录下
# 到rs2查看/usr/local/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/
[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#example-for-sticky-sessions–kryo

[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

网硕互联帮助中心




评论前必须登录!
注册