Nginx+tomcat集群

Nginx+tomcat集群

一、Nginx 簡介

1.1 定義

Nginx 是一個高性能的 HTTP 和反向代理 web 服務器,同時支持 IMAP/POP3/SMTP 服務。由俄羅斯工程師伊戈爾?賽索耶夫開發,于 2004 年首次公開發布,基于 BSD-like 協議,代碼開源且免費使用 。

1.2 核心功能

  • 反向代理:作為反向代理服務器,接收客戶端請求,轉發至后端 Tomcat 服務器集群,并將響應返回客戶端,隱藏后端服務器真實 IP,提升安全性。

  • 負載均衡:后端存在多臺服務器時,依據輪詢、加權輪詢、IP 哈希等算法,將請求均勻分配,避免單臺服務器負載過高,增強系統性能與可用性。

  • 靜態資源處理:高效處理 HTML、CSS、JavaScript、圖片等靜態資源,直接返回客戶端,減輕后端服務器壓力。

  • 緩存:支持靜態資源與動態內容緩存,緩存命中時直接返回,降低后端處理壓力,加快響應速度。

  • 高并發處理:采用異步非阻塞的事件驅動架構,能在低資源消耗下支持大量并發連接,從容應對高流量場景。

1.3 應用場景

常用于 Web 服務器、反向代理服務器、負載均衡器,廣泛應用于高并發網站、API 網關、微服務架構。如電商大促時,保障大量用戶請求的穩定處理 。

二、Tomcat 簡介

2.1 定義

Tomcat 是 Apache 軟件基金會 Jakarta 項目的核心,由 Apache、Sun 等多方共同開發,是免費開源的 Web 應用服務器,屬于輕量級服務器,適用于中小型系統及并發用戶較少的場景,是開發調試 JSP 程序的首選。

2.2 核心功能

  • Servlet 容器:實現 Servlet 規范,運行 Java 編寫的 Servlet 程序,處理客戶端請求并生成動態響應。

  • JSP 引擎:支持 JSP 技術,將嵌入 HTML 的 Java 代碼編譯成 Servlet 執行,生成動態網頁。

  • Web 應用部署:支持將 Web 應用打包為 WAR 文件,部署后自動解壓運行。

  • 會話管理:跟蹤用戶在 Web 應用中的會話狀態,如保存登錄信息、購物車內容,實現用戶個性化功能。

2.3 應用場景

主要用于運行基于 Java 的 Web 應用程序,如企業級 Web 應用、Java Web 開發測試環境。常見于企業內部管理系統、在線教育平臺后端服務。

三、Nginx+Tomcat 集群的作用

3.1 提升系統性能和可用性

Nginx 通過負載均衡將請求分配到多臺 Tomcat 服務器,充分利用資源,防止單臺服務器性能下降或崩潰。部分 Tomcat 故障時,Nginx 將請求轉發至正常服務器,保障系統可用。

3.2 實現高并發處理

Nginx 的高并發處理能力與 Tomcat 的動態內容處理能力結合,應對大規模并發請求。Nginx 處理靜態資源請求與分發動態請求,Tomcat 處理動態業務邏輯,提升高并發場景下的響應與處理能力。

3.3 便于系統擴展和維護

業務增長時,可輕松添加 Tomcat 服務器到集群,Nginx 自動分配請求。維護、升級單臺 Tomcat 時,將其從負載均衡列表移除,不影響系統運行,降低維護難度與風險。

四、Nginx+Tomcat 集群配置示例

環境準備

  • 安裝 Nginx:根據操作系統,使用包管理器(如 Linux 系統的 apt、yum)安裝。

  • 安裝 Tomcat:下載 Tomcat 安裝包,解壓到指定目錄,配置 Java 環境變量,啟動測試。

主機描述
192.168.10.101tomcat
192.168.10.102tomcat
192.168.10.103nginx
同網段客戶端

tomcat安裝和使用

Tomcat 是基于 Java 語言開發的 Web 應用服務器,它的運行和功能實現高度依賴 Java 環境,所以安裝 Tomcat 前必須先安裝 Java

###在兩臺tomcat主機上操作
[root@tomcat ~]# dnf -y install java
###把我們的tomcat文件上傳到主機上進行解壓縮
[root@tomcat ~]# ls
anaconda-ks.cfg   apache-tomcat-9.0.8.tar.gz
[root@tomcat ~]# tar xf apache-tomcat-9.0.8
[root@tomcat ~]# mv apache-tomcat-9.0.8   /usr/local/tomcat ###將tomcat移動到/usr/local/tomcat下
[root@tomcat ~]# cd /usr/local/tomcat/
[root@tomcat tomcat]# ls
bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work
Tomcat 目錄結構及功能解析
一、核心執行目錄:bin
  • 功能:存放 Tomcat 的可執行腳本和批處理文件
  • 關鍵文件
    • startup.sh(Linux/Mac)/ startup.bat(Windows):啟動 Tomcat 服務
    • shutdown.sh(Linux/Mac)/ shutdown.bat(Windows):關閉 Tomcat 服務
    • catalina.sh:核心腳本,封裝 Tomcat 啟動、停止的底層邏輯
    • version.sh:查看 Tomcat 版本信息
    • configtest.sh:驗證配置文件是否正確
二、配置文件目錄:conf
  • 功能:存放 Tomcat 的核心配置文件,決定服務器運行行為
  • 關鍵文件
    • server.xml:Tomcat 主配置文件,定義服務器組件(如 Connector、Service、Engine)、端口號、虛擬主機等
    • web.xml:全局 Web 應用配置文件,定義 MIME 類型、會話超時、安全約束等標準配置
    • tomcat-users.xml:用戶認證配置文件,定義管理后臺的用戶名、密碼和角色權限
    • context.xml:全局上下文配置文件,定義數據源(DataSource)、資源鏈接等
    • server-status.xml:狀態監控配置(部分版本存在)
    • logging.properties:日志配置文件,定義日志級別、輸出格式和存儲位置
三、依賴庫目錄:lib
  • 功能:存放 Tomcat 運行所需的核心 jar 包及依賴庫
  • 關鍵文件
    • catalina.jar:Tomcat 核心框架,包含服務器啟動和組件管理的類
    • tomcat-coyote.jar:實現 HTTP 通信協議的組件
    • tomcat-jasper.jar:JSP 引擎,負責將 JSP 編譯為 Servlet
    • servlet-api.jar:Servlet 規范接口定義(Tomcat 10 + 為 jakarta.servlet-api.jar)
    • el-api.jar:表達式語言(EL)接口定義
    • jasper-el.jar:JSP 表達式語言實現
    • 其他依賴:如日志庫(log4j、juli)、JDBC 驅動等
四、許可證與說明文件
  • LICENSE:Tomcat 開源許可證(Apache License 2.0)
  • NOTICE:版權聲明和貢獻者信息
  • RELEASE-NOTES:版本更新說明,記錄各版本新增功能和修復內容
  • RUNNING.txt:快速啟動指南,包含基本啟動命令和常見問題提示
五、運行時數據目錄:logs
  • 功能:存放 Tomcat 運行時產生的日志文件
  • 關鍵文件
    • catalina.out(Linux/Mac)/ catalina.log(Windows):主日志文件,記錄服務器啟動、錯誤和運行狀態
    • localhost_access_log.*.txt:HTTP 訪問日志,記錄客戶端請求的 URL、IP、響應狀態等
    • manager.log:管理后臺操作日志
    • host-manager.log:主機管理后臺操作日志
    • stderr.log:標準錯誤輸出日志
    • stdout.log:標準輸出日志
六、臨時文件目錄:temp
  • 功能:存放 Tomcat 運行時產生的臨時文件
  • 特點
    • 內容可定期清理,不影響服務器運行
    • 包含 JSP 編譯臨時文件、緩存數據等
