Nginx分布式部署流程分析
分布式部署
分布式部署也叫集群或機群(多臺電腦整合在一起,都運行相同的項目)。
Nginx
Nginx是做代理的,且Nginx是反向代理。(VPN是 正向代理)
Java中的代理
在Java設計模式中,代理模式是這樣定義的:給某個對象提供一個代理對象,并由代理對象控制原對象的引用。
代理分為正向代理和反向代理
正向代理與反向代理的核心區(qū)別,本質(zhì)上就是 “觀察角度” 和 “代理服務的目標對象” 不同,而非代理本身有固定屬性。
很多時候,同一個代理節(jié)點在不同場景下,因觀察視角變化,可能同時扮演兩種角色,也就試說反向代理和正向代理可以是同一個代理,這正是兩者最易混淆的核心原因。
比如在當前角度看一個代理是正向代理,從另一個角度來看該代理則是反向代理。路由器使用的既可以是反向代理也可以是正向代理。
正向代理
正向代理就是把代理操作放在客戶端。
反向代理
反向代理就是把代理操作放在服務器。
反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發(fā)送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數(shù)據(jù)后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。
百度百科的說法:反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現(xiàn)為一個反向代理服務器。簡單來說就是真實的服務器不能直接被外部網(wǎng)絡訪問,所以需要一臺代理服務器,而代理服務器能被外部網(wǎng)絡訪問的同時又跟真實服務器在同一個網(wǎng)絡環(huán)境,當然也可能是同一臺服務器,端口不同而已。
Nginx應用場景
我們做程序,會做一個前端vue項目(頁面),連接我們的java項目。java項目返回數(shù)據(jù)給前端。
用戶訪問前端vue項目,這時會出現(xiàn)一個問題,訪問前端vue服務器的人太多了(假如是100萬),造成服務器壓力過大。

對此,我們可以在一臺新的服務器上再部署這個前端vue項目,讓其中50萬用戶訪問第一臺服務器的vue項目,讓另外50萬用戶訪問第二胎服務器的vue項目,減輕服務器壓力。
但問題是怎么讓其中50萬用戶訪問第一臺服務器的vue項目,讓另外50萬的用戶訪問第二胎服務器的vue項目。這就需要用到Nginx了。

