1. 程式人生 > 實用技巧 >Nginx的反向代理與負載均衡

Nginx的反向代理與負載均衡

1.1 叢集是什麼

  簡單地說,叢集就是指一組(若干個)相互獨立的計算機,利用高速通訊網路組成的一個較大的計算機服務系統,每個叢集節點(即叢集中的每臺計算機)都是執行各自服務的獨立服器。這些伺服器之間可以彼此通訊,協同向用戶提供應用程式、系統資源和資料,並以單一系統的模式加以管理。當用戶客戶機請求集群系統時,叢集給使用者的感覺就是一個單一獨立的伺服器,而實際上使用者請求的是一組叢集伺服器。

  開啟谷歌、百度的頁面,看起來好簡單,也許你覺得用幾分鐘就可以製作出相似的網頁,而實際上,這個頁面的背後是由成千上萬臺伺服器叢集協同工作的結果。而這麼多的伺服器維護和管理,以及相互協調工作也許就是讀者你未來的工作職責了。

  若要用一句話描述叢集,即一堆伺服器合作做同一件事,這些機器可能需要整個技術團隊架構、設計和統一協調管理,這些機器可以分佈在一個機房,也可以分佈在全國全球各個地區的多個機房。

1.2 為什麼要有叢集

  高效能、價格有效性、可伸縮性、高可用性

  透明性、可管理性、可編輯性

1.2.1 叢集種類

  負載均衡叢集 LB解決排程問題

  高可用叢集 HA解決單點故障問題(keeplived

  高效能運算叢集 HP 、網路計算叢集 GC

1.2.2 硬體裝置

  F5 裝置 A10

1.2.3 軟體

  nginx (7層 1.9版本之後支援4層)、LVS (4層)、HAproxy (4層 7層)

1.2.4 負載均衡概念說明

  對使用者的訪問請求進行排程管理

  對使用者的訪問請求進行壓力分擔

1.2.5 反向代理

  接收使用者請求代替使用者向後端訪問

  反向代理與資料轉發的區別

1.2.6 壓力測試的方式

  ab (apache裡的命令)

  通過yuminstallhttpd-tools 獲得

1.3 nginx反向代理實踐

1.3.1 地址規劃說明

HOSTNAME IP 說明
lb01 10.0.0.5 Nginx 主負載伺服器
lb02 10.0.0.6 nginx 輔負載伺服器
web01 10.0.0.8 web01伺服器
web02 10.0.0.7 web02伺服器
web03 10.0.0.9 web03伺服器
說明:以上為實際生產架構負載實現規劃內容

ip命令說明

ip address show  檢視ip地址
ip route show  檢視路由資訊

1.3.2 反向代理與資料轉發的區別

1.3.3 安裝部署nginx過程(安裝命令集)

yum install -y pcre-devel openssl-devel
mkdir -p /server/tools
cd /server/tools
wget -q http://nginx.org/download/nginx-1.10.3.tar.gz
ls -l nginx-1.10.3.tar.gz
useradd www -s /sbin/nologin -M
tar xf nginx-1.10.3.tar.gz
cd nginx-1.10.3
./configure  --user=nginx --group=nginx --prefix=/application/nginx-1.10.3 --with-http_stub_status_module  --with-http_ssl_module
make
make install
ln -s /application/nginx-1.10.3 /application/ngin

1.3.4 編寫nginx配置檔案(統一web伺服器配置)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       80;
        server_name  bbs.etiantian.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
      access_log  logs/access_bbs.log  main;
    }        
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
    }
}

1.3.5 統一nginx測試環境 (web檔案)

mkdir -p /application/nginx/html/{www,bbs}
for name in www bbs; do echo $name `hostname` >/application/nginx/html/$name/xiaoxinxin.html;done
for name in www bbs; do cat /application/nginx/html/$name/xiaoxinxin.html;done

1.3.6 測試

[root@lb01 ~]# curl -H host:bbs.etiantian.org  10.0.0.8/xiaoxinxin.html
bbs web01
[root@lb01 ~]# curl -H host:bbs.etiantian.org  10.0.0.7/xiaoxinxin.html
bbs web02
[root@lb01 ~]# curl -H host:bbs.etiantian.org  10.0.0.9/xiaoxinxin.html
bbs web03
[root@lb01 ~]# curl -H host:www.etiantian.org  10.0.0.8/xiaoxinxin.html
www web01
[root@lb01 ~]# curl -H host:www.etiantian.org  10.0.0.7/xiaoxinxin.html
www web02
[root@lb01 ~]# curl -H host:www.etiantian.org  10.0.0.9/xiaoxinxin.html
www web03

