Nginx從入門到Spring Boot負載均衡配置實戰

目錄

1 Nginx簡介

2 相關概念

2.1 簡單請求和非簡單請求

2.2 跨域

2.3 正向代理和反向代理

2.4 負載均衡

2.5 動靜分離

3 環境準備

3.1 安裝gcc

3.2 安裝openssl

3.3 安裝pcre

3.4 安裝zlib

4 安裝nginx

5 負載均衡配置

5.1 準備工作

5.2 配置示例

5.3 實現效果

5.4 nginx分配服務器策略

6 結束語


1 Nginx簡介

傳統的 Web 服務器,每個客戶端連接作爲一個單獨的進程或線程處理,需在切換任務時將 CPU 切換到新的任務並創建一個新的運行時上下文,消耗額外的內存和 CPU 時間,當併發請求增加時,服務器響應變慢,從而對性能產生負面影響。

Nginx 是開源、高性能、高可靠的 Web 和反向代理服務器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啓動,還能在不間斷服務的情況下對軟件版本進行熱更新。性能是 Nginx 最重要的考量,其佔用內存少、併發能力強、能支持高達 5w 個併發連接數,最重要的是,Nginx 是免費的並可以商業化,配置使用也比較簡單。

Nginx 的最重要的幾個使用場景:

  1. 靜態資源服務,通過本地文件系統提供服務;

  2. 反向代理服務,延伸出包括緩存、負載均衡等;

  3. API 服務,OpenResty ;

2 相關概念

2.1 簡單請求和非簡單請求

首先我們來了解一下簡單請求和非簡單請求,如果同時滿足下面兩個條件,就屬於簡單請求:

  1. 請求方法是 HEADGETPOST 三種之一;

  2. HTTP 頭信息不超過右邊着幾個字段:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type 只限於三個值 application/x-www-form-urlencodedmultipart/form-datatext/plain

凡是不同時滿足這兩個條件的,都屬於非簡單請求。

瀏覽器處理簡單請求和非簡單請求的方式不一樣:

簡單請求

對於簡單請求,瀏覽器會在頭信息中增加 Origin 字段後直接發出,Origin 字段用來說明,本次請求來自的哪個源(協議+域名+端口)。

如果服務器發現 Origin 指定的源不在許可範圍內,服務器會返回一個正常的 HTTP 迴應,瀏覽器取到迴應之後發現迴應的頭信息中沒有包含 Access-Control-Allow-Origin 字段,就拋出一個錯誤給 XHR 的 error 事件;

如果服務器發現 Origin 指定的域名在許可範圍內,服務器返回的響應會多出幾個 Access-Control- 開頭的頭信息字段。

非簡單請求

非簡單請求是那種對服務器有特殊要求的請求,比如請求方法是 PUT 或 DELETE,或 Content-Type 值爲 application/json。瀏覽器會在正式通信之前,發送一次 HTTP 預檢 OPTIONS 請求,先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些 HTTP 請求方法和頭信息字段。只有得到肯定答覆,瀏覽器纔會發出正式的 XHR 請求,否則報錯。

2.2 跨域

在瀏覽器上當前訪問的網站向另一個網站發送請求獲取數據的過程就是跨域請求。

跨域是瀏覽器的同源策略決定的,是一個重要的瀏覽器安全策略,用於限制一個 origin 的文檔或者它加載的腳本與另一個源的資源進行交互,它能夠幫助阻隔惡意文檔,減少可能被攻擊的媒介,可以使用 CORS 配置解除這個限制。

關於跨域網上已經有很多解釋,這裏就不囉嗦,也可以直接看 MDN 的 <瀏覽器的同源策略> 文檔進一步瞭解,這裏就列舉幾個同源和不同元的例子,相信程序員都能看得懂。

# 同源的例子
http://example.com/app1/index.html  # 只是路徑不同
http://example.com/app2/index.html

http://Example.com:80  # 只是大小寫差異
http://example.com

# 不同源的例子
http://example.com/app1   # 協議不同
https://example.com/app2

http://example.com        # host 不同
http://www.example.com
http://myapp.example.com

http://example.com        # 端口不同
http://example.com:8080

2.3 正向代理和反向代理

反向代理(Reverse Proxy)對應的是正向代理(Forward Proxy),他們的區別:

正向代理: 一般的訪問流程是客戶端直接向目標服務器發送請求並獲取內容,使用正向代理後,客戶端改爲向代理服務器發送請求,並指定目標服務器(原始服務器),然後由代理服務器和原始服務器通信,轉交請求並獲得的內容,再返回給客戶端。正向代理隱藏了真實的客戶端,爲客戶端收發請求,使真實客戶端對服務器不可見;

例如:你的瀏覽器無法直接訪問谷哥,這時候可以通過一個代理服務器來幫助你訪問谷哥,那麼這個服務器就叫正向代理。

反向代理: 與一般訪問流程相比,使用反向代理後,直接收到請求的服務器是代理服務器,然後將請求轉發給內部網絡上真正進行處理的服務器,得到的結果返回給客戶端。反向代理隱藏了真實的服務器,爲服務器收發請求,使真實服務器對客戶端不可見。一般在處理跨域請求的時候比較常用。現在基本上所有的大型網站都設置了反向代理。

