天天看點

nginx負載均衡

負載均衡

負載均衡(反向代理)概念

什麼是叢集?

  • 完成相同任務或者工作的一組伺服器(web01 web02 web03 --- web叢集)

Nginx代理服務基本概述

1.代理一詞往往并不陌生, 該服務我們常常用到如(代理理财、代理租房、代理收貨等等),如下圖所示

nginx負載均衡

2.在沒有代理模式的情況下,用戶端和 Nginx 服務端,都是用戶端直接請求服務端,服務端直接響應用戶端。

nginx負載均衡

3.那麼在網際網路請求裡面, 用戶端往往無法直接向服務端發起請求, 那麼就需要用到代理服務, 來實作用戶端和服務通信,如下圖所示

nginx負載均衡

什麼是代理?

  • 反向代理:外網 → (外網網卡)代理伺服器(内網網卡) → 公司網站伺服器web(内網)
  • 正向代理:内網(區域網路主機) → (内網網卡)代理伺服器(外網網卡) → 網際網路 → web伺服器(國外)

Nginx代理服務支援的協定

1.Nginx 作為代理服務,可支援的代理協定非常的多,具體如下圖

nginx負載均衡

2.如果将 Nginx 作為反向代理服務,常常會用到如下幾種代理協定,如下圖所示

nginx負載均衡

3.反向代理模式與 Nginx 代理子產品總結如表格

反向代裡模式 Nginx配置子產品
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module

Nginx負載均衡概述

什麼是負載均衡?
  • 實作使用者通路請求進行排程配置設定
  • 實作使用者通路壓力分擔

為什麼需要負載均衡

我們的 Web 伺服器直接面向使用者,往往要承載大量并發請求,單台伺服器難以負荷,我使用多台 WEB 伺服器組成叢集,前端使用 Nginx 負載均衡,将請求分散的打到我們的後端伺服器叢集中,實作負載的分發。那麼會大大提升系統的吞吐率、請求性能、高容災

nginx負載均衡

往往我們接觸的最多的是 SLB(Server Load Balance)負載均衡,實作最多的也是 SLB、那麼 SLB 它的排程節點和服務節點通常是在一個地域裡面。那麼它在這個小的邏輯地域裡面決定了他對部分服務的實時性、響應性是非常好的。

是以說當海量使用者請求過來以後,它同樣是請求排程節點,排程節點将使用者的請求轉發給後端對應的服務節點,服務節點處理完請求後在轉發給排程節點,排程節點最後響應給使用者節點。這樣也能實作一個均衡的作用,那麼Nginx 則是一個典型的 SLB

Nginx負載均衡配置場景

1.四層負載均衡

所謂四層負載均衡指的是 OSI 七層模型中的傳輸層,那麼傳輸層 Nginx 已經能支援 TCP/IP 的控制,是以隻需要對用戶端的請求進行 TCP/IP 協定的包轉發就可以實作負載均衡,那麼它的好處是性能非常快、隻需要底層進行應用處理,而不需要進行一些複雜的邏輯

nginx負載均衡
2.七層負載均衡

七層負載均衡它是在應用層,那麼它可以完成很多應用方面的協定請求,比如我們說的 http 應用的負載均衡,它可以實作 http 資訊的改寫、頭資訊的改寫、安全應用規則控制、 URL 比對規則控制、以及轉發、 rewrite 等等的規則,是以在應用層的服務裡面,我們可以做的内容就更多,那麼 Nginx 則是一個典型的七層負載均衡 SLB

nginx負載均衡
3.四層負載均衡與七層負載均衡差別

四層負載均衡資料包在底層就進行了分發,而七層負載均衡資料包則是在最頂層進行分發、由此可以看出,七層負載均衡效率沒有四負載均衡高。

但七層負載均衡更貼近于服務,如:http 協定就是七層協定,我們可以用 Nginx 可以作會話保持, URL 路徑規則比對、 head 頭改寫等等,這些是四層負載均衡無法實作的

Nginx負載均衡排程算法

排程算法 概述
輪詢 按時間順序逐一配置設定到不同的後端伺服器(預設)
weight 權重輪詢,weight值越大,配置設定到的通路幾率越高
ip_hash 每個請求按通路IP的hash結果配置設定,這樣來自同一IP的固定通路一個後端伺服器
url_hash 按照通路URL的hash結果來配置設定請求,是每個URL定向到同一個後端伺服器
least_conn 最少連接配接數,那個機器連接配接數少就分發

Nginx負載均衡配置參數