1.3.7 配置負載服務檔案

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;                                  
    upstream server_pools {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
    } 
    server {
        listen 80;
        server_name bbs.etiantian.org;
        location / {
            proxy_pass http://server_pools;
        }
    }

1.3.8 測試訪問

[root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.5/xiaoxinxin.html
bbs web03
[root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.5/xiaoxinxin.html
bbs web02
[root@lb01 conf]# curl -H host:bbs.etiantian.org 10.0.0.5/xiaoxinxin.html
bbs web01

1.4 nginx中常用模組說明

ngx_http_status_module
ngx_http_ssl_module
ngx_http_log_module
ngx_http_upstream_module
ngx_http_proxy_module

1.4.1 模組排程演算法

  ①. 定義輪詢排程演算法-rr-預設排程演算法

  ②. 定義權重排程演算法-wrr

  ③. 定義靜態排程演算法-ip_hash

  ④. 定義最小的連線數-least_conn

1.4.2 nginx反向代理相關兩個模組

  upstream 模組 類似與一個池塘,將nginx節點放置到池塘中

  proxy模組 用池塘裡面的nginx節點,利用pr oxy進行呼叫

1.4.3 upstream模組核心引數簡介

  weight 權重

  max_fails 拋得次數

  fail_timeout 失敗的超時時間

  backup 備份

1.4.4 weight 引數實踐 (權重)

upstream 模組只能在http區塊裡

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream server_pools{
         server 10.0.0.7:80 weight=1;
         server 10.0.0.8:80 weight=2;
    }
    server{
       listen 80;
       server_name bbs.etiantian.org;
       location / {
          proxy_pass http://server_pools;
       }
    }
}

測試

[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5
web02 www
[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5
web02 www

1.4.5 其他的引數說明

max_fails 失敗的嘗試次數

fail_timeout 失敗後的再次嘗試時間

backup 備份節點:所有的節點都掛掉後資料才會請求web01

server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10 ;
server 10.0.0.8:80 weight=2 max_fails=3 fail_timeout=10 backup;

測試,將web02停掉

[root@test tools]# curl 10.0.0.5
web02 www
[root@test tools]# curl 10.0.0.5
web02 www

停掉web02後

[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5
web01 www
[root@test tools]# curl 10.0.0.5

1.4.6 訪問抓包

使用者請求報文

負載均衡請求報文

說明:

hosts 主機頭不同,未配置proxy_set_header Host $host 引數,在負載均衡訪問的時候會不帶hosts資訊。

1.4.7 upsrteam引數詳細說明

upstream模組內參數 引數說明

server

10.0.10.8:80

負載均衡後面的RS配置,可以是IP或域名,如果埠不寫,預設是80埠。

高併發場景下, IP可換成域名,通過 DNS做負載均衡。

weigth=1 代表伺服器的權重,預設值是1。權重數字越大表示接受的請求比例越大。
max_fails=3

Nginx嘗試連線後端主機失敗的次數,這個值是配合 proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream 這三個引數來使用的。

當nginx接收後端伺服器返回這三個引數定義的狀態碼時,會將這個請求轉發給正常工作的後端伺服器,例如404、502、503、 Max_fails的預設值是1 ;

企業場景下建議2-3次。如京東1次,藍汛10次,根據業務需求去配置

fail_timeout=10s

在max_fails定義的失敗次數後,距離下次檢查的間隔時間,預設是10s ;

如果max_fails是5 ,它就檢測5次,如果5次都是502,那麼,它就會根據fail_timeout的值,等待10s再去檢查,還是隻檢查一次,

如果持續502,在不重新載入 Nginx配置的情況下,每隔10s都只檢查一次。常規業務2~3秒比較合理,比如京東3秒,藍汛3秒,可根據業務需求去配置。

backup

熱備配置(RS節點的高可用),當前面啟用的RS都失敗後會自動啟用熱備RS這標誌看這個伺服器作為備份伺服器,若主伺服器全部宕機了,就會向它轉發請求。

注意:當負載排程演算法為ip_hash時,後端伺服器在負載均衡排程中的狀態不能是weight和backup。

down 這標誌著伺服器永遠不可用,這個引數可配合ip_hash使用;類似與註釋。

weight :調節伺服器的請求分配權重。1.4.8 上述命令的說明如下: