《Nginx系列》之青銅入門篇 反向代理 負載均衡 動靜分離就是這麼簡單

YangZhaoSy發表於2020-01-04

1.什麼是Nginx?

Nginx是一個高效能的自由、開源的HTTP和反向代理伺服器,特點是***佔用記憶體少***,併發效能強

nginx能幹嘛?

  • 可以作為IMAP、POP3、SMTP的代理伺服器;
  • 可以作為HTTP伺服器進行網站的釋出處理;
  • 可以作為反向代理進行負載均衡的實現;

2.Nginx的安裝

2.1 將Nginx相關安裝包上傳到伺服器上

[root@localhost nginx-1.12]# ls -l
總用量 2956
-rw-r--r--. 1 root root  981687 12月 21 16:09 nginx-1.12.2.tar.gz
-rw-r--r--. 1 root root 2041593 12月 21 16:09 pcre-8.37.tar.gz
複製程式碼

nginx-1.12.2.tar.gz:nginx原始碼包,用於安裝Nginx

pcre-8.37.tar.gz:Perl庫, 是一個用C語言編寫的正規表示式函式庫 。

2.2 安裝pcre

  • 解壓pcre原始碼安裝包
[root@localhost nginx-1.12]# tar zxf pcre-8.37.tar.gz
複製程式碼
  • 編譯安裝pcre
[root@localhost pcre-8.37]# ./configure 
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking for style of include used by make... GNU
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/nginx-1.12/pcre-8.37':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
複製程式碼

如果出現上述錯誤,表示我們沒有C的編譯器,需要安裝gcc/gcc-c++(gcc是C的編譯器,gcc-c++是C++的編譯器)

  • 安裝gcc和gcc-c++
root@localhost pcre-8.37]# yum install gcc gcc-c++ -y
複製程式碼
  • 重新編譯pcre
[root@localhost pcre-8.37]# ./configure 
[root@localhost pcre-8.37]# make && make install
複製程式碼

./configure:會檢查當前系統的相關配置,也可以通過引數指定相關配置引數

make:編譯

make install:安裝

如果以上操作沒有報錯,表示編譯安裝完成

  • 測試pcre是否安裝成功
#執行pcre-config --version可用回顯版本號,則表示pcre安裝成功
[root@localhost pcre-8.37]# pcre-config --version
8.37
複製程式碼

2.3 安裝其他元件

[root@localhost pcre-8.37]# yum install -y make zlib zlib-devel libtool openssl openssl-develb
複製程式碼

2.4 安裝Nginx

  • 解壓Nginx原始碼安裝包
[root@localhost nginx-1.12]# tar zxf nginx-1.12.2.tar.gz
複製程式碼
  • 編譯安裝Nginx
[root@localhost nginx-1.12]# ls
apache-tomcat-7.0.70.tar.gz  nginx-1.12.2  nginx-1.12.2.tar.gz  pcre-8.37  pcre-8.37.tar.gz
[root@localhost nginx-1.12]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@localhost nginx-1.12.2]# ./configure
[root@localhost nginx-1.12.2]# make && make install
複製程式碼

./configure:會檢查當前系統的相關配置,也可以通過引數指定相關配置引數

make:編譯

make install:安裝

2.5 啟動Nginx,測試Nginx是否安裝成功

  • 啟動Nginx
#/usr/local/nginx:nginx原始碼安裝的預設路徑
[root@localhost nginx-1.12.2]# cd /usr/local/nginx/sbin/
#nginx:nginx的二進位制檔案,用於啟動、停止服務、重新載入配置檔案等
[root@localhost sbin]# ./nginx
複製程式碼

通過ps -aef | grep nginxf發現相關程式已存在

[root@localhost sbin]# ps -aef | grep nginx
root      24981      1  0 17:16 ?        00:00:00 nginx: master process ./nginx
nobody    24982  24981  0 17:16 ?        00:00:00 nginx: worker process
root      24985   9621  0 17:18 pts/1    00:00:00 grep --color=auto nginx
複製程式碼