七、Web 應用部署目錄:webapps
  • 功能:存放部署的 Web 應用程序
  • 使用方式
    • 直接放置 WAR 包(如app.war),Tomcat 啟動時自動解壓
    • 放置解壓后的應用目錄(如app/WEB-INF/結構)
  • 默認應用
    • docs/:Tomcat 官方文檔
    • examples/:Web 應用示例(包含 Servlet、JSP 演示)
    • host-manager/:主機管理后臺(需配置權限)
    • manager/:應用管理后臺(需配置權限)
    • ROOT/:默認根應用(訪問域名時直接指向此應用)
八、工作目錄:work
  • 功能:存放 Tomcat 運行時生成的編譯文件和緩存數據

  • 關鍵內容

    • Catalina/
      

      :存儲與虛擬主機相關的編譯結果

      • localhost/:存放localhost主機的 JSP 編譯后的 Servlet 類
      • 其他虛擬主機目錄(如根據server.xml配置生成)
    • JSP 編譯文件:如HelloWorld_jsp.class,由 JSP 動態編譯生成

    • 緩存數據:如 Session 序列化數據(若啟用分布式會話)

啟動tomcat
[root@tomcat2 bin]# . startup.sh    ###啟動tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# curl -I 192.168.10.102:8080    ###curl方式訪問并返回狀態碼200為ok 可以使用windows頁面訪問看的更加直觀
HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 07 Apr 2025 07:33:47 GMT
搭建自己的web

在兩臺tomcat上操在

[root@tomcat1 ~]# mkdir -p /web/webapp1
[root@tomcat1 ~]# cd /web/webapp1/
[root@tomcat1 webapp1]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>JSP test1 page</title>
</head>
<body><% out.println("動態頁面 1,http://www.test2.com");%>
</body>
<body><div>動態頁面的圖片 1</div><br>< img src="logo.png">   ####這個會在nginx上顯示這個圖片并沒有放在tomcat服務上
</body>
</html>
[root@tomcat1 webapp1]# /usr/local/tomcat/bin/startup.sh 
編輯tomcat的配置文件
root@tomcat1 webapp1]# vim /usr/local/tomcat/conf/server.xml  ###在150行找到這行添加我們自己的網站<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/webapp1"  path="" />
###重啟服務
客戶端訪問兩臺tomcat
root@localhost ~]# curl -I 192.168.10.101:8080
HTTP/1.1 200 
Set-Cookie: JSESSIONID=4381D25585CEEDCE4C9C2335E13BA6C0; Path=/; HttpOnly
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 07 Apr 2025 08:19:01 GMT
配置nginx反向代理負載均衡動靜分離
[root@nginx ~]# dnf -y install gcc pcre-devel zlib-devel
###安裝依賴環境
[root@nginx ~]# tar xf nginx-1.26.3.tar.gz   ###解壓縮安裝包
[root@nginx nginx-1.26.3]# ./configure --   prefix=/usr/local/nginx/  --user=nginx --group=nginx
[root@nginx sbin]# useradd -M -s  /sbin/nologin  nginx
[root@nginx sbin]# vim /usr/local/nginx/conf/nginx.conf
# 定義 Tomcat 服務器集群,名為 my_tomcat
upstream my_tomcat {# 第一臺后端服務器,權重為 1(接收 1/3 的請求)server 192.168.10.101:8080 weight=1;# 第二臺后端服務器,權重為 2(接收 2/3 的請求)server 192.168.10.102:8080 weight=2;# 默認負載均衡算法為輪詢(round-robin),結合權重按比例分發請求
}# 虛擬主機配置,監聽 80 端口
server {listen       80;server_name  localhost;  # 響應的域名,此處為本地測試charset utf-8;  # 設置響應字符集為 UTF-8,防止中文亂碼# 根路徑請求處理(靜態文件)location / {root   html;  # 靜態文件根目錄(相對于 Nginx 安裝路徑)index  index.html index.htm;  # 默認索引文件列表}# 正則匹配所有 .jsp 結尾的請求(動態請求)location ~ .*\.jsp$ {# 設置代理請求的 Host 頭為原始請求的主機名proxy_set_header HOST $host;# 將請求轉發到上游 Tomcat 集群proxy_pass  http://my_tomcat;# 缺少的關鍵配置(建議添加):# proxy_set_header X-Real-IP $remote_addr;  # 傳遞客戶端真實 IP# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 保留完整的客戶端 IP 鏈# proxy_set_header X-Forwarded-Proto $scheme;  # 傳遞原始請求協議(HTTP/HTTPS)# proxy_connect_timeout 30s;  # 連接超時時間# proxy_read_timeout 60s;  # 讀取響應超時時間}
}

