Nginx學習筆記(反向代理&搭建叢集)

Jaybo發表於2018-08-30

一、前言

1.1 大型網際網路架構演變歷程

1.1.1 淘寶技術

淘寶的核心技術(國內乃至國際的 Top,這還是2011年的資料)

  • 擁有全國最大的分散式 Hadoop 叢集(雲梯,2000左右節點,24000核 CPU,48000GB 記憶體,40PB 儲存容量)
  • 全國分佈 80+CDN 節點,能夠自動找尋最近的節點提供服務,支援流量超過800Gbps
  • 不遜於百度的搜尋引擎,對數十億商品進行搜尋,全球最大的電商平臺
  • 頂尖的負載均衡系統,頂尖的分散式系統,頂尖的網際網路思想,功能多樣執行極其穩定
  • 豐富的生態產業以及先進的資料探勘技術
  • ……很多很多

1.1.2 淘寶技術演變

摘自《淘寶技術這十年》

  • 馬總在2003年4月7日祕密叫來阿里巴巴的十位員工,來到杭州一個隱祕的毛坯房,要求他們在一個月左右的時間內做出一個 C2C 網站。結果當然還是直接買的快,一個基於 LAMP 架構的網站,原名是PHPAuction,老美開發的一個拍賣網站。當然必須要做修改才能用。
  • 2003年底,淘寶註冊使用者23萬,PV 31萬/day,半年成交額3371萬。
  • 很顯然 MySQL 無法撐得起如此大的訪問量,資料庫瓶頸出現了。幸好阿里的 DBA 隊伍足夠強大,他們使用 Oracle 替代了 MySQL。Oracle 那時就已經有了強大的併發性訪問設計——連線池,從連線池取連線的耗費比單獨建立連線少很多。但是 PHP 當時並沒有官方提供支援語言連線池特性,於是多隆前輩用Google(不會是Baidu)搜到了一個開源的 SQL Relay,於是資料庫軟體方面的瓶頸暫時解決了。
  • 隨之而來的是面臨硬體效能瓶頸,阿里買了 EMC 的 SAN 儲存裝置,加上 Oracle 高效能 RAC,硬體容量也暫時沒問題了。
  • 因為 SQL Relay 的問題實在過於嚴重,2004年於是淘寶終於做出了跨時代的決策——使用Java重寫網站。
  • 淘寶請了 Sun 的高階工程師來幫忙做 Java 架構。那麼他們是如何做到修改程式語言而不改變網站使用呢——模組化替換,今天寫好了 A 模組,另開一個新域名,將連線指向該模組,同時別的模組不變,等到全部模組完成的時候,原域名放棄。Sun 公司堅持使用 EJB 作為控制層,加上使用 iBatis 作為持久層,一個可擴充套件且高效的 Java EE 應用誕生了。
  • 送走 Sun 的大牛們之後,阿里的資料儲存又遇到了瓶頸,於是忍痛買了一臺 IBM 小型機,也就有了IOE(IBM + Oracle + EMC)這樣的傳說。
  • 2004年底,淘寶註冊使用者400萬,PV 4000萬/day,全網成交額10個億。
  • 2005年 Spring 誕生了,早聞 Spring 框架在 Web 應用不可或缺,而在淘寶網,Spring 也達到了 Rod Johnson 設計它的目的——替代 EJB。
  • 2005年底,淘寶註冊使用者1390萬,PV 8931萬/day,商品數目1663萬個。
  • 考慮到未來的發展,這樣的設施架構只是勉強可以應付現在的要求。於是,CDN 技術派上用場了,一開始使用商用的 ChinaCache,後來使用章文嵩博士搭建低耗能 CDN 網路,淘寶網的效能越來越好了。
  • 2006年底,淘寶註冊使用者3000萬,PV 15000萬/day,商品數目5000萬,全網成交額169億元。
  • 淘寶在2007年之前,使用 NetApp 的商用儲存系統,但是仍然不夠應付迅速增長的趨勢。同年 Google 公佈了 GFS 的設計思想,參照它的思想,淘寶也開發了自己的檔案系統——TFS 每個使用者在 TFS 上擁有1GB的圖片儲存空間,這些都得益於 TFS 叢集的檔案儲存系統以及大量的圖片伺服器。淘寶使用實時生成縮率圖,全域性負載均衡以及一級和二級快取來保證圖片的訪問優化與高效訪問。
  • 淘寶的伺服器軟體使用 Tengine,一個被優化過的 nginx 模組。
  • 淘寶分離出了 UIC(User Information Center),供所有模組呼叫。多隆前輩再次為其編寫出了 TDBM,完全是基於記憶體的資料快取(參考了memcached)。再然後,淘寶將 TBstore 和 TDBM 合併,寫出了 Tair,一個基於 Key-Value 的分散式快取資料系統。然後升級了自己的 iSearch 系統。
  • 2007年底,淘寶註冊使用者5000萬,PV 25000萬/day,商品數目1個億,全網成交額433億元。
  • ......
  • Dubbo 是阿里巴巴內部的 SOA 服務化治理方案的核心框架,每天為2000+ 個服務提供3000000000+ 次訪問量支援,並被廣泛應用於阿里巴巴集團的各成員站點。Dubbo 自2011年開源後,已被許多非阿里系公司使用。