通過netstat -tualnp發現nginx正在監聽80埠

Qv3Cxx.png

訪問nginx伺服器80埠,測試Nginx是否可以正常訪問

Qv3owD.png

如果出現上述情況,則是因為防火牆過濾引起的,此時可以通過增加80埠的規則列表,或者關閉防火牆即可解決。

firewall-cmd:檢視防火牆

關於firewall-cmd命令可參考: wangchujiang.com/linux-comma…

[root@localhost sbin]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
複製程式碼
  • 解決方法一:新增80埠到防火牆規則列表中
# 新增80埠到防火牆規則中
[root@localhost sbin]# firewall-cmd --permanent --add-port=80/tcp
success
# 重新載入防火牆,不會中斷已經建立的連線
[root@localhost sbin]# firewall-cmd --reload
success
複製程式碼
  • 解決方法二:將防火牆關掉(推薦)
# 停止防火牆
[root@localhost sbin]# systemctl stop firewalld
# 禁止防火牆的開機自啟
[root@localhost sbin]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
複製程式碼

再次訪問nginx伺服器80埠,此時Nginx可以正常訪問

QvGWqK.png

或者通過curl nginx伺服器的ip地址,也可以測試

[root@localhost sbin]# curl 192.168.245.130
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
複製程式碼

3.常用命令

注意:nginx的命令操作,預設必須在nginx的安裝目錄下的sbin目錄中操作(可以通過配置環境變數解決) 預設位置在**/usr/local/nginx/sbin**下

如果不知道nginx的目錄位置,可以使用whereis命令獲取

  • 獲取nginx檔案位置
[root@localhost sbin]# whereis nginx
nginx: /usr/local/nginx
複製程式碼
  • 檢視nginx版本資訊
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.12.2
複製程式碼
  • 啟動nginx
[root@localhost sbin]# ./nginx 
複製程式碼
  • 關閉nginx
[root@localhost sbin]# ./nginx -s stop
複製程式碼
  • 重新載入nginx(不需要重啟nginx伺服器,重新讀取nginx.conf配置檔案)
[root@localhost sbin]# ./nginx -s reload
複製程式碼

4.配置檔案解析

nginx的主配置檔案位於:/usr/local/nginx/conf/nginx.conf

4.1檔案結構

  • 全域性塊

從配置檔案開始到events塊之間的內容,主要設定一些影響nginx伺服器整體執行時的配置指令

#user  nobody;

#worker_processes:值越大,可處理的併發資料量也就越多
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
複製程式碼
  • events塊

nginx伺服器與使用者的網路連線配置資訊

#worker_connections:nginx支援的最大連線數
events {
    worker_connections  1024;
}
複製程式碼
  • http塊

用於代理、快取和日誌等相關功能和第三方模組的配置。比如我們常說的反向代理、負載均衡等等,都是通過配置http塊實現的。http塊中又包含http全域性塊server塊

http全域性塊

包含檔案引入、MIME-TYPE定義、日誌自定義、連線超時時間、單連結請求數上限等內容。

include       mime.types;
default_type  application/octet-stream;

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';

#access_log  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;
複製程式碼

server塊

每個http塊可以包含多個server塊,每個server塊相當於一個虛擬主機。

虛擬主機:可以理解為通過nginx將一個物理的伺服器(nginx伺服器),通過server塊的方式劃分為多個虛機伺服器對使用者提供訪問。

server {
	#server全域性塊
	#配置虛擬主機的監聽配置和虛擬主機的名稱和IP配置
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

	#location塊
	#根據接收到的請求字串對虛擬主機名稱之外的字串進行匹配,
	#對特定的請求進行處理、地址重定向、資料快取和應答控制等功能
    location / {
        root   html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    	root   html;
    }
}
複製程式碼

5.配置例項

5.1反向代理

什麼是反向代理?

反向代理是指以代理伺服器來接收來自網際網路上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從內部伺服器上得到的結果通過代理伺服器返回給來自網際網路上請求連線的客戶端,此時代理伺服器對外的表現形式就是一個反向代理伺服器。

