負載均衡
負載均衡(反向代理)概念
什麼是叢集?
- 完成相同任務或者工作的一組伺服器(web01 web02 web03 --- web叢集)
Nginx代理服務基本概述
1.代理一詞往往并不陌生, 該服務我們常常用到如(代理理财、代理租房、代理收貨等等),如下圖所示
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5QDM1AjN2MTMx0iM1cTMwADMxEDOyATM5EDMy0CM0cDN0cTMvwFMxkTMwIzLcBDN3QDN3EzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
2.在沒有代理模式的情況下,用戶端和 Nginx 服務端,都是用戶端直接請求服務端,服務端直接響應用戶端。
3.那麼在網際網路請求裡面, 用戶端往往無法直接向服務端發起請求, 那麼就需要用到代理服務, 來實作用戶端和服務通信,如下圖所示
什麼是代理?
- 反向代理:外網 → (外網網卡)代理伺服器(内網網卡) → 公司網站伺服器web(内網)
- 正向代理:内網(區域網路主機) → (内網網卡)代理伺服器(外網網卡) → 網際網路 → web伺服器(國外)
Nginx代理服務支援的協定
1.Nginx 作為代理服務,可支援的代理協定非常的多,具體如下圖
2.如果将 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 負載均衡,将請求分散的打到我們的後端伺服器叢集中,實作負載的分發。那麼會大大提升系統的吞吐率、請求性能、高容災
往往我們接觸的最多的是 SLB(Server Load Balance)負載均衡,實作最多的也是 SLB、那麼 SLB 它的排程節點和服務節點通常是在一個地域裡面。那麼它在這個小的邏輯地域裡面決定了他對部分服務的實時性、響應性是非常好的。
是以說當海量使用者請求過來以後,它同樣是請求排程節點,排程節點将使用者的請求轉發給後端對應的服務節點,服務節點處理完請求後在轉發給排程節點,排程節點最後響應給使用者節點。這樣也能實作一個均衡的作用,那麼Nginx 則是一個典型的 SLB
Nginx負載均衡配置場景
1.四層負載均衡
所謂四層負載均衡指的是 OSI 七層模型中的傳輸層,那麼傳輸層 Nginx 已經能支援 TCP/IP 的控制,是以隻需要對用戶端的請求進行 TCP/IP 協定的包轉發就可以實作負載均衡,那麼它的好處是性能非常快、隻需要底層進行應用處理,而不需要進行一些複雜的邏輯
2.七層負載均衡
七層負載均衡它是在應用層,那麼它可以完成很多應用方面的協定請求,比如我們說的 http 應用的負載均衡,它可以實作 http 資訊的改寫、頭資訊的改寫、安全應用規則控制、 URL 比對規則控制、以及轉發、 rewrite 等等的規則,是以在應用層的服務裡面,我們可以做的内容就更多,那麼 Nginx 則是一個典型的七層負載均衡 SLB
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
[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;
}
}
測試
負載均衡通路網站異常排錯思路
第一步:負載均衡 測試後端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資訊進行負載均衡
伺服器 | 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 ~]#
網站叢集動靜分離總結
- 提高網站服務安全性
- 管理操作工作簡化
- 可以劃分不同人員管理不同叢集伺服器
根據使用者通路的終端資訊顯示不同頁面
第一個曆程:準備環境
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