客戶端訪問nginx

[root@localhost ~]# curl -I 192.168.10.103/index.jsp
HTTP/1.1 200 
Server: nginx/1.26.3
Date: Mon, 07 Apr 2025 11:15:35 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive

在這里插入圖片描述

優化日志可以看到真實客戶端的ip

我們查看tomcat的訪問日志是看不到真實客戶端的ip地址因為都是通過nginx代理客戶端訪問tomcat我們需要修改nginx配置把真實客戶端的ip地址返還給tomcat

查看tomcat訪問日志

[root@tomcat1 logs]# cat localhost_access_log.2025-04-07.txt 
192.168.10.103 - - [07/Apr/2025:19:14:52 +0800] "GET /index.jsp HTTP/1.0" 200 208
192.168.10.103 - - [07/Apr/2025:19:14:52 +0800] "GET /index.jsp HTTP/1.0" 200 208
192.168.10.103 - - [07/Apr/2025:19:14:52 +0800] "GET /index.jsp HTTP/1.0" 200 208
編輯nginx配置文件
[root@nginx logs]# vim /usr/local/nginx/conf/nginx.conf# 匹配所有以.jsp結尾的請求
location ~ .*\.jsp$ {# 設置請求頭HOST為原始請求的域名,確保后端應用獲取正確的主機信息proxy_set_header HOST $host;# 兼容舊系統,設置客戶端IPproxy_set_header Client-IP $remote_addr;# 設置真實客戶端IP,常用于日志記錄和訪問控制proxy_set_header X-Real-IP $remote_addr;# 傳遞客戶端真實IP及經過的代理服務器IP列表,格式為"客戶端IP, 代理1IP, 代理2IP..."proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;# 將請求轉發到名為my_tomcat的上游服務器組(通常是Tomcat應用服務器)proxy_pass  http://my_tomcat;
}
編輯tomcat配置文件
[root@tomcat1 logs]# vim /usr/local/tomcat/conf/server.xml <!-- 配置Tomcat訪問日志記錄 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"              <!-- 日志文件存儲目錄(相對于CATALINA_BASE) -->prefix="localhost_access_log" <!-- 日志文件名前綴 -->suffix=".txt"                 <!-- 日志文件名后綴 -->pattern="%{X-Real-IP}i %h %l %u %t &quot;%r&quot; %s %b" /><!-- 日志格式模式:%{X-Real-IP}i  - 記錄X-Real-IP請求頭(即客戶端真實IP,通過Nginx傳遞)%h            - 遠程主機名(或IP,如果DNS查找被禁用)%l            - 遠程邏輯用戶名(始終為'-',因為未實現)%u            - 認證后的遠程用戶(未認證則為'-')%t            - 請求時間(格式:[日期時間]&quot;%r&quot; - 請求的第一行(包含方法、URI和協議)%s            - HTTP狀態碼%b            - 響應字節數(不包含頭部) -->

客戶端再次訪問nginx

[root@localhost ~]# curl -I 192.168.10.103/index.jsp
HTTP/1.1 200 
Server: nginx/1.26.3
Date: Mon, 07 Apr 2025 12:13:38 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Set-Cookie: JSESSIONID=C3004E3F6925E4C2A3C4F43BE2818682; Path=/; HttpOnly

查看tomcat日志