image.png

比如我們(使用者)去租房子(Web伺服器),通常情況下都是通過平臺(代理伺服器)去租。這個時候我們是跟平臺去聯絡的,並不知道房東是誰。還有一種可能是房東委託自己的朋友去管理,這個時候跟我們聯絡的也不是房東本人,而是他的朋友(代理伺服器),這個過程就叫反向代理。而房東的朋友也就承擔了“代理伺服器”的這個角色。

案例一

需求:

​ 訪問192.168.245.130:80埠,代理到192.168.245.131:8080

1. 安裝JDK(tomcat需要依賴於JDK環境)

JDK是Java語言的軟體開發工具包,JDK是整個java開發的核心,它包含了JAVA的執行環境(JVM+Java系統類庫)和JAVA工具。

安裝JDK,因為Tomcat需要JDK的環境支援

  • 將JDK和tomcat上傳到伺服器。
[root@nginx-02 ~]# ls -l
總用量 196020
-rw-r--r--. 1 root root   9830232 12月 22 15:40 apache-tomcat-8.0.33.zip
-rw-r--r--. 1 root root 190890122 12月 22 15:41 jdk-8u171-linux-x64.tar.gz
複製程式碼
  • 解壓jdk-8u171-linux-x64.tar.gz/usr/local目錄中
[root@nginx-02 ~]# tar zxf jdk-8u171-linux-x64.tar.gz -C /usr/local/
[root@nginx-02 jdk1.8.0_171]# pwd
/usr/local/jdk1.8.0_171
[root@nginx-02 jdk1.8.0_171]# ls -l
總用量 25964
drwxr-xr-x. 2 10 143     4096 3月  29 2018 bin
-r--r--r--. 1 10 143     3244 3月  29 2018 COPYRIGHT
drwxr-xr-x. 4 10 143      122 3月  29 2018 db
drwxr-xr-x. 3 10 143      132 3月  29 2018 include
-rw-r--r--. 1 10 143  5203779 3月  29 2018 javafx-src.zip
drwxr-xr-x. 5 10 143      185 3月  29 2018 jre
drwxr-xr-x. 5 10 143      245 3月  29 2018 lib
-r--r--r--. 1 10 143       40 3月  29 2018 LICENSE
drwxr-xr-x. 4 10 143       47 3月  29 2018 man
-r--r--r--. 1 10 143      159 3月  29 2018 README.html
-rw-r--r--. 1 10 143      424 3月  29 2018 release
-rw-r--r--. 1 10 143 21098592 3月  29 2018 src.zip
-rw-r--r--. 1 10 143   106782 3月  29 2018 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 10 143   145180 3月  29 2018 THIRDPARTYLICENSEREADME.txt
複製程式碼
  • 編輯/etc/profile配置JAVA環境變數,在尾部加入以下內容

/etc/profile

# 配置JAVA環境變數
export JAVA_HOME=/usr/local/jdk1.8.0_171
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
複製程式碼
  • 輸入javac -version,Java -version看是否有版本回顯,有則表示JDK已安裝完成