狀态
down 目前的server暫時不參與負載均衡
backup 預留的備用伺服器
max_fails 允許請求失敗的次數
fail_timeout 經過max_fails失敗後,服務暫停時間
max_conns 限制最大的接收連接配接數

Nginx反向代理負載均衡關系圖

nginx負載均衡

負載均衡環境準備

負載均衡伺服器部署

第一個曆程:安裝nginx

[root@lb01 ~]# yum -y install nginx
           

第二個曆程:編寫nginx負載均衡服務配置檔案

nginx子產品:ngx_http_upstream_module --- upstream 負載均衡

nginx子產品:ngx_http_proxy_module --- proxy_pass 反向代理

[root@lb01 nginx]# vim nginx.conf
user  www;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

[root@lb01 conf.d]# vim lb.conf 
upstream test {
  server 10.0.1.7:80;
  server 10.0.1.8:80;
  server 10.0.1.9:80;
}
server {
    listen       80;
    server_name  blog.test.com;
    location / {
      proxy_pass http://test;    
    }
}
           
nginx負載均衡

測試

nginx負載均衡

負載均衡通路網站異常排錯思路

第一步:負載均衡	測試後端web節點伺服器是否能夠正常通路
第二步:負載均衡	利用curl指令通路負載均衡伺服器
第三步:打開一個Xshell連接配接 ping域名或IP位址
第四步:配置檔案編寫不正确
           

負載均衡配置子產品詳細說明

負載均衡:ngx_http_upstream_module

實作不同排程功能

  • 輪詢配置設定請求(平均)
  • 權重配置設定請求(能力越強責任越重)
[root@lb01 conf.d]# vim /etc/nginx/conf.d/lb.conf 
upstream test {
  server 10.0.1.7:80 weight=3;
  server 10.0.1.8:80 weight=2;
  server 10.0.1.9:80 weight=1;
}
           
  • 實作熱備功能
[root@lb01 conf.d]# vim /etc/nginx/conf.d/lb.conf 
upstream test {
  server 10.0.1.7:80 ;
  server 10.0.1.8:80 ;
  server 10.0.1.9:80 backup;
}
           
  • 定義最大失敗次數(健康檢查參數)
[root@lb01 conf.d]# vim /etc/nginx/conf.d/lb.conf 
upstream test {
  server 10.0.1.7:80 max_fails=5;
  server 10.0.1.8:80 ;
  server 10.0.1.9:80 ;
}
           
  • 定義失敗之後重發得到間隔時間(健康檢查參數)
[root@lb01 conf.d]# vim /etc/nginx/conf.d/lb.conf 
upstream test {
  server 10.0.1.7:80 fail_timeout=10s;		-- 會給失敗的伺服器一次機會
  server 10.0.1.8:80 ;
  server 10.0.1.9:80 ;
}
           

實作不同的排程算法

  • rr 輪詢排程算法
  • weight 權重排程算法
  • ip_hash 算法(當通路登入網站出現反複登入的時候需要配置)
  • least_conn 根據伺服器連接配接數配置設定資源

反向代理:ngx_http_proxy_module

Nginx反向代理配置文法
1.Nginx代理配置文法
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/
           
2.添加傳遞給後端伺服器的請求頭資訊
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 使用者請求的時候 HOST 的值是 www.oldboy.com, 那麼代理服務會像後端傳遞請求的還是 www.oldboy.com
proxy_set_header Host $http_host;
# 将$remote_addr 的值放進變量 X-Real-IP 中, $remote_addr 的值為用戶端的 ip
proxy_set_header X-Real-IP $remote_addr;
# 用戶端通過代理服務通路後端服務, 後端服務通過該變量會記錄真實用戶端位址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           
3.代理到後端的TCP連接配接數,響應,傳回等逾時時間
//nginx 代理與後端伺服器連接配接逾時時間(代理連接配接逾時)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
//nginx 代理等待後端伺服器的響應時間
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
//後端伺服器資料回傳給 nginx 代理逾時時間
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

           
4.代理緩沖區
//nignx 會把後端傳回的内容先放到緩沖區當中,然後再傳回給用戶端,邊收邊傳, 不是全部接收完再傳給用戶端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
//設定 nginx 代理儲存使用者頭資訊的緩沖區大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
//proxy_buffers 緩沖區
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

           
  • 通路不同的網站位址,不能顯示不同的網站頁面
#如想實作通路不同的網站位址,顯示不同的網站頁面則需要配置以下參數
  location / {
      proxy_pass http://test;
      proxy_set_header Host $host;
    }

           
  • 對通路網站使用者真實位址資訊無法進行統計
