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

1.什麼是Nginx?

Nginx是一個高性能的自由、開源的HTTP和反向代理服務器,特色是***佔用內存少***,併發性能強css

nginx能幹嗎?

  • 能夠做爲IMAP、POP三、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源碼包,用於安裝Nginxhtml

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

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++的編譯器)linux

  • 安裝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:會檢查當前系統的相關配置,也能夠經過參數指定相關配置參數nginx

make:編譯c++

make install:安裝web

若是以上操做沒有報錯,表示編譯安裝完成正則表達式

  • 測試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-0二、nginx-03安裝Tomcat和JDK

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

  2. 在nginx-0二、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-0二、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也就不足爲奇了。可是後端服務是能夠正常訪問的。一般狀況下動靜分離後的網站架構,後端只提供接口的訪問服務,這裏只是爲了演示效果。

相關文章
相關標籤/搜索