[root@nginx-02 ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
[root@nginx-02 ~]# javac -version
javac 1.8.0_171
複製程式碼

2. 安裝Tomcat

Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器, 通常用於部署Java語言編寫的網站應用。

  • 解壓Tomcat到/usr/local/目錄
#檢視該目錄下面是否存在tomcat檔案
[root@nginx-02 ~]# ls
apache-tomcat-8.0.33.zip  jdk-8u171-linux-x64.tar.gz
#安裝unzip工具命令
[root@nginx-02 ~]# yum install -y unzip
#使用unzip命令解壓tomcat安裝檔案到/usr/local目錄下
[root@nginx-02 ~]# unzip apache-tomcat-8.0.33.zip -d /usr/local/
#進入/usr/local目錄
[root@nginx-02 ~]# cd /usr/local/
#檢視是否存在解壓後的tomcat檔案目錄
[root@nginx-02 local]# ls
apache-tomcat-8.0.33  bin  etc  games  include  jdk1.8.0_171  lib  lib64  libexec  sbin  share  src
#為apache-tomcat目錄下的所有檔案執行755許可權
[root@nginx-02 local]# chmod 755 -R apache-tomcat-8.0.33/
#進入tomcat目錄下的bin目錄
[root@nginx-02 local]# cd apache-tomcat-8.0.33/bin/
[root@nginx-02 bin]# ls
bootstrap.jar  catalina-tasks.xml            configtest.bat  digest.bat        setclasspath.sh  startup.bat      tomcat-native.tar.gz  version.bat
catalina.bat   commons-daemon.jar            configtest.sh   digest.sh         shutdown.bat     startup.sh       tool-wrapper.bat      version.sh
catalina.sh    commons-daemon-native.tar.gz  daemon.sh       setclasspath.bat  shutdown.sh      tomcat-juli.jar  tool-wrapper.sh
#使用bash命令執行startup.sh指令碼,啟動tomcat伺服器
[root@nginx-02 bin]# bash startup.sh 
Using CATALINA_BASE:   /usr/local/apache-tomcat-8.0.33
Using CATALINA_HOME:   /usr/local/apache-tomcat-8.0.33
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.33/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_171/jre
Using CLASSPATH:       /usr/local/apache-tomcat-8.0.33/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.33/bin/tomcat-juli.jar
Tomcat started.
#監測logs目錄下catalina.out檔案的日誌內容,檢視是否有報錯資訊,沒有則表示啟動成功
[root@nginx-02 bin]# tail -100f ../logs/catalina.out
複製程式碼

微信截圖_20191222171231.png

看到以上內容表示tomcat已成功啟動

  • 訪問tomcat伺服器(192.168.245.131),瀏覽器顯示以下內容,表示tomcat可以正常訪問

微信截圖_20191222172753.png

如果內容無法正常顯示,一般為防火牆問題,執行下面程式碼,重新重新整理訪問即可

#將8080埠加入防火牆規則列表
[root@nginx-02 bin]# firewall-cmd --add-port=8080/tcp --permanent
success
#重新載入防火牆配置檔案
[root@nginx-02 bin]# firewall-cmd --reload
success
複製程式碼

3. 配置Nginx反向代理

說明:
主機nginx-01為nginx伺服器	IP:192.168.245.130
主機nginx-02為Tomcat伺服器	IP:192.168.245.131
瀏覽器訪問主機nginx-01(192.168.245.130)80埠,代理到主機nginx-02(192.168.245.131)8080埠,瀏覽器顯示nginx-02(192.168.245.131)的tomcat內容,表示反向代理成功
複製程式碼

image.png

  • 編輯nginx.conf主配置檔案
vim /usr/local/nginx/conf/nginx.conf
複製程式碼
#配置server,可以理解為一個虛擬主機
server {
	#監聽埠
    listen       80;
    #監聽主機
    server_name  192.168.245.130;

	#路徑位置
    location / { 
        root   html;
		index  index.html index.htm;
		#被代理的伺服器,tomcat伺服器地址
        proxy_pass http://192.168.245.131:8080/;
    }   
}
複製程式碼
  • 重新讀取nginx.conf配置檔案,使配置生效
[root@nginx-01 sbin]# ls
nginx
[root@nginx-01 sbin]# ./nginx -s reload
複製程式碼

訪問nginx-01(192.168.245.130),檢視瀏覽器效果

微信截圖_20191222175515.png

案例二

需求:

​ 訪問192.168.245.130/house代理到192.168.245.131:8080/house

​ 訪問192.168.245.130/food代理到192.168.245.132:8090/food

微信截圖_20191231014351.png

  1. nginx-02、nginx-03安裝Tomcat和JDK

    這個在案列一已經詳細說明了,在此不再重複。

  2. 在nginx-02、nginx-03配置站點目錄

    • nginx-02(host:192.168.245.131:8080)

    微信截圖_20191231014351.png

    • nginx-03(host:192.168.245.132:8090)

    微信截圖_20191231020227.png

如果是在同伺服器部署多個Tomcat,為了避免埠衝突,是需要修改Tomcat的對外訪問埠8080;

如果是在不同的伺服器部署Tomcat,就不會存在埠的衝突問題,那麼埠也就可以不用修改了,當然如果你想修改,也是可以的;

  1. 修改nginx-03的Tomcat服務埠號
[root@nginx-03 conf]# pwd
/usr/local/apache-tomcat-8.0.33-8090/conf
[root@nginx-03 conf]# vim server.xml 
複製程式碼

微信截圖_20191231021031.png

  1. 啟動nginx-02、nginx-03的Tomcat服務
  • nginx-02

    微信截圖_20191231021812.png

    微信截圖_20191231024605.png

  • nginx-03

    微信截圖_20191231021526.png

    微信截圖_20191231024719.png

  1. 配置nginx反向代理

    • 編輯nginx.conf檔案,新增代理配置

    微信截圖_20191231022042.png

server {
    # 監聽埠
    listen       80; 
    # 表示監聽本地主機,建議寫Ip地址
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    # 當請求的url中包含house的內容時,代理到http://192.168.245.131:8080/house站點中
    location ~ /house {
    	proxy_pass http://192.168.245.131:8080;
    }

    # 當請求的url中包含food的內容時,代理到http://192.168.245.132:8090/food站點中
    location ~ /food {
    	proxy_pass http://192.168.245.132:8090;
    }
}
複製程式碼
  • location指令說明

語法:

location [= | ~ | ~* | ^~ | ^~] uri {

}
複製程式碼
  1. =:用於不含正規表示式的uri前,要求請求字串與uri嚴格匹配,如果匹配成功,就停止繼續向下搜尋並立即處理該請求。
  2. ~:用於表示uri包含正規表示式,並且區分大小寫
  3. ~*:用於表示uri包含正規表示式,並且不區分大小寫
  4. ^~:用於不含正規表示式的uri前,要求nginx伺服器找到標識uri和請求字串匹配度最高的location後,立即使用此location處理請求,而不再使用location塊中的正則uri和請求字串做匹配。

*注意:如果uri包含正規表示式,則必須要有~或者~標識。

  1. 重新載入nginx.conf配置檔案,使配置生效
[root@nginx-01 sbin]# ./nginx -s reload
複製程式碼
  1. 效果展示
  • 訪問192.168.245.130/house返回192.168.245.131:8080/house

微信截圖_20191231024017.png

  • 訪問192.168.245.130/food返回192.168.245.132:8090/food

微信截圖_20191231024341.png

5.2負載均衡

什麼是負載均衡?

負載平衡(Load balancing)是一種計算機技術,用來在多個計算機(計算機叢集)、網路連線、CPU、磁碟驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個伺服器元件,取代單一的元件,可以通過冗餘提高可靠性。負載平衡服務通常是由專用軟體和硬體來完成。 主要作用是將大量作業合理地分攤到多個操作單元上進行執行,用於解決網際網路架構中的高併發高可用的問題。

引用於《維基百科》

舉個例子:比如某飯店為了提升飯店的服務能力,飯店可能會僱傭多個廚師,而這些廚師就組成了一個廚師叢集。而當使用者在店內點菜的時候,就需要一個專業人員能夠把所有客戶的選單均勻的分配給店內的廚師。這樣才能最大程度的提升飯店的服務能力。

image.png

nginx實現負載均衡配置

需求:訪問nginx-01(192.168.245.130:80)將流量均衡到nginx-02(192.168.245.131:8080)和nginx-03(192.168.245.132:8080)

  1. 配置nginx-02(192.168.245.131:8080)

image.png

  1. 配置nginx-03(192.168.245.132:8080)

image.png

  1. 配置nginx-01(192.168.245.130:80)nginx負載均衡

image.png

upstream tomcatserver{
    server 192.168.245.131:8080;
    server 192.168.245.132:8080;
}

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
    	proxy_pass http://tomcatserver;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
    }
}
複製程式碼
  1. 效果展示