[root@tomcat1 logs]# cat localhost_access_log.2025-04-07.txt xxxxxxxxxx [root@tomcat1 logs]# cat localhost_access_log.2025-04-07.txt
192.168.10.104 192.168.10.103 - - [07/Apr/2025:19:28:26 +0800] "HEAD /index.jsp HTTP/1.0" 200 -
192.168.10.104 192.168.10.103 - - [07/Apr/2025:19:28:27 +0800] "HEAD /index.jsp HTTP/1.0" 200 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87851.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87851.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87851.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RPC - 客戶端注冊和發現模塊

registryMethod 函數詳解&#xff1a; 函數目的 registryMethod 是 Provider 類的核心方法&#xff0c;用于向服務注冊中心注冊服務。注冊成功后&#xff0c;服務注冊中心會更新內部的服務映射表&#xff0c;建立服務名稱到提供者地址的映射關系。 執行流程示例 場景: 多米…

leetcode332.重新安排行程:優先隊列與DFS實現歐拉路徑的行程規劃

一、題目深度解析與行程規劃本質 題目描述 給定一個機票的字符串二維數組 tickets&#xff0c;每個元素是 [from, to] 的形式&#xff0c;表示從 from 到 to 的機票。要求找出從 JFK 出發的行程&#xff0c;且必須使用所有機票&#xff0c;若存在多種可能的行程&#xff0c;返…

1.21SQLCipher 簡介

SQLCipher 是一個基于 SQLite 的擴展&#xff0c;提供了透明的數據庫加密功能。與普通 SQLite 不同&#xff0c;SQLCipher 在數據寫入磁盤前自動加密&#xff0c;讀取時自動解密&#xff0c;無需開發者手動處理加密邏輯。這使得它非常適合移動應用、桌面應用等需要本地數據加密…

無人機不再“盲飛”!用Python搞定實時目標識別與跟蹤

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Vue-7-前端框架Vue之應用基礎從Vue2語法到Vue3語法的演變

文章目錄 1 基于vite創建1.1 對比webpack和vite1.2 創建工程1.3 啟動項目2 調試工具Vue.js Devtools3 src結構3.1 index.html3.2 main.ts3.3 App.vue(根組件)4 示例(Vue2的語法)4.1 Person.vue4.2 App.vue4.3 選項式API對比組合式API4.4 程序流程5 示例(Vue3的語法)5.1 setup概…

上線iOSApp前抓包工具協作保障接口行為一致性(iOS抓包)

項目上線前&#xff0c;你是否總會擔心“接口是不是在某個邊緣條件下表現不一致”&#xff1f;哪怕單元測試通過、接口文檔齊全&#xff0c;真到線上用戶手上&#xff0c;總還是可能出現一些環境相關的異常。 最近參與某App大版本上線前的質量驗證流程&#xff0c;我們特別安排…

Java可變參數:靈活編程的秘密武器

Java可變參數的理解與應用 Java中的可變參數&#xff08;Varargs&#xff09;允許方法接受數量不定的同類型參數&#xff0c;簡化了方法調用時的參數傳遞。可變參數通過在參數類型后添加...實現&#xff0c;本質上是一個數組&#xff0c;但在調用時可以傳入多個單獨的參數。 …

汽車 CDC威脅分析與風險評估

汽車 CDC&#xff08;連續阻尼控制系統&#xff09;的威脅分析與風險評估需結合其技術特性、應用場景及行業標準展開。以下是詳細解析及實例說明&#xff1a; 一、CDC 系統技術原理與結構 CDC&#xff08;Continuous Damping Control&#xff09;通過實時調節懸掛阻尼力提升駕…

TensorFlow 安裝與 GPU 驅動兼容(h800)

環境說明TensorFlow 安裝與 GPU 驅動兼容CUDA/H800 特殊注意事項PyCharm 和終端環境變量設置方法測試 GPU 是否可用的 Python 腳本 # 使用 TensorFlow 2.13 在 NVIDIA H800 上啟用 GPU 加速完整指南在使用 TensorFlow 進行深度學習訓練時&#xff0c;充分利用 GPU 能力至關重要…

Laravel 項目中圖片上傳后無法訪問的問題

