Tomcat多實例部署及nginx+tomcat的負載均衡和動靜分離

Tomcat多實例部署

安裝?jdk、tomcat(流程可看之前博客)

配置 tomcat 環境變量

[root@localhost ~]# vim /etc/profile.d/tomcat.sh#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2[root@localhost ~]# source /etc/profile.d/tomcat.sh

修改 tomcat1 或 tomcat2 中的 server.xml 文件,要求各 tomcat 實例配置不能有重復的端口號

[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml#22行,修改Server prot,默認為8005 -> 修改為8006
<Server port="8006" shutdown="SHUTDOWN">#69行,修改Connector port,HTTP/1.1  默認為8080 -> 修改為8081
<Connector port="8081" protocol="HTTP/1.1"		#116行,修改Connector port AJP/1.3,默認為8009 -> 修改為8010
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	
第一個連接器默認監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。
第二個連接器默認監聽8009端口,負責和其他的HTTP服務器建立連接。
在把Tomcat與其他HTTP服務器集成時,需要用到這個連接器。第三個連接器
port="8010":指定AJP連接器監聽的端口號。在這個示例中,AJP連接器監聽在8010端口上。protocol="AJP/1.3":指定連接器所使用的協議。這里設置為AJP/1.3,表示使用AJP協議的版本1.3。redirectPort="8443":指定重定向端口。當AJP連接器接收到HTTP請求時,如果請求是通過HTTPS(加密)訪問的,
則會將請求重定向到8443端口。AJP連接器用于將靜態資源和動態請求從前端Web服務器(如Apache HTTP Server)轉發到Tomcat服務器。
這樣可以將Tomcat服務器隱藏在防火墻之后,提高安全性,同時提供更高的性能,特別是在處理動態請求時。
常見的AJP連接器配置是為了將Tomcat與Apache HTTP Server或Nginx等前端服務器集成,以實現負載均衡、反向代理等功能

修改各 tomcat 實例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 環境變量

[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/startup.sh ##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1[root@localhost ~]# vim /usr/local/tomcat/tomcat1/bin/shutdown.sh##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/startup.sh export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2[root@localhost ~]# vim /usr/local/tomcat/tomcat2/bin/shutdown.shexport CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

啟動/重啟各 tomcat 中的 /bin/startup.sh?

#啟動tomcat1
/usr/local/tomcat/tomcat1/bin/startup.sh #啟動tomcat2
/usr/local/tomcat/tomcat2/bin/startup.sh netstat -natp | grep java

瀏覽器訪問測試

nginx+tomcat實現動靜分離


靜:靜態頁面? ?動: 動態頁面

分別可以對靜態頁面和動態頁面發起不同的請求,會有不同的響應結果。

ngix反向代理——負均均衡——>tomcat為后端服務器——web靜態nginx——>靜態請求nginx——>動態頁面——>tomcat

Nginx實現負載均衡的原理

Nginx實現負載均衡是通過反向代理實現Nginx服務器作為前端,Tomcat服務器作為后端,web頁面請求由Nginx服務來進行轉發。 但不是把所有的web請求轉發,而是將靜態頁面請求Ncinx服務器自己來處理,動態頁面請求,轉發給后端的Tomcat服務器來處理。

Tomcat是屬于輕量級的應用服務器,可接受訪問量可能會不足,所以我們需要多臺Tomcat服務器。并且Tomcat并發量處理能力弱(約Nginx的六分之一),所以需要Nginx方向代理時,進行合理的調用分配


Nginx實現負載均衡的主要配置項?

upstream 服務池名 {   }
作用:配置后端服務器池,以提供響應數據proxy_pass http:// 服務池名
作用:配置將訪問請求轉發給后端服務器池的服務器處理

Nginx+Tomcat負載均衡的組合的優點

Nginx 靜態處理優勢:Nginx 處理靜態頁面的效率遠高于Tomcat的處理能力,Tomcat的請求量為1000次,Nginx 的請求量為6000次,Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M,Nginx處理靜態資源的能力是Tomcat 處理的6倍

動靜分離原理:服務端接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源由Nginx 提供服務,動態資源由Nginx轉發至后端。

Nginx+Tomcat實現負載均衡實例

部署nginx的負載器

#關閉防火墻和安全機制[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0#安裝必要組件
[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make注意要提前裝好epel源否則stream模塊的組件會無法裝載準備已經安裝好的nginx

基于之前tomcat的多實例已部署,在第三臺服務器上部署一個tomcat即可

搭建第三臺tomcat

#關閉防火墻和安全機制[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0#軟件包的方式安裝jdk環境和tomcat[root@localhost ~]# tar -zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/[root@localhost ~]# vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH[root@localhost ~]# source /etc/profile#tomcat安裝[root@localhost ~]# tar zxvf apache-tomcat-9.0.16.tar.gz[root@localhost ~]# mv /opt/apache-tomcat-9.0.16/ /usr/local/tomcat#重啟tomcat服務
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
#查看端口
[root@localhost ~]# netstat -ntap | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN     70787/java          

回到多實例服務器,配置動態頁面

#創建指定網頁存放目錄[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat1/webapps/test
[root@localhost ~]# mkdir -p /usr/local/tomcat/tomcat2/webapps/testTomcat1配置:[root@localhost ~]# vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("動態頁面1,test1 page!!!");%>
</body>
</html>[root@localhost ~]# vim /usr/local/tomcat/tomcat1/conf/server.xml  
#要把前面的host配置刪除
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
#重啟tomcat1	
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh Tomcat2的配置[root@localhost ~]# vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2  page</title>  
</head>
<body>
<% out.println("動態頁面2,test2 page!!!");%>
</body>
</html>[root@localhost ~]# vim /usr/local/tomcat/tomcat2/conf/server.xml
#要把前面的host配置刪除
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
#重啟tomcat2
/usr/local/tomcat/tomcat2/bin/shutdown.sh 
/usr/local/tomcat/tomcat2/bin/startup.sh

在準備好的nginx服務器上配置nginx負載均衡和動靜分離

[root@localhost ~]# vim /usr/local/nginx/html/index.html<html>
<body>
<h1> this is Nginx static test !</h2>
<img src="preview.jpg"/>
</body>
</html>[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置負載均衡的服務器列表,weight參數表示權重,權重越高,被分配到的概率越大upstream zh1 {server 20.0.0.100:8080 weight=1;            #多實例tomcat1server 20.0.0.100:8081 weight=1;            #多實例tomcat2server 20.0.0.32:8080 weight=1;}server {listen 80;server_name localhost;charset utf-8;#access_log logs/host.access.log main;#配置Nginx處理動態頁面請求,將 .jsp文件請求轉發到Tomcat 服務器處理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;#設置后端的Web服務器可以獲取遠程客戶端的真實IP#設定后端的Web服務器接收到的請求訪問的主機名(域名或IP、端口),默認HOST的值為proxy_pass指令設置的主機名。如果反向代理服務器不重寫該請求頭的話,那么后端真實服務器在處理時會認為所有的請求都來自反向代理服務器,如果后端有防攻擊策略的話,機器就被封了。proxy_set_header HOST $host;#把$remote_addr賦值給X-Real-IP,來獲取源IPproxy_set_header X-Real-IP $remote_addr;#在nginx 作為代理服務器時,設置的IP列表,會把經過的機器ip,代理機器ip都記錄下來proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}#配置Nginx處理靜態圖片請求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}location ~ .*\.jsp$ {proxy_pass http://zh1;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}

訪問測試

靜態頁面訪問

?靜態頁面請求訪問動態頁面

刷新一次后輪詢

刷新后輪詢

?

?

?

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

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

相關文章

Delphi調用WindowsAPI獲取窗口進程

Delphi有封裝的很好的WindowsAPI&#xff0c;直接調用即可&#xff0c;大體上和C差不多&#xff0c;有些地方需要額外處理。 給出一個實例&#xff1a; varg_process: THandle;procedure initGlobal(); beginvarg_handle: HWND;g_handle : FindWindow(clsName, name);if g_ha…

矩陣定理復習記錄

矩陣復習 矩陣導數定理 若A是一個如下矩陣&#xff1a; A [ a 11 a 12 a 21 a 22 ] A \begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix} A[a11?a21??a12?a22??] y是一個向量矩陣&#xff1a; y ? [ y 1 y 2 ] \vec{y}\begin{bmatrix}y_1\\y_2\e…

在vue項目使用數據可視化 echarts ,柱狀圖、折線圖、餅狀圖使用示例詳解及屬性詳解

官網地址&#xff1a;Apache ECharts ?一、下載插件并在頁面中引入 npm install echarts --save 頁面導入&#xff1a; import * as echarts from echarts 全局導入&#xff1a; main.js 中&#xff0c;導入并注冊到全局 import echarts from echarts Vue.prototype.$echart…

Clone函數

概述 Clone函數是一種用于復制的計算機函數。在程序編寫中&#xff0c;除了自定義一個拷貝構造函數來實現對象復制外&#xff0c;還可以實現一個clone函數。這需要借助編譯器實現的一個隱藏拷貝構造函數&#xff0c;這樣的做法&#xff0c;更省心。 中文名clone函數外文名clon…

C# 使用FFmpeg.Autogen對byte[]進行編解碼

C# 使用FFmpeg.Autogen對byte[]進行編解碼&#xff0c;參考&#xff1a;https://github.com/vanjoge/CSharpVideoDemo 入口調用類&#xff1a; using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

C++11異步與通信之 packaged_task

概念簡介 packaged_task 用于包裝可調用目標(Callable)為一個對象,如lambda&#xff0c;普通函數&#xff0c;小括號重載等&#xff0c;用于異步調用。 其返回值或所拋異常被存儲于能通過 std::future 對象訪問的共享狀態中&#xff0c;和promise類似。 將函數的調用與函數返…

時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比

時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比 目錄 時序預測 | MATLAB實現EEMD-LSTM、LSTM集合經驗模態分解結合長短期記憶神經網絡時間序列預測對比效果一覽基本介紹模型搭建程序設計參考資料 效果一覽 基本介紹 時序預測 | …

小龜帶你妙寫排序之快速排序

快速排序 一. 快速排序原理二. 題目三. 快速排序的思路分析&#xff08;圖文結合&#xff09;四.代碼 一. 快速排序原理 先從數據序列中選一個元素&#xff0c;并將序列中所有比該元素小的元素都放到它的右邊或左邊&#xff0c;再對左右兩邊分別用同樣的方法處之直到每一個待處…

runtime error: member access within misaligned address(力扣最常見錯誤之一)

runtime error: member access within misaligned address&#xff08;力扣最常見錯誤之一&#xff09; 前言原因和解決辦法總結 前言 最近博主在刷力扣時&#xff0c;明明代碼邏輯都沒問題&#xff0c;但總是報下面這個錯誤&#xff1a; runtime error: member access within…

django實現登錄和登錄的鑒權

1、創建數據庫的管理員表 在models.py 中定義admin表&#xff0c;為了簡單&#xff0c;表里只有用戶名和密碼還有默認加的id 三個字段 from django.db import models# Create your models here.class Admin(models.Model):username models.CharField(verbose_name"用戶…

源碼框架-三勾軟件

javaspringboot微信小程序商城SAAS前后端源碼: 三勾商城是開發友好的微信小程序商城&#xff0c;框架支持SAAS&#xff0c;支持發布 iOS Android 公眾號 H5 各種小程序&#xff08;微信/支付寶/百度/頭條/QQ/釘釘/淘寶&#xff09;等多個平臺&#xff0c;不可多得的二開神器…

訓練用于序列分類任務的 RoBERTa 模型的適配器

介紹 NLP當前的趨勢包括下載和微調具有數百萬甚至數十億參數的預訓練模型。然而,存儲和共享如此大的訓練模型非常耗時、緩慢且昂貴。這些限制阻礙了 RoBERTa 模型開發更多用途和適應性更強的 NLP 技術,該模型可以從多個任務中學習并針對多個任務進行學習;在本文中,我們將重…

Kafka:安裝和配置

producer&#xff1a;發布消息的對象&#xff0c;稱為消息產生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka將消息分門別類&#xff0c;每一個消息稱為一個主題&#xff08;topic&#xff09; consumer&#xff1a;訂閱消息并處理發布消息的對象…

模擬 枚舉

分享牛客算法基礎精選題單題目打卡!!! 目錄 字符串的展開 多項式輸出 機器翻譯 : 鋪地毯 : [NOIP2016]回文日期 字符串的展開 原題鏈接 : 字符串的展開 思路 : 模擬 代碼 : #include<iostream> #include<cstring> #include<algorithm> using na…

Java課題筆記~ ServletContext

單個Servlet的配置對象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…

centos自動同步北京時間

1、安裝ntpdate服務 yum -y install ntpdate 2、加入自動任務計劃 查找ntpdate的路徑&#xff1a; which ntpdate 復制這個路徑。 編輯自動任務計劃并加入ntpdate&#xff1a; crontab -e # 每小時第30分鐘同步AD域控時間 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …

DP——動態規劃

DP——動態規劃 動態規劃算法動態規劃的一般步驟特殊DP——背包0-1背包問題完全背包問題 總結 動態規劃算法 當涉及到解決具有重疊子問題的優化問題時&#xff0c;動態規劃是一種常用的算法技術。它通過將問題分解為一系列重疊子問題&#xff0c;并使用遞歸或迭代的方式來解決…

Spring Cloud Gateway系例—GatewayFilter 工廠

目錄 6.1.AddRequestHeader 6.2.AddRequestHeadersIfNotPresent 6.3.AddRequestParameter 6.4.AddResponseHeader 6.5.CircuitBreaker 6.5.1. 熔斷指定的狀態碼 6.6.CacheRequestBody 6.7.DedupeResponseHeader 6.8.FallbackHeaders 6.9.JsonToGrpc 6.10.LocalRespo…

TypeScript 非空斷言

TypeScript 非空斷言 發布于 2020-04-08 15:20:15 17.5K0 舉報 一、非空斷言有啥用 介紹非空斷言前&#xff0c;先來看個示例&#xff1a; function sayHello(name: string | undefined) {let sname: string name; // Error } 對于以上代碼&#xff0c;TypeScript 編譯器…

用戶端Web自動化測試-L1

目錄&#xff1a; Web自動化測試價值與體系環境安裝與使用自動化用例錄制自動化測試用例結構分析web瀏覽器控制常見控件定位方法強制等待與隱式等待常見控件交互方法自動化測試定位策略搜索功能自動化測試用戶端Web自動化測試 1.Web自動化測試價值與體系 功能測試場景: UI 自…