1.2.3 技術發展總結

1、單節點架構

Nginx學習筆記(反向代理&搭建叢集)

2、叢集架構

Nginx學習筆記(反向代理&搭建叢集)

3、叢集+分散式架構

Nginx學習筆記(反向代理&搭建叢集)

Nginx學習筆記(反向代理&搭建叢集)

1.2 代理概述

1.2.1 正向代理(Forward Proxy)

一般情況下,如果沒有特別說明,代理技術預設說的是正向代理技術。關於正向代理的概念如下:

正向代理(forward)是一個位於客戶端【使用者A】和原始伺服器(origin server)【伺服器B】之間的伺服器【代理伺服器Z】,為了從原始伺服器取得內容,使用者 A 向代理伺服器 Z 傳送一個請求並指定目標(伺服器B),然後代理伺服器 Z 向伺服器 B 轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。

Nginx學習筆記(反向代理&搭建叢集)

從上面的概念中,可以看出,所謂的正向代理就是代理伺服器替代訪問方【使用者A】去訪問目標伺服器【伺服器B】。

這就是正向代理的意義所在。而為什麼要用代理伺服器去代替訪問方【使用者A】去訪問伺服器 B 呢?這就要從代理伺服器使用的意義說起。

使用正向代理伺服器作用主要有以下幾點:

  1. 訪問本無法訪問的伺服器 B,如圖

    Nginx學習筆記(反向代理&搭建叢集)

    我們拋除複雜的網路路由情節來看上圖,假設圖中路由器從左到右命名為 R1、R2。假設最初使用者 A 要訪問伺服器 B 需要經過 R1 和 R2 路由器這樣一個路由節點,如果路由器 R1 或者路由器 R2 發生故障,那麼就無法訪問伺服器 B 了。但是如果使用者 A 讓代理伺服器 Z 去代替自己訪問伺服器 B,由於代理伺服器 Z 沒有在路由器 R1 或 R2 節點中,而是通過其它的路由節點訪問伺服器 B,那麼使用者 A 就可以得到伺服器 B 的資料了。現實中的例子就是 FQ。不過自從 VPN 技術被廣泛應用外,FQ 不但使用了傳統的正向代理技術,有的還使用了VPN 技術。

  2. 加速訪問伺服器 B

    這種說法目前不像以前那麼流行了,主要是頻寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。還是如上圖,假設使用者 A 到伺服器 B,經過 R1 路由器和 R2 路由器,而 R1 到 R2 路由器的鏈路是一個低頻寬鏈路。而使用者 A 到代理伺服器 Z,從代理伺服器 Z 到伺服器 B 都是高頻寬鏈路。那麼很顯然就可以加速訪問伺服器 B 了。

  3. Cache 作用

    Cache(快取)技術和代理服務技術是緊密聯絡的(不光是正向代理,反向代理也使用了Cache(快取)技術。還如上圖所示,如果在使用者 A 訪問伺服器 B 某資料 D 之前,已經有人通過代理伺服器 Z 訪問過伺服器 B 上得資料 D,那麼代理伺服器 Z 會把資料 D 儲存一段時間,如果有人正好取該資料 D,那麼代理伺服器 Z 不再訪問伺服器 B,而把快取的資料 D 直接發給使用者 A。這一技術在 Cache 中術語就叫 Cache 命中。如果有更多的像使用者 A 的使用者來訪問代理伺服器 Z,那麼這些使用者都可以直接從代理伺服器 Z 中取得資料 D,而不用千里迢迢的去伺服器 B 下載資料了。

  4. 客戶端訪問授權

    這方面的內容現今使用的還是比較多的,例如一些公司採用 ISA SERVER 做為正向代理伺服器來授權使用者是否有許可權訪問網際網路,如下圖

    Nginx學習筆記(反向代理&搭建叢集)

    用防火牆作為閘道器,用來過濾外網對其的訪問。假設使用者 A 和使用者 B 都設定了代理伺服器,使用者 A 允許訪問網際網路,而使用者 B 不允許訪問網際網路(這個在代理伺服器 Z 上做限制)這樣使用者 A 因為授權,可以通過代理伺服器訪問到伺服器 B,而使用者 B 因為沒有被代理伺服器 Z 授權,所以訪問伺服器 B 時,資料包會被直接丟 棄。

  5. 隱藏訪問者的行蹤

    如下圖,我們可以看出伺服器 B 並不知道訪問自己的實際是使用者 A,因為代理伺服器 Z 代替使用者 A 去直接與伺服器 B 進行互動。如果代理伺服器 Z 被使用者 A 完全控制(或不完全控制),會慣以「肉雞」術語稱呼。

    Nginx學習筆記(反向代理&搭建叢集)

總結一下:正向代理是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內 容返回給客戶端。客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的 IP 地址,還有代理程式的埠。

1.2.2 反向代理(Reverse Proxy)

反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。 使用反向代理伺服器的作用如下:

  1. 保護和隱藏原始資源伺服器,如下圖:

    Nginx學習筆記(反向代理&搭建叢集)

    使用者 A 始終認為它訪問的是原始伺服器 B 而不是代理伺服器 Z,但實用際上反向代理伺服器接受使用者 A 的應答,從原始資源伺服器 B 中取得使用者 A 的需求資源,然後傳送給使用者 A。由於防火牆的作用,只允許代理伺服器 Z 訪問原始資源伺服器 B。儘管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源伺服器 B,但使用者 A 並不知情。

  2. 負載均衡,如下圖:

    Nginx學習筆記(反向代理&搭建叢集)

    當反向代理伺服器不止一個的時候,我們甚至可以把它們做成叢集,當更多的使用者訪問資源伺服器 B 的時候,讓不同的代理伺服器 Z(x)去應答不同的使用者,然後傳送不同使用者需要的資源。

    當然反向代理伺服器像正向代理伺服器一樣擁有 Cache 的作用,它可以快取原始資源伺服器 B 的資源,而不是每次都要向原始資源伺服器 B 請求資料,特別是一些靜態的資料,比如圖片和檔案,如果這些反向代理伺服器能夠做到和使用者 X 來自同一個網路,那麼使用者 X 訪問反向代理伺服器 X,就會得到很高質量的速度。這正是 CDN 技術的核心。如下圖:

    Nginx學習筆記(反向代理&搭建叢集)

    我們並不是講解 CDN,所以去掉了 CDN 最關鍵的核心技術智慧 DNS。只是展示 CDN 技術實際上利用的正是反向代理原理這塊。

反向代理結論與正向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。

基本上,網上做正反向代理的程式很多,能做正向代理的軟體大部分也可以做反向代理。開源軟體中最流行的就是 squid,既可以做正向代理,也有很多人用來做反向代理的前端伺服器。另外 MS ISA 也可以用來在 Windows 平臺下做正向代理。反向代理中最主要的實踐就是 Web 服務,近些年來最火的就是 Nginx 了。網上有人說 Nginx 不能做正向代理,其實是不對的。Nginx 也可以做正向代理,不過用的人比較少了。

1.2.3 透明代理

如果把正向代理、反向代理和透明代理按照人類血緣關係來劃分的話。那麼正向代理和透明代理是很明顯堂親關係,而正向代理和反向代理就是表親關係了 。

透明代理的意思是客戶端根本不需要知道有代理伺服器的存在,它改編你的 request fields(報文),並會傳送真實 IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設定使用代理了。 透明代理實踐的例子就是時下很多公司使用的行為管理軟體。如下圖:

Nginx學習筆記(反向代理&搭建叢集)

使用者 A 和使用者 B 並不知道行為管理裝置充當透明代理行為,當使用者 A 或使用者 B 向伺服器 A 或伺服器 B 提交請求的時候,透明代理裝置根據自身策略攔截並修改使用者 A 或 B 的報文,並作為實際的請求方,向伺服器 A 或 B 傳送請求,當接收資訊回傳,透明代理再根據自身的設定把允許的報文發回至使用者 A 或 B,如上圖,如果透明代理設定不允許訪問伺服器 B,那麼使用者 A 或者使用者 B 就不會得到伺服器 B 的資料。

二、在Linux下發布專案

使用的為:CentOS 系統

2.1 Linux系統上安裝JDK

登入 Linux 系統後,先檢測是否安裝了 jdk,執行:java -version,如果有 OpenJDK,將其解除安裝,我們安裝使用 SunJDK。關於兩者相關區別:

1、解除安裝 OpenJDK

  • 檢視和 java 相關的包:rpm –qa | grep java

    Nginx學習筆記(反向代理&搭建叢集)

  • 解除安裝 OpenJDK

    • 先解除安裝 openjdk 1.7:rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.i686

    • 再解除安裝 openjdk 1.6:rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686

Nginx學習筆記(反向代理&搭建叢集)

2、安裝 jdk:(上傳 jdk, 通過 ftp 軟體上傳,上傳到 root 目錄下)

  • 在 /usr/local 建立一個 java 目錄:mkdir java

  • 將上傳的 jdk 複製到 java 目錄下:cp /root/jdk.xxxxx.tar /usr/local/java

  • 將其解壓:tar -xvf jdk.xxx.tar

  • 安裝依賴:yum install glibc.i686

    要想執行使用我們 jdk 還需要安裝一些外掛,就像我們 java 一樣,底層依賴一些 C++、C 語言的東西。

    關於 yum,菜鳥教程:linux yum 命令

  • 配置環境變數:

    編輯  vi /etc/profile
    在檔案最後新增一下資訊
        #set java environment
        JAVA_HOME=/usr/local/java/jdk1.7.0_72
        CLASSPATH=.:$JAVA_HOME/lib.tools.jar
        PATH=$JAVA_HOME/bin:$PATH
        export JAVA_HOME CLASSPATH PATH
    儲存退出
    source /etc/profile  重新載入配置檔案,使更改的配置立即生效
    複製程式碼

注:關於如何上上傳檔案到 root 目錄,如下,可以使用 FileZilla 軟體,直接拖動檔案到該目錄即可完成上傳。

Nginx學習筆記(反向代理&搭建叢集)

2.2 Linux系統上安裝MySQL

  1. 檢測是否按照了 mysql:rpm -qa | grep mysql

  2. 解除安裝系統自帶的mysql:rpm -e --nodeps mysql-libs-5.1.71-1.el6.i386

  3. 上傳 mysql 包

  4. 在 /usr/local/ 建立一個 mysql 目錄

  5. 複製 mysql 包到 mysql 目錄下

  6. 解壓 tar:tar -xvf MySQL-5.6.22-1.el6.i386.rpm-bundle.tar,會有幾個 rpm 檔案,如下:

    Nginx學習筆記(反向代理&搭建叢集)

  7. 安裝

    • 安裝 mysql 的伺服器端:rpm -ivh MySQL-server-5.5.49-1.linux2.6.i386.rpm

      注意:第一次登入 mysql 的時候是不需要密碼的,以後都需要。

    • 安裝 mysql 的客戶端:rpm -ivh MySQL-client-5.5.49-1.linux2.6.i386.rpm

  8. 檢視 mysql 的服務狀態:service mysql status

    • 啟動 mysql:service mysql start
    • 停止 mysql:service mysql stop
  9. 修改 mysql 的 root 的密碼

    登入:mysql -uroot
    修改密碼:
        use mysql;
        update user set password = password('1234') where user = 'root';
        flush privileges;# 重新整理
    複製程式碼
  10. 開啟遠端訪問

    grant all privileges on *.* to 'root' @'%' identified by '1234';
    flush privileges;
    複製程式碼
  11. 開啟防火牆埠 3306 退出 mysql

    3306埠放行 
    /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
    將該設定新增到防火牆的規則中
    /etc/rc.d/init.d/iptables save
    複製程式碼

    測試連線 mysql 資料庫,連線成功:

    Nginx學習筆記(反向代理&搭建叢集)

  12. 設定 mysql 的服務隨著系統的啟動而啟動

    加入到系統服務:
    chkconfig --add mysql
    自動啟動:
    chkconfig mysql on
    複製程式碼

2.3 Linux系統下安裝Tomcat

  1. 在 /usr/local/ 建立 tomcat 目錄:mkdir tomcat

  2. 複製 tomcat 到 /usr/local/tomcat:cp /root/apache-tomcat-7.0.52.tar.gz ./tomcat/

  3. 解壓 tomcat:tar -xvf apache-tomcat-7.0.52.tar.gz

  4. 啟動 tomcat,進入 bin:

    • 方式一:sh startup.sh

    • 方式二:./startup.sh

    注意:

    檢視日誌檔案
    tail -f logs/catalina.out
    退出 ctrl+c
    複製程式碼
  5. 開啟埠號 8080:

    8080埠放行 
    /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
    將該設定新增到防火牆的規則中
    /etc/rc.d/init.d/iptables save
    複製程式碼

2.4 釋出專案到Linux

  1. 資料庫和表

    ①備份store28的資料庫:
    在windows下:mysqldump -uroot -p1234 store28 > C:/1.sql
    
    ②將C盤下的1.sql上傳到Linux下的root目錄
    
    ③通過遠端工具還原資料庫
        先登入mysql
        建立資料庫 store28
        進入store28
        	source /root/1.sql
    複製程式碼
  2. 專案

    ①將專案打包 war
    	war包的特點:
    		在tomcat/webapps目錄下 只要tomcat啟動 war會自動解壓
    ②將store.war上傳到Linux系統下的root目錄下
    ③將store.war移動到tomcat/webapps下即可
    複製程式碼

三、Nginx

3.1 nginx相關概念

在介紹 Ngnix 之前,先還是回顧幾個與 Ngnix 相關的概念。

1、反向代理

反向代理(Reverse Proxy)方式是指以代理伺服器來接受 Internet 上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給 Internet 上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

Nginx學習筆記(反向代理&搭建叢集)

2、負載均衡

負載均衡,英文名稱為 Load Balance,是指建立在現有網路結構之上,並提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。其原理就是資料流量分攤到多個伺服器上執行,減輕每臺伺服器的壓力,多臺伺服器共同完成工作任務,從而提高了資料的吞吐量。

Nginx學習筆記(反向代理&搭建叢集)

3.2 nginx簡介

1、什麼是 ngnix?

Nginx(engine x) 是一個高效能的HTTP反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。

其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4釋出。

Nginx是一款輕量級伺服器反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同型別的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘等。(摘自百度百科

2、為什麼使用 ngnix?

背景:

網際網路飛速發展的今天,大使用者量高併發已經成為網際網路的主體。怎樣能讓一個網站能夠承載幾萬個或幾十萬個使用者的持續訪問呢?這是一些中小網站急需解決的問題。用單機 tomcat 搭建的網站,在比較理想的狀態下能夠承受的併發訪問量在 150 到 200 左右。按照併發訪問量佔總使用者數量的 5% 到 10% 這樣計算,單點 tomcat 網站的使用者人數在 1500 到 4000 左右。對於一個為全國範圍提供服務的網站顯然是不夠用的,為了解決這個問題引入了負載均衡方法。負載均衡就是一個 web 伺服器解決不了的問題可以通過多個 web 伺服器來平均分擔壓力來解決,併發過來的請求被平均分配到多個後臺 web 伺服器來處理,這樣壓力就被分解開來。

負載均衡伺服器分為兩種一種是通過硬體實現的負載均衡伺服器,簡稱硬負載例如:f5。另一種是通過軟體來實現的負載均衡,簡稱軟負載,例如 apache 和 nginx。硬負載和軟負載相比,前者作用的網路層次比較多,可以作用到 socket 介面的資料鏈路層對發出的請求進行分組轉發但是價格成本比較貴,而軟負載作用的層次在 http 協議層之上可以對 http 請求進行分組轉發並且因為是開源的所以幾乎是 0 成本,並且阿里巴巴,京東等電商網站使用的都是 Nginx 伺服器。

很多大網站都是使用 nginx 做反向代理,應用非常廣泛。Nginx 是一款高效能的 http 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。由俄羅斯的程式設計師 Igor Sysoev 所開發,官方測試 nginx 能夠支支撐5萬併發連結,並且 cpu、記憶體等資源消耗卻非常低,執行非常穩定。

應用場景:

  1. http 伺服器,可以做靜態網頁的 http 伺服器。

  2. 配置虛擬機器。一個域名可以被多個 ip 繫結。可以根據域名的不同把請求轉發給執行在不同埠的伺服器。

  3. 反向代理,負載均衡。把請求轉發給不同的伺服器。

四、搭建叢集

4.1 在Windows下搭建叢集

1、在 G 盤新建兩個新建兩個目錄 tomcat1、tomcat2

2、修改 tomcat2 的埠,例如, 在以 tomcat1 的埠為基礎上+10,修改完,啟動這兩個 tomcat,再分別訪問

  • 訪問 8080 埠:localhost:8080/test/

    Nginx學習筆記(反向代理&搭建叢集)

  • 訪問 8090 埠:localhost:8090/test/

    Nginx學習筆記(反向代理&搭建叢集)

3、解壓 nginx

Nginx學習筆記(反向代理&搭建叢集)

修改 ngnix 的 nginx.conf 檔案,在 location / 下新增反向代理伺服器,代理 8080 埠:

Nginx學習筆記(反向代理&搭建叢集)

以上只是代理了一臺伺服器。啟動 nginx,每次訪問 localhost/test/, 最後訪問的都是8080埠伺服器的資料。

4、代理叢集,例如代理兩臺伺服器

需要在http節點上新增一個
upstream servlet_yujia{
    server 127.0.0.1:8080;
    server 127.0.0.1:8090;
}
修改location /下的反向代理 
	proxy_pass http://servlet_yujia
複製程式碼

修改如圖:

Nginx學習筆記(反向代理&搭建叢集)

另外,還可以給伺服器新增權重:

Nginx學習筆記(反向代理&搭建叢集)

表示如果有 6 次訪問,則有 4 次可能訪問到第二個伺服器。啟動 nginx,則每次訪問localhost/test/,會有可能訪問到8080埠伺服器的資料,也可能訪問到8090埠伺服器的資料。

5、Session共享問題

  1. 解決方式一(只能在 windows 下好使):

    web 伺服器解決(廣播機制),注意:tomcat 下效能低

    修改兩個地方:

    1. 修改兩個 tomcat 的 server.xml,支援共享,將引擎標籤下的 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>註釋去掉

      Nginx學習筆記(反向代理&搭建叢集)

    2. 修改專案的配置檔案 web.xml 中新增一個節點 <distributable/>

      Nginx學習筆記(反向代理&搭建叢集)

  2. 解決方式二:可以將 session 的 id 放入 redis 中

  3. 解決方式三:保證一個 ip 地址永遠的訪問一臺 web 伺服器,就不存在 session 共享問題了,在 nginx 的配置檔案中 upstream 中新增 ip_hash(在 Linux 下經常使用該方式

    ip_hash 指令能夠將某個客戶端 IP 的請求通過雜湊演算法定位到同一臺後端伺服器上。

4.2 在Linux下搭建叢集

1、先將 nginx 上傳到 linux 上

2、解壓 nginx

3、先編譯 nginx

安裝依賴包
    yum install gcc-c++
    yum install -y pcre pcre-devel
    yum install -y zlib zlib-devel
    yum install -y openssl openssl-devel
執行編譯
    先進入 nginx的目錄
    執行
		./configure
複製程式碼

Nginx學習筆記(反向代理&搭建叢集)

4、安裝 nginx

  • 執行 make
  • 執行 make install

5、啟動 nginx:

cd nginx 目錄下
	配置檔案 conf
	啟動nginx 
		./nginx 
複製程式碼

注:①在 nginx 目錄下有一個 sbin 目錄,sbin 目錄下有一個 nginx 可執行程式

②關閉 ngnix:

  • 關閉命令:相當於找到 nginx 程式kill ./nginx -s stop
  • 退出命令 ./nginx -s quit等程式執行完畢後關閉,建議使用此命令。

6、將埠號 80 放行

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
將該設定新增到防火牆的規則中
/etc/rc.d/init.d/iptables save
複製程式碼

7、修改 conf 檔案和 window 下一樣:配置叢集

相關文章