情況&#xff1a; Laravel 提供了 php artisan storage:link 命令&#xff0c;用于創建符號鏈接&#xff08;Symbolic Link&#xff09;&#xff0c;將 storage/app/public 映射到 public/storage。但是上傳圖片之后 文件目錄確實有 但是無法訪問。 1. 刪除已經創建的 rm -rf…

Tesollo攜人形機器人手進軍國內市場

Tesollo靈巧手是Tesollo公司研發的一系列機器人靈巧手產品&#xff0c;涵蓋兩指到五指的設計 產品型號與特點 Delto-5F五指靈巧手&#xff1a;具備20個自由度&#xff0c;每個手指配備4個獨立關節&#xff0c;抓握力達到7公斤&#xff0c;每個關節空載可達75轉/分鐘&#xff0…

Python文件操作的“保險箱”:with語句深度實戰指南

目錄 一、with語句的底層運作原理 資源獲取階段 資源釋放階段 二、文件操作實戰場景解析 場景1:基礎文件讀寫 場景2:異常處理進階 場景3:復合資源管理 三、自定義上下文管理器 四、with語句的性能考量 五、實戰經驗總結 在Python編程中,文件操作是日常開發的高頻…

openKylin高校沙龍 | 走進成都高校,推動開源技術交流與人才培養

openKylin高校沙龍 | 成都高校 4月25日&#xff0c;CCF開源發展委員會“開源高校行”暨紅山開源openKylin高校行成都站圓滿舉辦&#xff0c;這場連接兩所大學的開源知識盛會&#xff0c;為成都信息工程大學與電子科技大學的300余名與會師生帶來了前沿的行業思考與技術實踐。Op…

即夢3.0更新后市面上的的評價如何?

設計師緊握數位板縮在墻角&#xff0c;全息投影中的AI正在生成同風格設計圖&#xff0c;地面倒影顯示“人類設計師生涯倒計時”。當最新一代AI繪圖工具悄然開啟測試時&#xff0c;設計圈陷入集體震動——有人驚嘆“以后還干XX&#xff0c;都回家賣煎餅吧”&#xff0c;也有人徹…

haproxy搭建nginx網站訪問

文章目錄 一.案例概述2.1 HTTP請求2.2 負載均衡常用調度算法①RR&#xff08;Round robin&#xff09;②LC&#xff08;least connections&#xff09;③SH&#xff08;source hashing&#xff09; 2.3 常見的web群集調度器3.實驗環境 二.實驗步驟1.兩臺web網站步驟相同 安裝we…

進程間通信之socketpair

進程間通信之socketpair 源代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h>int main() {//父子通訊管道int m_pipe[2];//創建管道if(socketpa…

跟著AI學習C# Day29

&#x1f4c5; Day 29&#xff1a;C# 綜合進階知識回顧與職業發展建議 ? 學習目標&#xff1a; 回顧 C# 進階學習路徑&#xff1b;總結核心知識點&#xff0c;構建完整的技能體系&#xff1b;理解 C# 高級開發者應具備的核心能力&#xff1b;探索 C# 在不同技術領域的應用場…

茶席布置實訓室:傳承與創新的茶文化空間

一、茶席布置實訓室的重要意義 茶席布置實訓室是茶文化傳承與創新的重要載體。在現代社會&#xff0c;茶文化的弘揚不僅是對傳統的尊重&#xff0c;更是對生活品質和精神境界的追求。茶席布置實訓室為人們提供了一個專業、系統地學習和實踐茶文化的場所。它將理論知識與實際操…

jar is missing

在父POM中通過dependencyManagement統一管理版本&#xff0c;然后在子模塊中省略版本號。

Linux 內核中 TCP 協議棧的輸出實現:tcp_output.c 文件解析

在網絡通信領域,TCP(傳輸控制協議)作為核心的傳輸層協議,確保了數據在網絡中的可靠傳輸。Linux 內核中的 TCP 協議棧實現復雜而高效,其中 net/ipv4/tcp_output.c 文件是整個 TCP 協議棧的關鍵組成部分,負責處理數據包的發送、重傳、連接管理等核心功能。本文將深入解析該…