#如想實作對通路網站使用者真實位址資訊進行統計則配置以下參數
proxy_set_header X-Forwarded-For $remote_addr;
 location / {
      proxy_pass http://test;
      proxy_set_header X-Forwarded-For $remote_addr;
    }

           
  • 通路負載均衡會出現錯誤頁面,影響使用者體驗
#如想實作通路負載均衡不會出現錯誤頁面
   location / {
      proxy_next_upstream http_404 http_403; 
    }

           

負載均衡應用

根據使用者通路的uri資訊進行負載均衡

nginx負載均衡
伺服器 IP位址
web01 10.0.1.7
web02 10.0.1.8
web03 10.0.1.9
lb01 10.0.1.5

第一個曆程:架構環境規劃

- /upload	叢集-10.0.1.8:80	html/www/upload		upload伺服器叢集
- /static	叢集-10.0.1.7:80	html/www/statice	static伺服器叢集
- /			叢集-10.0.1.9:80	html/www			default伺服器叢集

           

web01上進行環境部署

[root@web01 ~]# mkdir /html/www/static
[root@web01 ~]# echo "static-web_10.0.1.7" >/html/www/static/index.html

           

web02上進行環境部署

[root@web02 ~]# mkdir /html/www/upload
[root@web02 ~]# echo "upload-web_10.0.1.8" >/html/www/upload/index.html


           

web03上進行環境部署

[root@web03 ~]# echo "default-web_10.0.1.9" >/html/www/index.html

           

第二個曆程:編寫負載均衡配置檔案

[root@lb01 ~]# vim /etc/nginx/conf.d/lb.conf 
upstream static {
  server 10.0.1.7:80;
}
upstream upload {
  server 10.0.1.8:80;
}
upstream default {
  server 10.0.1.9:80;
}
server {
    listen       80;
    server_name  www.test.com;
    location / {
      proxy_pass http://default;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_next_upstream error timeout http_404 http_403 http_502;
    }
    location /static/ {
      proxy_pass http://static;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_next_upstream error timeout http_404 http_403 http_502;
   }
    location /upload/ {
      proxy_pass http://upload;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_next_upstream error timeout http_404 http_403 http_502;
    }
}

           

第三個曆程:進行通路測試

[root@lb01 ~]# curl -H host:www.test.com 10.0.1.5
default-web_10.0.1.9
[root@lb01 ~]# curl -H host:www.test.com 10.0.1.5/static/
static-web_10.0.1.7
[root@lb01 ~]# curl -H host:www.test.com 10.0.1.5/upload/
upload-web_10.0.1.8
[root@lb01 ~]# 

           
nginx負載均衡

網站叢集動靜分離總結

  • 提高網站服務安全性
  • 管理操作工作簡化
  • 可以劃分不同人員管理不同叢集伺服器

根據使用者通路的終端資訊顯示不同頁面

nginx負載均衡

第一個曆程:準備環境

iphone	www.test.com	---	iphone_access	10.0.1.7:80	移動端叢集
谷歌		www.test.com	---	google_access	10.0.1.8:80	web端叢集
IE 360	 www.test.com	---	default_access	10.0.1.9:80	deault端叢集

           
[root@web01 ~]# echo "iphone_access 10.0.1.7" > /html/www/index.html

           
[root@web02 ~]# echo "google_access 10.0.1.8" >/html/www/index.html

           
[root@web03 ~]# echo "default_access 10.0.1.9" >/html/www/index.html 

           

第二個曆程:配置負載均衡檔案

[root@lb01 ~]# vim /etc/nginx/conf.d/lb.conf 
upstream iphone {
  server 10.0.1.7:80;
}
upstream google {
  server 10.0.1.8:80;
}
upstream default {
  server 10.0.1.9:80;
}
server {
    listen       80;
    server_name  www.test.com;
    location / {
      if ($http_user_agent ~* iphone) {
          proxy_pass http://iphone;
      }
      if ($http_user_agent ~* Chrome) {
          proxy_pass http://google;
      }
      proxy_pass http://default;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_next_upstream error timeout http_404 http_403 http_502;
    } 
}   

           

[root@lb01 ~]# curl -A iphone -H host:www.test.com 10.0.1.5
iphone_access 10.0.1.7
[root@lb01 ~]# curl -A Chrome -H host:www.test.com 10.0.1.5
google_access 10.0.1.8
[root@lb01 ~]# curl -A xx -H host:www.test.com 10.0.1.5
default_access 10.0.1.9