Nginx-負載均衡.gif

nginx負載均衡策略

nginx為了方便我們解決負載問題,提供了幾種負載均衡的演算法模式,使我們可以根據需求場景去選擇負載均衡的方式。

  • 輪詢策略(預設演算法)
upstream tomcatserver{
    server 192.168.245.131:8080;
    server 192.168.245.132:8080;
    server 192.168.245.133:8080;
    server 192.168.245.134:8080;
}
複製程式碼

輪詢演算法是nginx實現負載均衡的預設演算法。輪詢策略按照順序選擇組內(upstream模組配置的伺服器節點)伺服器處理請求。如果一個伺服器在處理請求的過程中出現錯誤,請求會被按照順序依次交給組內的下一個伺服器進行處理,依次類推,直到返回正常的響應為止。如果所有的組內伺服器都出現錯誤,則返回最後一個伺服器的處理結果。

  • weight策略(加權輪詢)
upstream tomcatserver{
    server 192.168.245.131:8080 weight=5;
    server 192.168.245.132:8080 weight=3;
    server 192.168.245.133:8080;
    server 192.168.245.134:8080;
}
複製程式碼

為upstream組內的伺服器設定權重,權重值高的伺服器被優先用於處理請求。此時組內伺服器的選擇策略為加權輪詢。組內所有伺服器的權重值預設為1,即採用輪詢的方式處理請求。

  • ip_hash策略