用戶只需訪問Nginx,Nginx會幫我們做一個轉(zhuǎn)向,轉(zhuǎn)到兩臺服務器的前端vue項目。至于如何均衡的轉(zhuǎn)到這兩臺服務器,這就需要涉及到下面的負載均衡。
負載均衡
負載均衡也是Nginx常用的一個功能,負載均衡其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務器、FTP服務器、企業(yè)關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。簡單而言就是當有2臺或以上服務器時,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉(zhuǎn)到負載均衡。而Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略。
Nginx安裝與啟動
- 下載nginx包后解壓到某盤(如:D盤nginx文件夾下)。
- 在nginx目錄下,打開cmd,輸入命令
start nginx.exe啟動nginx,也可以雙擊nginx.exe啟動。(反饋不明顯,只要做過啟動操作,因該就已經(jīng)啟動了) - 瀏覽器輸入127.0.0.1,進入nginx歡迎頁面
- 服務停止命令:
nginx -s stop - 服務重啟命令:
nginx -s reload - 一旦啟動,就無法停止(上面的命令不能用)。如果需要關閉,可直接在任務管理器找到nginx任務并關閉。
負載均衡簡單設置
- 打開D:\nginx\conf目錄下nginx.conf文件
upstream servertest {
server 192.168.1.146:8080 down;
server 192.168.1.146:8081 weight=3;
server 192.168.1.146:8082;
server 192.168.1.146:8083 backup;
}
server {
listen 8080; #監(jiān)聽端口
server_name localhost; #監(jiān)聽地址
location / {
proxy_pass http://servertest; #請求轉(zhuǎn)向servertest 定義的服務器列表
root html;
index index.html index.htm;
}
}- down:表示當前的server暫時不參與負載,不會被訪問。
- Weight:默認為1。weight越大,負載的權重就越大,被訪問的概率也就越高。(開發(fā)中可以設置讓性能好的服務器被訪問概率更大)
- max_fails:允許請求失敗的次數(shù)默認為1。當超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤。
- fail_timeout: max_fails 次失敗后,暫停的時間。
- Backup:其它所有的非backup機器宕機或者忙的時候,請求backup機器(可理解為備用機)。所以這臺機器壓力會最輕。
- upstream 塊:
- 網(wǎng)上下載的nginx的conf配置中沒有,需要自己手動添加。
- 這是定義負載均衡池的配置,名稱為testnginx(可自定義)。
- 里面包含了服務器地址(IP+端口號)。
- Nginx 會按照默認的輪詢策略(Round Robin)將請求分發(fā)到這些服務器。
- server 塊:
listen 80;:nginx的端口設置。server_name 127.0.0.1;:nginx的IP設置。- location / 塊:
- 這是處理根路徑請求的配置。
- proxy_pass http://testnginx:關鍵配置,將所有根路徑的請求轉(zhuǎn)發(fā)到前面定義的testnginx負載均衡池。
- root html:指定靜態(tài)文件的根目錄。
- index:指定默認首頁文件。
Java項目使用nginx流程
現(xiàn)在大多都是前端在用Nginx,其實我們Java后端也能用Nginx,使用方法跟前端一樣。
可參考文章:分布式開發(fā)中最后的項目打包,分別設置使用不同的端口(因為都是在自己電腦上運行測試)進行打包,比如一個使用81端口,一個使用82端口(項目代碼都一樣,只是使用的端口號不同)。
配置nginx.conf
# 需要自己寫,名字可隨意起,這里是testnginx,網(wǎng)上下載的nginx不會自帶,需要自己寫,里面是要進行轉(zhuǎn)向管理的服務器
upstream testnginx{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
# nginx的端口設置
listen 8080;
# nginx的IP設置
server_name 127.0.0.1;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# nginx要訪問的upstream,http://后面要與上面定義的upstream的名字保持一致
proxy_pass http://testnginx;
root html;
# 首頁
index index.html index.htm;
}
}在jar包目錄下通過cmd窗口使用java -jar jar包名命令啟動jar包中的項目,然后再啟動nginx。就可以去訪問nginx了,nginx會自動將請求隨機轉(zhuǎn)發(fā)給設置的服務器地址。
瀏覽器訪問nginx的地址+端口,指定要訪問的項目中的接口。

域名映射
- 找到電腦C:\Windows\System32\drivers\etc下hosts文件并打開
- 127.0.0.1 www.lp.com(可任意) 將www.lp.com映射到127.0.0.1上
- 在nginx中配置server中server_name為www.lp.com
session共享解決方案
ip_hash
nginx中的ip_hash技術能夠?qū)⒛硞€ip的請求固定到同一臺后端應用服務器,這樣一來這個ip下的某個客戶端和某個后端就能建立起穩(wěn)固的session,ip_hash是在upstream配置中定義的:
upstream servertest {
server 192.168.1.146:8080 down;
server 192.168.1.146:8081 weight=3;
server 192.168.1.146:8082;
server 192.168.1.146:8083 backup;
ip_hash;
}優(yōu)點:ip_hash算法可以把一個ip映射到一臺服務器上,這樣可以解決session同步的問題。這樣每個訪客固定訪問一個后端服務器,可以解決session的問題;
缺點:使用ip_hash進行session共享,它的原理是為每個訪問者提供一個固定的訪問ip,讓用戶只能在當前訪問的服務器上進行操作,保持了session同步的,但是也造成了負載不均衡的問題,如果當前用戶訪問的服務器掛了的話,那就會出現(xiàn)問題了;
springsession
這種方式用戶通過Nginx訪問了其中一臺服務器,存了一個session,這個session會同步到其它服務器。
導入jar
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.0.4.RELEASE</version> </dependency>
編寫(只需開啟,不用配置)
分布式事務
一旦把項目部署在多臺服務器上,就會產(chǎn)生事務問題、多線程問題、操作統(tǒng)一資源產(chǎn)生的問題
到此這篇關于Nginx分布式部署的文章就介紹到這了,更多相關nginx分布式部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx優(yōu)化配置和內(nèi)核優(yōu)化 實現(xiàn)突破十萬并發(fā)
Nginx是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。本文介紹一些Nginx優(yōu)化代碼參數(shù)等2013-06-06
nginx?proxy_pass轉(zhuǎn)發(fā)規(guī)則解讀
這篇文章主要介紹了nginx?proxy_pass轉(zhuǎn)發(fā)規(guī)則,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

