一、HTTP 协议(Hypertext Transfer Protocol,超文本传输协议)
HTTP 是用于在万维网(WWW)中传输数据的应用层协议,是客户端(如浏览器)与服务器之间通信的基础。它定义了请求和响应的格式、传输规则及状态码等,使不同设备和系统能够通过互联网交换信息(如网页、图片、视频等)。
1. HTTP 的核心特点
- 无连接:传统 HTTP/1.1 之前的版本为 "无连接" 模式,即每次请求 - 响应后连接关闭;HTTP/1.1 引入 "持久连接"(Connection: keep-alive),允许同一连接处理多个请求,减少连接建立开销。
- 无状态:服务器不保留客户端的历史请求信息,每次请求都是独立的。若需维持状态(如登录状态),需通过 Cookie、Session 等机制实现。
- 媒体无关性:只要客户端和服务器都能处理对应的数据格式(如 HTML、JSON、图片等),HTTP 可传输任意类型的媒体。
- 请求 - 响应模式:由客户端主动发起请求,服务器被动响应,遵循 "一问一答" 的交互逻辑。
2. HTTP 请求与响应格式
HTTP 通信通过 "请求报文" 和 "响应报文" 完成,两者格式类似,均由起始行、头部字段、空行、主体四部分组成。
(1)请求报文
plaintext
<请求方法> <URL> <协议版本> # 起始行
<请求头部字段1>: <值1> # 头部(键值对,描述请求属性)
<请求头部字段2>: <值2>
...
(空行,分隔头部与主体)
<请求主体> # 可选,如POST请求的表单数据、JSON等
- 请求方法 :表示对资源的操作,常见包括:
- GET:获取资源(如浏览网页),参数在 URL 中,长度有限制。
- POST:提交数据(如表单提交),参数在请求主体中,适合大量数据。
- PUT/DELETE:修改 / 删除资源(RESTful API 常用)。
- HEAD:仅获取响应头部(用于检查资源是否存在)。
- 请求头部 :示例字段:
- Host:目标服务器域名(如Host: www.example.com)。
- User-Agent:客户端信息(如浏览器类型)。
- Accept:客户端可接收的数据格式(如text/html)。
- Cookie:客户端存储的状态信息。
(2)响应报文
plaintext
<协议版本> <状态码> <状态描述> # 起始行
<响应头部字段1>: <值1> # 头部(描述响应属性)
<响应头部字段2>: <值2>
...
(空行,分隔头部与主体)
<响应主体> # 服务器返回的数据(如HTML、JSON等)
- 状态码 :表示请求处理结果,分为 5 类:
- 1xx(信息):请求已接收,继续处理(如100 Continue)。
- 2xx(成功):请求正常处理(如200 OK)。
- 3xx(重定向):需进一步操作(如301 Moved Permanently永久重定向)。
- 4xx(客户端错误):请求有误(如404 Not Found资源不存在)。
- 5xx(服务器错误):服务器处理失败(如500 Internal Server Error)。
- 响应头部 :示例字段:
- Content-Type:响应主体的数据类型(如text/html; charset=utf-8)。
- Content-Length:响应主体的长度(字节数)。
- Set-Cookie:服务器向客户端设置 Cookie。
- Cache-Control:缓存策略(如max-age=3600表示缓存 1 小时)。
3. HTTP 版本演进
- HTTP/1.0(1996):基础版本,无持久连接,每次请求需新建连接,效率低。
- HTTP/1.1(1999):支持持久连接、管道化请求(同一连接并行发送多个请求)、虚拟主机(通过Host头部区分域名),是目前应用最广泛的版本。
- HTTP/2(2015):引入二进制帧、多路复用(同一连接并发处理多个请求,无阻塞)、头部压缩、服务器推送(主动推送关联资源),大幅提升性能。
- HTTP/3(2022):基于 QUIC 协议(UDP 的改进版),解决 HTTP/2 在高延迟网络下的性能问题,支持更快的连接建立和更好的拥塞控制。
二、B/S 结构(Browser/Server,浏览器 / 服务器结构)
B/S 结构是一种软件架构模式,通过浏览器作为客户端 ,服务器作为数据处理中心,两者通过 HTTP 协议通信,无需安装专门的客户端软件。
1. B/S 结构的组成
- 客户端(Browser):用户通过浏览器(如 Chrome、Firefox)发送请求,接收并渲染服务器返回的内容(如 HTML 页面、图片等)。
- 服务器(Server) :接收客户端请求,处理业务逻辑(如数据查询、计算),并返回响应(如动态生成的 HTML、JSON 数据)。服务器可分为:
- Web 服务器:处理 HTTP 请求(如 Nginx、Apache)。
- 应用服务器:执行业务代码(如 Java 的 Tomcat、Python 的 Django)。
- 数据库服务器:存储数据(如 MySQL、PostgreSQL)。
- 通信协议:基于 HTTP/HTTPS,确保客户端与服务器之间的数据传输。
2. B/S 结构的工作流程
- 用户在浏览器中输入 URL(如https://www.example.com)或点击链接。
- 浏览器解析 URL,通过 DNS 获取服务器 IP 地址,建立 TCP 连接(HTTP 基于 TCP)。
- 浏览器发送 HTTP 请求(如GET /index.html)到服务器。
- 服务器接收请求,处理业务逻辑(如查询数据库、生成动态页面)。
- 服务器返回 HTTP 响应(如 HTML 页面、JSON 数据)。
- 浏览器解析响应内容,渲染页面并展示给用户。
- 若为持久连接,连接可复用;否则关闭 TCP 连接。
3. B/S 结构的优势与劣势
(1)优势
- 无需安装客户端:用户通过浏览器即可访问,降低部署和维护成本(尤其适合多设备、跨平台场景)。
- 易于升级:只需更新服务器端程序,所有用户即可使用新功能,无需逐个更新客户端。
- 跨平台性:兼容 Windows、macOS、Linux 等操作系统,以及手机、平板等移动设备。
- 集中管理:数据存储在服务器,便于备份、安全管控和统一维护。
(2)劣势
- 依赖网络:网络延迟或中断会直接影响使用体验,离线功能受限。
- 服务器压力大:所有请求集中在服务器,高并发场景下需更强的硬件和优化。
- 浏览器兼容性:不同浏览器对 HTML/CSS/JavaScript 的解析可能存在差异,需额外适配。
- 安全性风险:HTTP 传输数据可能被劫持(HTTPS 可缓解),需依赖服务器安全防护。
三、HTTP 协议与 B/S 结构的关系
- HTTP 是 B/S 结构的通信基础:浏览器与服务器通过 HTTP 协议交换数据,确保请求和响应的格式统一。
- B/S 结构依赖 HTTP 的特性:例如,HTTP 的无状态性通过 Cookie/Session 实现用户登录状态维持;HTTP/2 的多路复用提升 B/S 架构的性能。
- 协同支撑 Web 应用:B/S 结构定义了 "浏览器 - 服务器" 的角色分工,HTTP 则定义了两者的通信规则,共同支撑网页浏览、在线购物、社交平台等 Web 应用的运行。
四、典型应用场景
- 网站浏览(如百度、知乎):浏览器发送 HTTP 请求获取网页,服务器返回 HTML 响应。
- 在线办公(如钉钉、企业微信):通过浏览器访问服务器,处理文档、消息等数据。
- 电商平台(如淘宝、京东):用户在浏览器中提交订单(POST 请求),服务器处理并返回结果。
- API 服务(如天气接口、支付接口):客户端(浏览器或 App)通过 HTTP 请求调用 API,服务器返回 JSON 格式数据。
通过 HTTP 协议和 B/S 结构的结合,互联网实现了全球范围内的信息共享和交互,成为现代网络应用的核心架构模式。
前端三大核心技术
前端三大核心技术是构建网页和 Web 应用的基础,分别负责结构、样式和交互逻辑,三者协同工作实现丰富的用户界面和体验。以下是详细介绍:
1. HTML (HyperText Markup Language,超文本标记语言)
- 核心作用 :定义网页的结构和内容,是网页的 "骨架"。
- 本质 :不是编程语言,而是一种标记语言,通过标签(tag)描述文本、图片、链接、表单等元素的含义和排列方式。
- 关键特性 :
- 标签通常成对出现(如 <p></p> 表示段落,<div></div> 表示块级容器),部分为单标签(如 <img> 插入图片)。
- 具有嵌套结构,可通过层级关系组织内容(如 <ul> 包含 <li> 表示列表)。
- 支持超文本(HyperText),即通过 <a> 标签实现不同页面或资源的跳转。
- 举例:
html
<!DOCTYPE html>
<html>
<head>
<title>网页标题</title>
</head>
<body>
<h1>这是一级标题</h1>
<p>这是一段文本,包含一个<a href="https://example.com">链接</a>。</p>
<img src="image.jpg" alt="示例图片">
</body>
</html>
2. CSS (Cascading Style Sheets,层叠样式表)
- 核心作用 :控制网页的样式和布局,是网页的 "外观"。
- 本质:用于定义 HTML 元素的视觉表现(颜色、字体、间距、位置等),实现内容与样式的分离。
- 关键特性 :
- 选择器:通过标签名、类名(class)、ID 等定位 HTML 元素(如 p 选中所有段落,.box 选中类为 box 的元素)。
- 层叠性:多个样式规则冲突时,按优先级(权重)决定最终生效的样式(如 ID 选择器优先级高于类选择器)。
- 盒子模型:将元素视为 "盒子",通过 margin(外边距)、border(边框)、padding(内边距)和 content(内容)控制布局。
- 布局技术:支持浮动(float)、弹性布局(Flexbox)、网格布局(Grid)等,实现复杂页面排版。
- 举例:
css
/* 选中所有段落,设置文字颜色和字体 */
p {
color: #333;
font-family: "Arial", sans-serif;
line-height: 1.6;
}
/* 选中类为 "box" 的元素,设置背景和边距 */
.box {
background-color: #f0f0f0;
padding: 20px;
margin: 10px;
border-radius: 5px;
}
3. JavaScript (简称 JS)
- 核心作用 :实现网页的交互逻辑和动态效果,是网页的 "行为"。
- 本质 :一种编程语言(脚本语言),可直接嵌入 HTML 或单独作为文件引入,用于响应用户操作、修改页面内容、与服务器交互等。
- 关键特性 :
- 动态性:可实时修改 HTML 和 CSS(如通过 document.getElementById() 操作元素,改变其内容或样式)。
- 事件驱动:通过监听用户行为(点击、滚动、输入等)触发函数(如 onclick 点击事件)。
- 异步操作:支持 AJAX(异步请求)和 Fetch API,无需刷新页面即可与服务器交换数据(如加载新内容、提交表单)。
- 生态丰富:可通过框架(如 React、Vue)和库(如 jQuery)扩展功能,简化复杂开发。
- 举例:
javascript
// 获取按钮元素,点击时修改段落内容
const btn = document.getElementById("myBtn");
const para = document.getElementById("myPara");
btn.onclick = function() {
para.textContent = "文本已更新!";
para.style.color = "blue"; // 同时修改样式
};
三者关系总结
- HTML 搭建基础结构("有什么"),CSS 美化呈现效果("长什么样"),JavaScript 赋予交互能力("能做什么")。
- 现代前端开发中,这三者仍是核心基础,在此之上衍生出各种框架(如 Vue、React)、预处理器(如 Sass、TypeScript),但本质都是对这三大技术的扩展和优化。
同步
交互式网页,用户提交了请求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪
怕URL不变,整个网页都需要重新渲染。例如,用户填写注册信息,只是2次密码不一致,提交后,整个
注册页面重新刷新,所有填写项目重新填写(当然有办法让用户减少重填)。这种交互非常不友好。从代价
的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览
器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些请求的过程,就是同步过程,用户
发起请求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
异步
1996年微软实现了iframe标签,可以在一个网页使用iframe标签局部异步加载内容。
1999年微软推出异步数据传输的ActiveX插件技术,太笨重了,但是也火了很多年。有一个组件
XMLHttpRequest被大多数浏览器支持。
传统的网页如果需要更新内容,必需重载整个网页面。Ajax的出现,改变这一切,同时极大的促进了
Javascript的发展。Ajax即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种
创建交互式、快速动态网页应用的网页开发技术,最早起源于1998年微软的Outlook Web Access开发团
队。Ajax 通过在后台与服务器进行少量数据交换, 可以使网页实现异步更新。这意味着可以在不重新加
载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的
XMLHttpRequest 对象实现Ajax 技术。早期Ajax结合数据格式XML,目前更多的使用JSON。利用AJAX可
实现前后端开发的彻底分离,改变了传统的开发模式。
AJAX是一种技术的组合,技术的重新发现,而不是发明,但是它深远的影响了整个WEB开发。
tomcat 的功能介绍
Tomcat 是一款由 Apache 基金会开发的开源 Java Web 服务器 ,同时也是一个Servlet 容器,主要用于运行 Java Web 应用程序(如 JSP、Servlet 等)。它轻量、稳定且兼容性强,是中小型 Java Web 项目的常用选择,也是学习 Java Web 开发的经典工具。
Tomcat 的核心功能
1. 作为 Servlet 容器,运行 Java Web 组件
Tomcat 的核心功能是解析和运行 Servlet、JSP(JavaServer Pages) 等 Java Web 技术规范的组件:
- Servlet:处理客户端请求的 Java 程序(如接收表单数据、与数据库交互),是 Java Web 的核心逻辑载体。
- JSP:嵌入 Java 代码的 HTML 页面,本质上会被 Tomcat 编译为 Servlet 执行,用于动态生成网页内容。
Tomcat 严格遵循 Java EE(现 Jakarta EE)规范中的 Servlet 和 JSP 标准,确保符合规范的 Java Web 应用能在其上正常运行。
2. 提供 Web 服务器功能
除了作为容器,Tomcat 本身也具备基础的 Web 服务器能力:
- 静态资源服务:可直接部署和访问 HTML、CSS、JavaScript、图片等静态文件(类似 Nginx 的基础功能)。
- HTTP 协议支持:处理 HTTP 请求与响应,支持 HTTP/1.1 协议,部分版本(如 Tomcat 9+)支持 HTTP/2。
- 虚拟主机配置:通过配置可在同一 Tomcat 实例上部署多个网站(绑定不同域名)。
- 端口监听:默认监听 8080 端口(HTTP)和 8443 端口(HTTPS,需配置证书)。
3. 支持多种部署方式
Tomcat 提供灵活的应用部署机制,适配不同场景:
- 自动部署:将 Web 应用的 WAR 包(Java Web 应用打包格式)放入 webapps 目录,Tomcat 会自动解压并部署。
- 手动部署:通过 server.xml 配置文件或 context.xml 单独指定应用路径和访问路径。
- 远程部署:通过 Tomcat 管理界面(Manager App)或 API 远程上传和部署 WAR 包。
- 热部署:在不重启 Tomcat 的情况下更新应用(需配置 reloadable="true",开发环境常用)。
4. 内置管理工具
Tomcat 提供可视化管理工具,方便运维和调试:
- Manager App:通过网页界面管理已部署的应用(启动、停止、卸载、部署新应用等),需配置用户名密码。
- Host Manager:管理虚拟主机,可添加、删除或配置域名绑定。
- 状态监控:通过 /manager/status 查看服务器状态(如线程数、内存使用、请求统计等)。
5. 安全与扩展性
- 安全配置:支持 HTTPS 加密传输(需配置 SSL 证书)、IP 访问控制、用户认证(基于角色的权限管理)等。
- 扩展性:可通过 Valve(阀门)、Listener(监听器)等组件扩展功能(如日志记录、请求过滤、性能监控)。
- 集群支持:通过配置可实现多 Tomcat 实例的集群部署,配合负载均衡器(如 Nginx)提升可用性和并发能力。
6. 轻量与跨平台
- 轻量性:安装包体积小(约 10-20MB),启动快,资源占用低,适合开发环境和中小型生产环境。
- 跨平台:基于 Java 开发,可运行在 Windows、Linux、macOS 等所有支持 JVM 的操作系统上。
Tomcat 与其他服务器的区别
- 与 Nginx/Apache 对比:Nginx/Apache 是通用 Web 服务器,擅长处理静态资源和反向代理;Tomcat 专注于运行 Java Web 应用,静态资源处理能力较弱,通常会配合 Nginx 使用(Nginx 处理静态资源 + 反向代理到 Tomcat)。
- 与 Jetty 对比:两者都是 Servlet 容器,Tomcat 更稳定、生态更成熟;Jetty 更轻量、启动更快,适合嵌入式场景(如 Spring Boot 内置 Jetty)。
- 与 WebLogic/WebSphere 对比:后两者是大型商业 Java EE 应用服务器,支持更多企业级功能(如 EJB、分布式事务),但体积大、配置复杂;Tomcat 是轻量开源方案,仅支持 Servlet/JSP 等核心规范。
典型应用场景
- 开发和调试 Java Web 应用(如基于 Spring MVC、Struts 等框架的项目)。
- 部署中小型 Java Web 应用(如企业官网、内部管理系统)。
- 作为后端服务容器,配合 Nginx 实现动静分离和负载均衡。
总之,Tomcat 是 Java Web 开发和部署的基础工具,其核心价值在于高效运行 Servlet/JSP 应用,同时提供足够的灵活性和扩展性满足不同场景需求。
安装 Tomcat
yum install java-1.8.0-openjdk.x86_64 -y

cd /etc/alternatives/jre
tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
cd /usr/local/
mv apache-tomcat-9.0.107/ tomcat
cd tomcat/
cd bin/
./startup.sh
netstat -antlupe | grep java

访问tomcat

tomcat 的文件结构和组成
Tomcat 的文件结构设计清晰,遵循模块化原则,主要包含二进制执行文件、配置文件、web 应用目录、日志和临时文件等。以下是 Tomcat 主要文件结构及各部分的功能说明(以 Tomcat 9 为例):
核心目录结构
apache-tomcat-9.0.x/
├── bin/ # 二进制执行文件(启动/停止脚本)
├── conf/ # 配置文件目录
├── lib/ # Tomcat 核心类库(JAR包)
├── logs/ # 日志文件目录
├── temp/ # 临时文件目录
├── webapps/ # Web 应用部署目录(默认自动部署)
├── work/ # JSP 编译后的 Servlet 类文件目录
└── LICENSE/ NOTICE/ RELEASE-NOTES # 版权和版本说明文件
各目录详细说明
1. bin/ :执行脚本目录
存放启动、停止 Tomcat 的脚本和工具程序,是操作 Tomcat 的入口。
- Windows 系统 :
- startup.bat:启动 Tomcat 服务
- shutdown.bat:停止 Tomcat 服务
- catalina.bat:核心脚本(startup 和 shutdown 实际调用此脚本)
- tomcat9w.exe:Tomcat 服务监控工具(图形化界面)
- Linux/macOS 系统 :
- startup.sh、shutdown.sh、catalina.sh:对应 Shell 脚本
- setclasspath.sh:设置 Java 类路径(JRE/JDK 路径)
- 其他工具:digest.sh/bat(密码加密工具)、version.sh/bat(查看 Tomcat 版本)等。
2. conf/ :配置文件目录
存放 Tomcat 核心配置文件,决定服务器的运行规则(如端口、虚拟主机、用户权限等)。
- server.xml :Tomcat 最核心的配置文件,定义服务器整体结构:
- 监听端口(如 Connector port="8080" 配置 HTTP 端口)
- 虚拟主机(Host 标签,配置域名和应用目录)
- 全局组件(如 Resource 配置数据库连接池)
- web.xml :Web 应用的默认配置文件(全局生效),定义:
- Servlet 映射(如 JSP 对应的 JspServlet)
- MIME 类型(文件扩展名与内容类型映射)
- 过滤器(如字符编码过滤器 CharacterEncodingFilter)
- context.xml:上下文配置文件,定义 Web 应用的全局上下文参数(如数据源、会话配置),可被所有应用共享。
- tomcat-users.xml:配置 Tomcat 管理用户及权限(如访问 Manager App 所需的用户名、密码和角色)。
- catalina.policy:Java 安全策略配置文件,限制 Tomcat 对系统资源的访问(如文件读写权限)。
- catalina.properties:Tomcat 系统属性配置(如类加载路径、默认字符集)。
- logging.properties:日志配置文件,定义日志输出格式、级别和路径。
3. lib/ :核心类库目录
存放 Tomcat 运行所需的所有 JAR 包,包含:
- Servlet/JSP 规范的实现类(如 servlet-api.jar、jsp-api.jar)
- Tomcat 自身的核心组件(如 catalina.jar、tomcat-util.jar)
- 常用依赖(如 XML 解析、日志处理相关 JAR)
注意:此目录的 JAR 包会被所有 Web 应用共享,无需在每个应用的 WEB-INF/lib 中重复放置。
4. webapps/ :Web 应用部署目录
Tomcat 默认的应用部署目录,放入此目录的 Web 应用(WAR 包或解压后的文件夹)会被自动部署。
- 默认应用 :
- ROOT/:根应用,访问 http://localhost:8080 时默认访问此应用。
- manager/:Tomcat 管理应用(Manager App),用于部署 / 管理其他应用(需在 tomcat-users.xml 配置权限)。
- host-manager/:虚拟主机管理应用(Host Manager)。
- docs/:Tomcat 官方文档和示例。
- 自定义应用:将自己的 Web 应用(如 myapp.war)放入此目录,Tomcat 会自动解压为 myapp/ 文件夹,通过 http://localhost:8080/myapp 访问。
5. work/ :JSP 编译目录
Tomcat 会将 JSP 页面编译为 Java Servlet 类文件(.java 和 .class),并存放在此目录。
- 路径格式:work/Catalina/[主机名]/[应用名]/(如 work/Catalina/localhost/myapp/)。
- 作用:编译后的类直接被 Tomcat 加载执行,若 JSP 内容修改,Tomcat 会重新编译并覆盖旧文件。
- 清理:删除此目录文件不会影响原始 JSP,重启 Tomcat 会重新编译(常用于解决 JSP 缓存导致的修改不生效问题)。
6. logs/ :日志文件目录
存放 Tomcat 运行过程中产生的日志,是排查问题的关键依据。
- catalina.out:核心日志文件,记录 Tomcat 启动 / 停止信息、系统级错误(最常用的日志)。
- catalina.YYYY-MM-DD.log:按日期拆分的 Catalina 日志(与 catalina.out 内容类似,按日期归档)。
- localhost.YYYY-MM-DD.log:Web 应用输出的日志(如应用启动异常、System.out 打印的内容)。
- localhost_access_log.YYYY-MM-DD.txt:访问日志,记录所有 HTTP 请求(包含客户端 IP、请求路径、响应状态码等)。
- manager.YYYY-MM-DD.log:Manager App 的操作日志(如部署 / 卸载应用的记录)。
7. temp/ :临时文件目录
Tomcat 运行过程中生成的临时文件(如上传文件的临时存储、压缩包解压临时文件等),Tomcat 关闭时会自动清理(也可手动删除)。
Web 应用的标准结构(以 webapps/myapp/ 为例)
每个部署在 Tomcat 中的 Web 应用需遵循固定目录结构(Java EE 规范):
myapp/
├── index.html # 首页(静态资源)
├── css/ # 样式文件目录
├── js/ # JavaScript 文件目录
├── images/ # 图片资源目录
└── WEB-INF/ # 应用私有目录(客户端无法直接访问)
├── web.xml # 应用级配置文件(Servlet 映射、过滤器等)
├── classes/ # 应用的 Java 类文件(.class)
├── lib/ # 应用依赖的 JAR 包(仅当前应用可见)
└── jsp/ # 私有 JSP 页面(客户端无法直接访问,需通过 Servlet 转发)
- WEB-INF/ 是关键目录,包含应用的核心配置和代码,且客户端无法通过 URL 直接访问(保证安全性)。
总结
Tomcat 的文件结构遵循 "功能分离" 原则:
- bin/ 负责启停控制,conf/ 负责规则配置,lib/ 提供运行依赖;
- webapps/ 是应用部署的核心区域,work/ 和 temp/ 是运行时临时目录;
- logs/ 记录全生命周期的操作和错误信息,便于问题排查。
理解这些目录的作用,能帮助开发者更高效地配置 Tomcat、部署应用和排查故障。
生成tomcat的主配置文件
root@tomcat \~\]# vim /usr/local/tomcat/conf/tomcat.conf JAVA_HOME=/etc/alternatives/jre 生成启动文件 \[root@tomcat \~\]# 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用户并设定软件安装目录权限
root@tomcatB bin\]# useradd -s /sbin/nologin -M tomcat \[root@tomcatB bin\]# chown tomcat.tomcat /usr/local/tomcat/ -R 结合反向代理实现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 \~\]# vim /usr/local/nginx/conf.d/vhosts.conf location \~ \\.jsp$ { proxy_pass http://172.25.254.21:8080; } 测试: 在浏览器中访问信息 172.25.254.21:8080/test.jsp  **实现tomcat中的负载均衡** 动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载 均衡。 当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由 来,都是由于HTTP协议在设计之初没有想到未来的发展。 HTTP 协议的**无状态** 、**有连接** 和**短连接**是其核心特性,深刻影响着网络通信的设计和应用场景。以下从概念、特点、影响及应对方式等方面详细解析: **一、HTTP 的无状态(Stateless)** **定义**:HTTP 协议本身不保存客户端与服务器之间的通信状态,即服务器对客户端的每次请求都是独立处理的,不会记忆之前的请求信息(如用户登录状态、操作历史等)。 **特点:** * 服务器 "忘记" 历史:每次请求都是全新的,服务器不会存储客户端的上下文信息(如 "上一次请求浏览了哪个页面")。 * 请求独立性:客户端发送的请求必须包含所有必要信息(如身份认证、参数等),服务器无需依赖过往交互即可处理。 **影响与解决:** * **问题**:无状态导致无法维持用户会话(如登录后跳转页面仍需验证身份)。 * **解决方案** : * **Cookie**:客户端存储的小型文本文件,由服务器下发,每次请求自动携带,用于标识用户。 * **Session**:服务器端存储的会话数据,通过 Cookie 中的 SessionID 关联客户端,实现状态跟踪。 * **Token**:客户端请求时携带的令牌(如 JWT),服务器通过令牌验证身份和权限,无需存储会话信息。 **二、HTTP 的有连接(Connection-Oriented)** **定义**:HTTP 基于 TCP 协议实现通信,而 TCP 是 "有连接" 的协议,即通信前必须建立连接,通信结束后关闭连接。 **特点:** * 连接建立流程:需经过**三次握手**(客户端→服务器请求连接→服务器确认→客户端确认)建立 TCP 连接。 * 依赖底层连接:HTTP 请求和响应必须在已建立的 TCP 连接中传输,连接中断则通信失败。 **与 HTTP 的关系:** * HTTP 本身不直接管理连接,而是依赖 TCP 的连接机制。例如,客户端发送 HTTP 请求前,需先通过 TCP 与服务器建立连接,请求完成后再通过 TCP 四次挥手关闭连接。 * 注意:"有连接" 是 TCP 的特性,HTTP 仅 "借用" TCP 的连接进行数据传输,因此常说 "HTTP 基于有连接的 TCP 协议"。 **三、HTTP 的短连接(Short Connection)** **定义**:默认情况下,HTTP/1.0 及早期版本采用 "短连接" 模式,即一次连接仅处理一个 HTTP 请求,请求完成后立即关闭连接。 **流程:** 1. 客户端与服务器建立 TCP 连接。 2. 客户端发送一个 HTTP 请求。 3. 服务器返回 HTTP 响应。 4. 连接关闭(TCP 四次挥手)。 **特点:** * 轻量但低效:每次请求都需重新建立连接,增加了三次握手、四次挥手的耗时(尤其对多资源页面,如包含多个图片、CSS 的网页,需多次建立连接)。 * 适用于简单场景:如早期静态网页,资源少、请求频率低的场景。 **优化:长连接(Persistent Connection)** * **HTTP/1.1** **默认启用**:通过Connection: keep-alive头部,使 TCP 连接在一次请求后不关闭,可复用连接处理多个 HTTP 请求(直到超时或被主动关闭)。 * 优势:减少连接建立次数,降低延迟,提升多资源页面的加载效率。 * 适用场景:动态网页、高并发请求(如电商网站),需频繁交互的场景。 **总结:三者关系** * **无状态**:HTTP 协议的核心特性,决定了其无法天然维持会话,需通过 Cookie、Session 等机制补充。 * **有连接**:HTTP 依赖 TCP 的有连接特性,通信前必须建立 TCP 连接,是数据传输的基础。 * **短连接**:HTTP 早期的连接模式,因效率问题被 HTTP/1.1 的长连接替代,但本质是对 TCP 连接的使用方式(一次连接处理一个请求)。 这些特性共同影响了 HTTP 的设计,后续 HTTP/2、HTTP/3 通过多路复用、QUIC 协议等进一步优化了连接效率和性能,但核心的无状态特性仍被保留(需通过额外机制实现状态跟踪)。 upstream tomcat { #hash $cookie_JSESSIONID; server 172.25.254.21:8080; server 172.25.254.22:8080; } server { listen 80; server_name www.xie.org; location \~ \\.jsp$ { proxy_pass http://tomcat; } }   **Memcached** Memcached 是一款高性能的分布式内存对象缓存系统,主要用于减轻数据库负载、加速动态 Web 应用的响应速度。它通过将频繁访问的数据存储在内存中,避免了重复从数据库或磁盘读取数据的开销,从而显著提升系统性能。以下从核心特性、工作原理、架构、应用场景等方面详细介绍: **一、核心特性** 1. **内存存储** 数据完全存储在内存中,读写速度极快(内存访问延迟通常在微秒级,远低于磁盘的毫秒级),但服务器重启或断电后数据会丢失,因此**不适合作为持久化存储**,仅用于缓存临时数据。 2. **键值对存储** 数据以 "键(Key)- 值(Value)" 形式存储,键和值均为字符串类型(值可序列化后存储对象、数组等复杂数据)。键的最大长度为 250 字节,值的默认最大限制为 1MB(可通过配置修改)。 3. **分布式设计** 支持多服务器集群部署,客户端可通过哈希算法(如一致性哈希)将不同的键分配到不同服务器,实现数据分片和负载均衡,轻松扩展缓存容量。 4. **简单协议** 采用文本协议(如set、get、delete等命令),通信简洁高效,支持多种编程语言(Java、Python、PHP、C# 等)的客户端库。 5. **过期策略** 每个键值对可设置过期时间(TTL,Time To Live),过期后数据自动删除,释放内存空间。若内存不足,会触发**LRU(最近最少使用)淘汰机制**,删除最久未被访问的数据。 6. **无状态** 服务器不保存客户端会话信息,每个请求都是独立的,便于集群扩展(新增服务器无需同步状态)。 **二、工作原理** 1. **数据缓存流程** * 客户端请求数据时,先查询 Memcached: * 若命中(存在对应键),直接返回缓存数据,避免访问数据库。 * 若未命中,客户端从数据库读取数据,同时将数据写入 Memcached(供后续请求使用)。 2. **分布式哈希机制** * 客户端通过哈希函数(如对 Key 进行哈希)计算出一个数值,再根据服务器数量取模,确定该 Key 应存储在哪个服务器节点,实现数据的分布式存储。 * 一致性哈希算法可减少服务器增减时的数据迁移量,提升集群稳定性。 3. **内存管理** * 采用预分配内存池(Slab Allocation)机制,将内存划分为不同大小的块(Slab Class),每个块只能存储特定大小的数据。 * 优势:减少内存碎片,提高内存利用率;劣势:若数据大小与块不匹配,可能导致内存浪费。 **三、架构组成** 1. **客户端(Client)** * 集成 Memcached 客户端库的应用程序(如 Web 服务器、APP 后端),负责向 Memcached 服务器发送命令(读写数据),并处理哈希分片逻辑。 2. **Memcached** **服务器(Server)** * 独立运行的守护进程(Daemon),监听指定端口(默认 11211),接收客户端命令并管理内存中的键值对数据。 * 单台服务器可配置内存大小(通过-m参数,如-m 1024表示分配 1GB 内存)。 3. **通信协议** * 基于 TCP 协议传输,客户端与服务器通过文本命令交互,例如: * set key 0 3600 5:存储键为key、过期时间 3600 秒、值长度 5 字节的数据。 * get key:获取键key对应的值。 **四、应用场景** 1. **数据库查询缓存** 缓存频繁访问的数据库查询结果(如用户信息、商品列表),减少数据库的查询压力,尤其适用于读多写少的场景(如电商商品详情页)。 2. **会话存储** 存储用户会话数据(如登录状态、购物车信息),替代服务器本地 Session,支持分布式系统中的会话共享(如多台 Web 服务器集群)。 3. **计数器与限流** 利用incr/decr命令实现分布式计数器(如页面访问量),或结合过期时间实现接口限流(如限制某 IP 的请求频率)。 4. **临时数据缓存** 缓存 API 调用结果、页面片段(如首页热点新闻)、临时生成的动态内容等,缩短用户等待时间。 **五、优缺点与适用场景** | **优势** | **劣势** | |-------------|-------------------| | 内存存储,读写速度极快 | 数据非持久化,重启丢失 | | 分布式设计,易于扩展 | 不支持复杂查询(仅键值查询) | | 协议简单,兼容性强 | 单个值大小有限制(默认 1MB) | | 无状态,集群部署灵活 | 不支持数据备份(需依赖客户端实现) | **适用场景** :高并发读场景、临时数据缓存、分布式会话管理; **不适用场景**:需要持久化存储、复杂查询(如 SQL 条件过滤)、大数据值存储的场景(可考虑 Redis 等替代方案)。 **六、与 Redis 的对比** Memcached 和 Redis 均为内存缓存系统,但存在显著差异: * **数据结构**:Memcached 仅支持键值对;Redis 支持字符串、哈希、列表、集合等多种数据结构。 * **持久化**:Memcached 无持久化;Redis 支持 RDB、AOF 持久化。 * **功能扩展**:Redis 支持事务、发布订阅、Lua 脚本等高级功能;Memcached 功能更简单。 * **性能**:简单键值场景下两者性能接近,复杂操作 Redis 更优。 选择时需根据业务需求:追求简单高效的分布式缓存选 Memcached;需复杂数据结构或持久化选 Redis。 总之,Memcached 凭借轻量、高效、分布式的特点,成为早期 Web 应用缓存的重要选择,至今仍在部分场景中发挥作用。