upstream tomcatserver{
	ip_hash;
    server 192.168.245.131:8080;
    server 192.168.245.132:8080;
    server 192.168.245.133:8080;
    server 192.168.245.134:8080;
}
複製程式碼

ip_hash用於實現會話保持功能,將某個客戶端的多次請求重定向到組內同一臺伺服器上,保證客戶端與伺服器之間建立穩定的會話。只有當伺服器處於無效的狀態時(down機),客戶端請求才會被下一個伺服器接收和處理。注意:使用ip_hash後不能使用weight;

  • fair(第三方演算法)
upstream tomcatserver{
	fair;
    server 192.168.245.131:8080;
    server 192.168.245.132:8080;
    server 192.168.245.133:8080;
    server 192.168.245.134:8080;
}
複製程式碼

按照upstream組內伺服器的響應時間來分配請求,響應時間短的優先分配,需要第三方模組的支援

5.3動靜分離

什麼是動靜分離?

談動靜分離之前,先說一下什麼是動,什麼是靜。

一般網站可以分為靜態網站、動態網站。靜態網站是指不需要去訪問資料庫資源的網站,通常稱為靜態網站。需要通過去查詢資料庫獲取資料庫的,我們一般稱為動態網站,動態網站可不是網站上可以動的動畫效果的網站就是動態網站哈

  • 動靜分離前

image.png

  1. 瀏覽器去請求Web伺服器Tomcat,tomcat上存放著網站執行時,需要使用到的靜態資原始檔如圖片、CSS樣式檔案、JavaScript指令碼檔案、.html檔案和動態指令碼檔案JSP。
  2. Tomcat收到使用者請求後,如果請求的JSP需要訪問資料庫的,會去資料庫查詢相關資料,並進行相關的邏輯處理,處理完成後將執行結果生成html通過Tomcat返回給瀏覽器。
  3. 瀏覽器拿到tomcat返回的html進行渲染,遇到圖片,CSS、JS指令碼資源時,瀏覽器非同步請求tomcat伺服器獲取檔案,tomcat返回瀏覽器請求的資原始檔,瀏覽器繼續渲染,迭代此操作,直到html頁面所需的資源全部載入完成。
  4. 瀏覽器展示渲染效果,也就是使用者看到的瀏覽器渲染後的頁面。
  • 動靜分離後

