摘要:實現負載均衡負載均衡是反向代理技術的一種運用。而實現負載均衡的核心在于如何將請求合理地分配給不同的后端服務器。
這是 Nginx 學習總結的第六篇,上一篇介紹到了 Nginx 學習總結(5) —— 反向代理,本文主要演示結合 proxy 和 upstream 模塊的使用來實現 Nginx 的負載均衡。
Nginx 官網中對 upstream 模塊的介紹:ngx_http_upstream_module 模塊用于定義可由 proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass 和 memcached_pass 指令引用的服務器組。
Context:http準備工作
在 VMware 上準備 3 臺服務器(centos_7_x64),分別安裝了 Nginx(1.12.0),它們能夠互相 ping 通,3臺服務器 IP 分別為:
192.168.4.221(Web 服務器 A)
192.168.4.222(Web 服務器 B)
192.168.4.223(反向代理服務器 C)
在 Web 服務器的根目錄下的 index.html 文件內容分別為:
Welcome to 192.168.4.221 !
反向代理配置Welcome to 192.168.4.222 !
在 Nginx 下配置反向代理,主要是 proxy 和 upstream 模塊的配置。我們將反向代理服務器 C 的配置修改成如下:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; } server { listen 80; server_name localhost; charset utf-8; location / { proxy_pass http://jochen; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
配置好之后,重啟反向代理服務器 C ,瀏覽器訪問 http://192.168.4.223 :
瀏覽器刷新頁面:
我們可以發現,訪問的內容的確是 Web 服務器 A 或 B 提供的內容,表明我們的反向代理是配置成功了。而且,響應內容是由 Web 服務器 A、B 依次輪流提供的。
實現負載均衡負載均衡是反向代理技術的一種運用。客戶端訪問服務器,服務器會把請求分發給其它多個不同的服務器(即反向代理),從而減輕了單個服務器處理海量請求的壓力,不會出現崩潰,即如圖:
在上面的配置中,我們沒有設置 upstream 的分配方式,默認情況下,這將采用輪詢的方式,即每個請求按時間逐一分配到不同的后端服務器。如果后端服務器 down 掉,能自動剔除。而實現負載均衡的核心在于如何將請求合理地分配給不同的后端服務器。
在現實生活中,不同服務器的 CPU 、內存、硬盤、網絡帶寬的性能都是不同的,因而它們各自的處理能力各不一樣。需要采用某種負載均衡調度算法,來將請求合理地分配給不同的后端服務器,以達到最佳化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。
在 Nginx 中,upstream 的分配方式有 5 種,分別是:
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; }
指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。如:
upstream jochen { server 192.168.4.221:80 weight=10; server 192.168.4.222:80 weight=20; }
每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; ip_hash; }
按后端服務器的響應時間來分配請求,響應時間短的優先分配。這個是第三方模塊,需要額外安裝。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; fair; }
按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個后端服務器,后端服務器為緩存時比較有效。這個是第三方模塊,需要額外安裝。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; hash $request_uri; hash_method crc32; }
在 upstream 模塊中,可以通過 server 指令定義服務器的地址和其他參數。地址可以指定為域名,或 IP 地址(端口可選,默認為80),或 "unix" 為前綴的套接字路徑。
Context: upstream
常用的參數有:
down 將服務器標記為永久不可用
weight 設置服務器的權重,默認情況下為 1
backup 將服務器標記為備份服務器。當主服務器不可用時,它將被傳遞請求
max_fails 允許請求失敗的次數,默認為 1
fail_timeout 在經歷了 max_fails 次失敗后,暫停服務的時間。max_fails 可以和 fail_timeout 一起使用
upstream jochen { server backend1.example.com weight=5; server 192.168.4.222:80 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; server backup1.example.com backup; }健康檢查
Nginx 自身是沒有針對負載均衡后端節點健康檢查的模塊,nginx_upstream_check_module 是專門用于負載均衡健康檢查的第三方模塊,由淘寶的姚偉斌大神開發,通過它可以用來檢測后端 server 的健康狀態。nginx_upstream_check_module 模塊會持續檢查 server 的狀態,如果某個 server 不可用,則請求就不會被轉發到該 server 上。項目地址:https://github.com/yaoweibin/... 。
下面的是一個帶負載均衡健康檢查的 nginx.conf 配置:
upstream jochen { server 192.168.4.221:80 weight=5 max_fails=2 fail_timeout=30s; server 192.168.4.222:80 weight=1 max_fails=2 fail_timeout=30s; check interval=5000 rise=2 fall=3 timeout=1000 type=http; check_http_send "HEAD / HTTP/1.0 "; check_http_expect_alive http_2xx http_3xx; } server { listen 80; server_name localhost; charset utf-8; location / { proxy_pass http://jochen; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /nginx-status { stub_status; access_log off; allow 192.168.4.220; deny all; } location /check-status { check_status; access_log off; allow 192.168.4.220; deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
重啟 Nginx 配置生效之后,可以看到 error.log 日志如下信息,說明 nginx_upstream_check_module 模塊已正常運行:
2018/03/29 15:12:48 [error] 46931#46931: enable check peer: 192.168.4.221:80 2018/03/29 15:12:50 [error] 46931#46931: enable check peer: 192.168.4.222:80
同時,訪問 http://192.168.4.223/check-status ,可以看到如下頁面:
上面配置的意思是,對 jochen 這個服務器組中的所有 server,每5秒檢測一次,請求 2 次正常則標記 server 狀態為up,如果檢測 3 次都失敗,則標記 server 的狀態為 down,超時時間為1秒。
nginx_upstream_check_module 模塊的指令詳情見 https://github.com/yaoweibin/...,常用指令說明如下:
check 為上游服務器添加運行狀況檢查,常用參數如下:
interval 向后端發送的健康檢查包的間隔
fall 如果連續失敗次數達到 fall_count,服務器就被認為是 down
rise 如果連續成功次數達到 rise_count,服務器就被認為是 up
timeout 后端健康請求的超時時間
type 健康檢查包的類型,包括 tcp、http、ajp、ssl_hello、mysql、fastcgi
check_http_send 配置 HTTP 監控檢查包發送的請求內容,為了減少傳輸數據量,推薦采用 HEAD 方法。
check_http_expect_alive 指定 HTTP 回復的成功狀態,默認認為 2XX 和 3XX 的狀態是健康的。
參考文章:
Nginx 反向代理和負載均衡配置
Module ngx_http_upstream_module
nginx 做負載均衡器以及 proxy 緩存配置
nginx_upstream_check_module
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/39872.html
摘要:配置信息主要分為六大部分全局設置事件設置服務器設置虛擬主機設置匹配設置反向代理設置。最大客戶端連接數由和決定作為服務器時,作為反向代理時,。參考文章服務器安裝及配置文件詳解的配置虛擬主機負載均衡和反向代理 這是 Nginx 學習總結的第二篇,上一篇介紹到了 Nginx 學習總結(1) —— 概述,這一篇會對 Nginx 的基本配置做一些總結。 Nginx 配置信息主要分為六大部分: m...
摘要:模塊化體系的內部結構是由核心部分和一系列的功能模塊所組成。除此之外,應用相關的功能都是在一系列的功能模塊中完成。將各功能模塊組織成一條鏈,當有請求到達的時候,請求依次經過這條鏈上的部分或者全部模塊進行處理。 Nginx 是什么 Nginx 是一款輕量的(相比 Apache、Lighttpd 而言)、高性能的 HTTP 服務器,同時也可以用作反向代理、負載平衡器和 HTTP 緩存。Ngi...
閱讀 1543·2023-04-25 18:56
閱讀 1496·2021-09-29 09:34
閱讀 1716·2021-09-22 15:51
閱讀 3505·2021-09-14 18:03
閱讀 1168·2021-07-23 17:54
閱讀 2027·2019-08-29 18:38
閱讀 2908·2019-08-29 12:38
閱讀 618·2019-08-26 13:41