例如:去飯店喫飯,可以點川菜、粵菜、江浙菜,飯店也分別有三個菜系的廚師 👨‍🍳,但是你作爲顧客不用管哪個廚師給你做的菜,只用點菜即可,小二將你菜單中的菜分配給不同的廚師來具體處理,那麼這個小二就是反向代理服務器。

簡單的說,一般給客戶端做代理的都是正向代理,給服務器做代理的就是反向代理。

正向代理和反向代理主要的原理區別可以參見下圖:

2.4 負載均衡

一般情況下,客戶端發送多個請求到服務器,服務器處理請求,其中一部分可能要操作一些資源比如數據庫、靜態資源等,服務器處理完畢後,再將結果返回給客戶端。

這種模式對於早期的系統來說,功能要求不復雜,且併發請求相對較少的情況下還能勝任,成本也低。隨着信息數量不斷增長,訪問量和數據量飛速增長,以及系統業務複雜度持續增加,這種做法已無法滿足要求,併發量特別大時,服務器容易崩。

很明顯這是由於服務器性能的瓶頸造成的問題,除了堆機器之外,最重要的做法就是負載均衡。

請求爆發式增長的情況下,單個機器性能再強勁也無法滿足要求了,這個時候集羣的概念產生了,單個服務器解決不了的問題,可以使用多個服務器,然後將請求分發到各個服務器上,將負載分發到不同的服務器,這就是負載均衡,核心是「分攤壓力」。Nginx 實現負載均衡,一般來說指的是將請求轉發給服務器集羣。

例如:晚高峯乘坐地鐵的時候,入站口經常會有地鐵工作人員大喇叭“請走 B 口,B 口人少車空....”,這個工作人員的作用就是負載均衡。

2.5 動靜分離

爲了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度,降低原來單個服務器的壓力。

一般來說,都需要將動態資源和靜態資源分開,由於 Nginx 的高併發和靜態資源緩存等特性,經常將靜態資源部署在 Nginx 上。如果請求的是靜態資源,直接到靜態資源目錄獲取資源,如果是動態資源的請求,則利用反向代理的原理,把請求轉發給對應後臺應用去處理,從而實現動靜分離。

使用前後端分離後,可以很大程度提升靜態資源的訪問速度,即使動態服務不可用,靜態資源的訪問也不會受到影響

3 環境準備

本次使用系統環境是centos7.5

如果要使用nginx,首先要準備環境,因爲nginx是c語言寫的,必須在安裝nginx之前安裝gcc、openssl、pcre、zlib這四個前提依賴。

本次實戰是離線安裝方式,需要下載安裝包,請自行下載。

3.1 安裝gcc

(1)上傳壓縮依賴包

(2)解壓壓縮文件

tar -xvf xxxxxx

(3)進入解壓目錄執行命令

./configure
make
make check
make install

3.2 安裝openssl

(1)上傳壓縮依賴包

(2)解壓壓縮文件

tar -xvf xxxxxx

(3)進入解壓目錄執行命令

./configure
make
make check
make install

3.3 安裝pcre

(1)上傳壓縮依賴包

(2)解壓壓縮文件

tar -xvf xxxxxx

(3)進入解壓目錄執行命令

./configure
make
make check
make install

3.4 安裝zlib

(1)上傳壓縮依賴包

(2)解壓壓縮文件

tar -xvf xxxxxx

(3)查看編輯參數

./configure --help

(4)添加prefix路徑

./configure --prefix=/usr/local/zlib

(5)查看執行結果

echo $?

(6)編譯執行安裝

make

make check

make install

(7)寫入動態庫的路徑

echo "/usr/local/zlib/lib/" >> /etc/ld.so.conf

ldconfig -v

4 安裝nginx

(1)上傳壓縮依賴包

(2)解壓壓縮文件

tar -xvf xxxxxx

(3)進入解壓目錄執行命令

./configure
make
make check
make install

(4)進入目錄 /usr/local/nginx/sbin/nginx 啓動服務

(5)nginx常用命令

進入nginx安裝目錄:cd /usr/local/nginx/sbin

查看nginx 版本號: ./nginx -v

啓動nginx: ./nginx

停止nginx: ./nginx -s stop

重新加載nginx: ./nginx -s reload

5 負載均衡配置

因爲我是微服務spring boot項目,至此以微服務爲例,配置nginx負載均衡。

5.1 準備工作

部署兩個微服務項目,一個是8073,一個是8072

5.2 配置示例

5.3 實現效果

瀏覽器地址欄輸入地址 http://172.16.5.89:8070,負載均衡效果,平均 8072 和 8073 端口中

5.4 nginx分配服務器策略

(1)輪詢(默認)

每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器 down 掉,能自動剔除。

(2)weight

weight 代表權重默認爲 1,權重越高被分配的客戶端越多。

(3)ip_hash

每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個後端服務器。

(4)fair

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

6 結束語

至此nginx安裝以及spring boot微服務項目負載均衡配置完成。

如需要離線安裝包,請自行下載,地址:https://download.csdn.net/download/lovelichao12/12503614

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章