image.png

  1. 瀏覽器請求Nginx伺服器,nginx伺服器上存放著靜態資源,然後nginx直接把使用者請求的靜態資源響應給瀏覽器,瀏覽器拿到.html檔案後,進行渲染。渲染過程中如果還需要載入其他的靜態資源就再去請求nginx伺服器獲取,迭代此操作。
  2. 瀏覽器當需要請求介面時,先去請求nginx伺服器,nginx看到這是後端的介面地址時,把請求通過反向代理髮送給後端的tomcat伺服器。
  3. tomcat伺服器處理來自nginx傳送的請求,當tomcat需要去查詢資料庫時,再去訪問資料庫。tomcat把nginx發來的介面地址進行解析處理,處理完成後,生成.html/json內容,返回給Nginx伺服器,nginx伺服器再把結果響應給瀏覽器。
  4. 瀏覽器拿到nginx響應的內容進行渲染。
  5. 瀏覽器展示渲染效果,也就是使用者看到的瀏覽器渲染後的頁面。

動靜分離的好處

  1. api介面服務化:動靜分離之後,後端應用更為服務化,只需要通過提供api介面即可,可以為多個功能模組甚至是多個平臺的功能使用,可以有效的節省後端人力,更便於功能維護。
  2. 前後端開發並行:前後端只需要關心介面協議即可,各自的開發相互不干擾,並行開發,並行自測,可以有效的提高開發時間,也可以有些的減少聯調時間 。
  3. 減輕後端伺服器壓力,提高靜態資源訪問速度:後端不用再將模板渲染為html返回給使用者端,且靜態伺服器可以採用更為專業的技術提高靜態資源的訪問速度。
  4. 動靜分離後, 即使動態服務不可用, 但靜態資源不會受到影響

nginx實現動靜分離配置

為了更好的模擬動靜分離的效果。我們的需求如下:

  • 訪問nginx(192.168.245.130)時,通過nginx代理訪問我們的後端tomcat。
  • 訪問靜態資源(192.168.245.130/index.html)時,訪問nginx上的靜態資源站點
  • tomcat做tomcat叢集,避免因單臺tomcat死掉後,造成其他tomcat服務不可用。
  • tomcat全部死掉,靜態頁面也可以正常訪問。
  1. 配置tomcat服務,使用tomcat7和tomcat8用來模擬後端

    • tomcat7(:192.168.245.132:8080)

    image.png

    • tomcat-8(192.168.245.131:8080)

    image.png

  2. 配置靜態服務

image.png

nginx的原始碼安裝預設靜態資源目錄一般在/usr/local/nginx/html目錄下,在目錄下預設存放著Nginx的歡迎頁面檔案

  • 在nginx的配置檔案中配置靜態資源

image.png

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
	root /usr/local/nginx/html/food;
}
複製程式碼

root指令用於指定資源目錄的位置,這裡的意思是匹配到請求的uri中如果包含html、gif、jpg、png等字尾的靜態資原始檔時,去訪問/usr/local/nginx/html/food這個目錄下的資源。

  • 測試訪問nginx靜態資源(192.168.245.130:80/index.html)

image.png

  1. 在nginx中配置動態服務

image.png

攔截所有非靜態的資源請求,通過proxy_pass傳送到名為tomcatserver的upstream模組進行負載均衡(預設使用輪詢策略),將請求轉發給後端tomcat伺服器,實現負載和tomcat叢集。

至此,基本的動靜分離配置就完成了。

說明:

如果此時訪問通過nginx訪問後端服務如果發生如下情況屬於正常現象。

image-20200104210312897.png

原因如下:訪問後端服務時,因為需要載入靜態資原始檔,就觸發了靜態資源的訪問規則,這個時候就會去/usr/local/nginx/html/food目錄下面找,但實際上tomcat所需要的靜態資源並不在該目錄下,所以就找不到該資源,頁面樣式資原始檔找不到報404也就不足為奇了。但是後端服務是可以正常訪問的。通常情況下動靜分離後的網站架構,後端只提供介面的訪問服務,這裡只是為了演示效果。

相關文章