Nginx+Tomcat負載均衡、動靜分離實例詳細部署

一、反向代理兩種模式

四層反向代理

基于四層的ip+tcp/upd端口的代理
他是http塊同一級,一般配置在http塊上面。
他是需要用到stream模塊的,一般四層里面沒有自帶,需要編譯安裝一下。并在stream模塊里面添加upstream +服務器名稱,添加ip地址及端口號。定義server模塊,里面添加listen 監聽端口號,server_name 網站主機名,proxy_pass 服務器組名稱。stream{?     upstream fuwu服務器名稱{?          server IP1:PORT;?          server IP2:PORT;?          server IP3:PORT;?          ........?      }?      server{?          listen 監聽端口;?          server_name  網站主機名; ?          proxy_pass   服務器組名稱;?     }}

七層反向代理

基于七層的http/https/mail等應用協議的代理
他是在http模塊里面添加以upstream模塊,在upstream里面定義服務器組名稱,添加ip,端口號,權重(如果不添加的話,默認是1),可以在添加一個調度算法。并在http模塊里面添加server模塊,在里面用location來匹配URL路徑,定義proxy_pass http://服務器組名稱,用來將以。。。為結尾的請求轉發給tomcat服務器集群。并且后端服務器需要獲取真實的客戶端的ip地址。
http{?     upstream 服務器組名稱{?            server IP1:PORT [weight=1 ...];?            server IP2:PORT;?            ..........?          調度算法(rr輪詢/加權輪詢,least_conn最小連接,ip_hash,url_hash,faire);}?    server {?        location ~ ...{?            #將以***為結尾的請求轉發給tomcat服務器集群?             proxy_pass http://服務器組名稱;  ?           #用于后端服務器獲取真實的客戶端ip地址?            proxy_set_header HOST $host;?            proxy_set_header X-Real-IP $remote_addr;?            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;?          }?     }}

Nginx 負載均衡模式(調度算法)

●rr 輪詢 負載均衡模式:
每個請求按時間順序逐一分配到不同的后端服務器,如果超過了最大失敗次數后(max_fails,默認1),在失效時間內(fail_timeout,默認10秒),該節點失效權重變為0,超過失效時間后,則恢復正常,或者全部節點都為down后,那么將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。
?
●加權輪詢 WRR :
?
weight的值越大分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下。或者僅僅為在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。
?
●least_conn 最少連接:
優先將客戶端請求調度到當前連接最少的服務器。
?
●ip_hash 負載均衡模式:
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題,但是ip_hash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議采用ip_hash模式,session 共享問題可用后端服務的 session 共享代替 nginx 的 ip_hash(使用后端服務器自身通過相關機制保持session同步)。
?
●fair(第三方)負載均衡模式:
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
?
●url_hash(第三方)負載均衡模式:
基于用戶請求的uri做hash。和ip_hash算法類似,是對每個請求按url的hash結果分配,使每個URL定向到同一個后端服務器,但是也會造成分配不均的問題,這種模式后端服務器為緩存時比較好

nginx的會話保持

## 1.ip_hash,url_hash
基于ip緩存或者url路徑的緩存來進行的
ip_hash簡單易用,但有如下問題:
?
- 當后端服務器宕機后,session會丟失;
- 來自同一局域網的客戶端會被轉發到同一個后端服務器,可能導致負載失衡;
- 不適用于CDN網絡,不適用于前段還有代理的情況。
?
## 2.sticky_cookie_insert
基于客戶端的cookie緩存來進行
?
使用sticky_cookie_insert啟用會話親緣關系,這會導致來自同一客戶端的請求被傳遞到一組服務器在同一臺服務器。與ip_hash不同之處在于,它不是基于IP來判斷客戶端的,而是基于cookie來判斷。因此可以避免上述ip_hash中來自同一局域網的客戶端和前段代理導致負載失衡的情況。
?
說明:
?
- expires:設置瀏覽器中保持cookie的時間
- domain:定義cookie的域
- path:為cookie定義路徑
?
## 3.后端服務器做session共享,來實現會話保持

使用動靜分離的原因

nginx比較擅長處理靜態頁面,其效率是tomcat的6倍左右,但是nginx不善于處理動態頁面。 而tomcat 更擅長處理動態頁面。
靜態頁面內容相對穩定,容易被檢索,同時,由于用戶瀏覽是不需要經過程序的處理,所以瀏覽速度最快。但是,制作和維護工作量比較大。
當網站內容更新頻繁時訪問量非常大,內容變動頻繁時,就需要使用動態。但是動態頁面需要訪問數據庫,當訪問量非常大,對程序需要處理的數據量就非常大,容易造成網站不穩定甚至癱瘓
因此,我們需要使用動靜分離來管理網站。

為什么使用負載均衡

動態網站的頁面上的信息都必須從數據庫中讀取,每打開一個頁面就讀取數據庫一次,如果訪問網站的人數很多,這會對服務器增加很大的荷載,從而影響這個網站的運行速度。所以,我們可以利用負載均衡集群,降低服務器的負載。

正向代理和反向代理的區別

## 正向代理是一個`位于客戶端和目標服務器之間的服務器`,為了從目標服務器取得內容,客戶端向代理發送一個請求并指定目標服務器,然后代理向目標服務器轉交請求并將獲得的內容返回給客戶端。`代理服務器和客戶端處于同一個局域網內。比如說我要訪問谷歌,于是我就告訴它讓它幫我轉發。
?
## 反向代理實際運行方式是代理服務器接受網絡上的連接請求。它將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給網絡上請求連接的客戶端 。代理服務器和目標服務器處于同一個局域網內。比如說我要訪問taobao,對我來說不知道圖片、json、css 是不是同一個服務器返回回來的,但是我不關心,是反向代理 處理的,我不知道目標服務器。

二、實例部署?(七層反向代理和四層反向代理結合)

實驗準備(準備五臺虛擬機)

提前安裝nginx和tomcat

192.168.50.52? ?tomcat (兩個)
192.168.50.53? ?tomcat
192.168.50.56? ?七層反向代理(nginx)
192.168.50.58? ?七層反向代理(nginx)
192.168.50.57? ?四層反向代理(nginx)

?解壓安裝包

192.168.50.52cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2

?配置 tomcat 環境變量

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/tomcat2source /etc/profile.d/tomcat.sh

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

vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默認為8005 -> 修改為8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默認為8080 -> 修改為8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	
#116行,修改Connector port AJP/1.3,默認為8009 -> 修改為8010

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

vim /usr/local/tomcat/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat2/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

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

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

部署192.168.50.52的tomcat server?

mkdir /usr/local/tomcat/tomcat1/webapps/qinvim /usr/local/tomcat/tomcat1/webapps/qin/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title>   #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 1,mylove2);%>
</body>
</html>

?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/qin" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/tomcat1/bin/shutdown.sh?
/usr/local/tomcat/tomcat1/bin/startup.sh?

mkdir /usr/local/tomcat/tomcat2/webapps/fengvim /usr/local/tomcat/tomcat2/webapps/feng/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title>   #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 2,mylove3);%>
</body>
</html>

?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/feng" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/tomcat2/bin/shutdown.sh?
/usr/local/tomcat/tomcat2/bin/startup.sh??

?部署192.168.50.53的tomcat server?

mkdir /usr/local/tomcat/webapps/qin1vim /usr/local/tomcat/webapps/qin1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title>   #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 1,mylove);%>
</body>
</html>

??vim /usr/local/tomcat/conf/server.xml
#刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
?? ?<Context docBase="/usr/local/tomcat/webapps/qin1" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/bin/shutdown.sh?
/usr/local/tomcat/bin/startup.sh??

?部署192.168.50.56? ?七層反向代理Nginx server

#準備靜態頁面和靜態圖片
cd /usr/local/nginx/html
vim love.html
<html>    <body> <h1>this is nginx test web</h1><img src="love.jpg" /></body>    
</html>

 
vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置負載均衡的服務器列表,weight參數表示權重,權重越高,被分配到的概率越大upstream tomcat_server {server 192.168.50.53:8080 weight=1;server 192.168.50.52:8080 weight=1;server 192.168.50.52:8081 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 html;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}

?部署192.168.50.58? ?七層反向代理Nginx server

<html><body><h1>this is nginx test2 web</h1><img src="psc.jpg" /></body>
</html>

vim /usr/local/nginx/conf/nginx.confupstream tomcat_server {server 192.168.50.53:8080 weight=1;server 192.168.50.52:8080 weight=1;server 192.168.50.52:8081 weight=1;}server {listen       80;server_name  localhost;charset utf-8;#charset koi8-r;#access_log  logs/host.access.log  main;location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root html;expires 10d;}

??部署192.168.50.57? ?四層反向代理(nginx)

vim /usr/local/nginx/conf/nginx.confstream {upstream appserver {server 192.168.50.56:80;server 192.168.50.58:80;}server {listen 8080;proxy_pass appserver;}
}

瀏覽器訪問測試

http://192.168.50.52:8080


http://192.168.50.52:8081

?

http://192.168.50.57:8080/love.html

?刷新頁面

?http://192.168.50.57:8080/index.jsp

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

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

相關文章

kafka生產者冪等與事務

目錄 前言&#xff1a; 冪等 事務 總結&#xff1a; 參考資料 前言&#xff1a; Kafka 消息交付可靠性保障以及精確處理一次語義的實現。 所謂的消息交付可靠性保障&#xff0c;是指 Kafka 對 Producer 和 Consumer 要處理的消息提供什么樣的承諾。常見的承諾有以下三…

No view found for id 0x7f0901c3 for fragment解決以及線上bug排查技巧

情景再現 開發這么久&#xff0c;不知道你們是否也經歷過這樣的情況&#xff0c;測試或者用戶&#xff0c;反饋app閃退&#xff0c;結果你自己打開開發工具&#xff0c;去調試&#xff0c;一切正常&#xff0c;然后閃退還是存在&#xff0c;只是在開發環境中不能重現。這種情況…

boost下的asio異步高并發tcp服務器搭建

C 網絡編程 asio 使用總結 - 知乎 (zhihu.com) 基于Boost::asio的多線程異步TCP服務器&#xff0c;實現了io_service線程池&#xff0c;測試了1萬左右的并發訪問&#xff0c;讀寫無壓力_boost asio支持最大并發_E404的博客-CSDN博客 單線程 server.cpp #include <cstdlib&g…

【ARM 嵌入式 編譯系列 11.1 -- GCC __attribute__((aligned(x)))詳細介紹】

文章目錄 __attribute__((aligned(x)))詳細介紹其它對齊方式 上篇文章&#xff1a;ARM 嵌入式 編譯系列 11 – GCC attribute&#xff08;(packed)&#xff09;詳細介紹 attribute((aligned(x)))詳細介紹 __attribute__((aligned(x))) 是 GCC 編譯器的一個特性&#xff0c;它可…

SpringBoot代理訪問本地靜態資源400 404

SpringBoot代理訪問靜態資源400 404 背景&#xff1a;pdf文件上傳到linux服務器上&#xff0c;使用SpringBoot代理訪問問題&#xff1a;訪問過程中可能會出現400、404問題 前提&#xff1a;保證有文件&#xff0c;并且文件路徑正確 SpringBoot如何配置靜態資源代理&#xff0…

Flutter實現倒計時功能,秒數轉時分秒,然后倒計時

Flutter實現倒計時功能 發布時間&#xff1a;2023/05/12 本文實例為大家分享了Flutter實現倒計時功能的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 有一個需求&#xff0c;需要在頁面進行顯示倒計時&#xff0c;倒計時結束后&#xff0c;做相應的邏輯處理。 實…

Antd的日期選擇器中文化配置

當你使用antd的日期選擇器后&#xff0c;你會發現日期什么都是英文的&#xff1a;即便你已經在項目中配置了中文化&#xff1a; 我確實已經配置了中文化&#xff1a; 但是為啥沒生效&#xff1f;官網回答&#xff1a;FAQ - Ant Design dayjs中文網&#xff1a; 安裝 | Day…

零拷貝詳解

1、在沒有DMA技術之前的I/O過程是這樣的&#xff1a; CPU發出對應的指令給磁盤控制器&#xff0c;然后返回磁盤控制器收到指令后&#xff0c;于是就開始準備數據&#xff0c;會把數據放入到磁盤控制器的內部緩沖區&#xff0c;然后產生中斷CPU收到中斷信號后&#xff0c;停下手…

華為OD機試-5鍵鍵盤的輸出

題目描述 【5鍵鍵盤的輸出】有一個特殊的 5鍵鍵盤&#xff0c;上面有 a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五個鍵。 a鍵在屏幕上輸出一個字母 a; ctrl-c將當前選擇的字母復制到剪貼板; ctrl-x將當前選擇的 字母復制到剪貼板&#xff0c;并清空選擇的字母; ctrl-v將當前剪貼板里的字母…

HTML是什么?

HTML是什么&#xff1f; 超文本標記語言&#xff08;英語&#xff1a;HyperText Markup Language&#xff0c;簡稱&#xff1a;HTML&#xff09;是一種用于創建網頁的標準標記語言。 您可以使用 HTML 來建立自己的 WEB 站點&#xff0c;HTML 運行在瀏覽器上&#xff0c;由瀏覽器…

【業務功能篇63】Springboot聊聊 過濾器和攔截器

過濾器的場景&#xff1a;過濾器通常用于對數據或資源進行篩選、修改或轉換的場景。例如&#xff0c;在一個電子商務網站中&#xff0c;用戶進行商品搜索時&#xff0c;你可以使用過濾器來過濾特定的商品類別、價格范圍或其他條件&#xff0c;以便用戶僅看到符合篩選條件的結果…

人工智能時代的科學探索 | 《自然》評述

人工智能(AI)正越來越多地融入科學發現&#xff0c;以增強和加速研究&#xff0c;幫助科學家提出假設、設計實驗、收集和解釋大型數據集&#xff0c;并獲得僅靠傳統科學方法可能無法實現的洞察力。 過去十年間&#xff0c;AI取得了巨大的突破。其中就包括自監督學習和幾何深度學…

手機的發展歷史

目錄 一.人類的通信方式變化 二.手機對人類通信的影響 三.手機的發展過程 四.手機對現代人的影響 一.人類的通信方式變化 人類通信方式的變化是一個非常廣泛和復雜的話題&#xff0c;隨著技術的進步和社會的發展&#xff0c;人類通信方式發生了許多重大的變化。下面是一些主…

go mod使用最新提交依賴

例如一個項目在其中依賴了 github.com/linuxsuren/go-fake-runtime v0.0.1 go.mod內容&#xff1a; github.com/linuxsuren/go-fake-runtime v0.0.1 修改了github.com/linuxsuren/go-fake-runtime代碼&#xff0c;存在一個最新的commit hash值為25fa814c6232e545f5bce03bd…

【opencv】指定寬或高按比例縮放圖片 拼接圖片

指定寬或高按比例縮放圖片 import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 獲得高度和寬度if width is None and height is None: # 如果輸入的寬度和高度都為空return image # 直接返回原圖…

應用程序運行報錯:First section must be [net] or [network]:No such file or directory

應用程序報錯環境&#xff1a; 在linux下&#xff0c;調用darknet訓練的模型&#xff0c;報錯&#xff1a;First section must be [net] or [network]:No such file or directory&#xff0c;并提示&#xff1a;"./src/utils.c:256: error: Assertion 0 failed." 如…

百日筑基篇——Pandas學習三(pyhton入門八)

百日筑基篇——Pandas學習三&#xff08;pyhton入門八&#xff09; 文章目錄 前言一、數據排序二、字符串處理三、數據合并方法1. merge方法2. concat方法 四、分組數據統計五、數據重塑1. stack2. pivot 總結 前言 上一篇文章介紹了一下pandas庫中的一些函數&#xff0c;而本…

MySQL數據類型

文章目錄 MySQL數據類型1. 數據類型分類2. 數值類型2.1 tinyint類型2.2 bit類型2.3 小數類型2.3.1 float2.3.2 decimal 2.4 字符串類型2.4.1 char2.4.2 varchar2.4.3 char和varchar比較 2.5 日期和時間類型2.6 enum和set MySQL數據類型 1. 數據類型分類 紅色標注是我主要講解…

【QT】 QFileQFileInfo文件操作

很高興在雪易的CSDN遇見你 &#xff0c;給你糖糖 歡迎大家加入雪易社區-CSDN社區云 前言 本文分享QT對文件的操作技術&#xff0c;希望對各位小伙伴有所幫助&#xff01; 感謝各位小伙伴的點贊關注&#xff0c;小易會繼續努力分享&#xff0c;一起進步&#xff01; 你的點…

linux中profile.d和profile的區別

profile.d在profile中加載 profile文件 PATH"/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/scripts:/soc/bin:/soc/scripts" LD_LIBRARY_PATH"/usr/local/lib:/usr/lib:/opt/lib:/soc/lib" export SSL_LDPATH/usr/local/lib/ export ZLIB_LDPATH/usr/lo…