摘要:實(shí)現(xiàn)負(fù)載均衡負(fù)載均衡是反向代理技術(shù)的一種運(yùn)用。而實(shí)現(xiàn)負(fù)載均衡的核心在于如何將請(qǐng)求合理地分配給不同的后端服務(wù)器。
這是 Nginx 學(xué)習(xí)總結(jié)的第六篇,上一篇介紹到了 Nginx 學(xué)習(xí)總結(jié)(5) —— 反向代理,本文主要演示結(jié)合 proxy 和 upstream 模塊的使用來(lái)實(shí)現(xiàn) Nginx 的負(fù)載均衡。
Nginx 官網(wǎng)中對(duì) upstream 模塊的介紹:ngx_http_upstream_module 模塊用于定義可由 proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass 和 memcached_pass 指令引用的服務(wù)器組。
Context:http準(zhǔn)備工作
在 VMware 上準(zhǔn)備 3 臺(tái)服務(wù)器(centos_7_x64),分別安裝了 Nginx(1.12.0),它們能夠互相 ping 通,3臺(tái)服務(wù)器 IP 分別為:
192.168.4.221(Web 服務(wù)器 A)
192.168.4.222(Web 服務(wù)器 B)
192.168.4.223(反向代理服務(wù)器 C)
在 Web 服務(wù)器的根目錄下的 index.html 文件內(nèi)容分別為:
Welcome to 192.168.4.221 !
反向代理配置Welcome to 192.168.4.222 !
在 Nginx 下配置反向代理,主要是 proxy 和 upstream 模塊的配置。我們將反向代理服務(wù)器 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; } }
配置好之后,重啟反向代理服務(wù)器 C ,瀏覽器訪問(wèn) http://192.168.4.223 :
瀏覽器刷新頁(yè)面:
我們可以發(fā)現(xiàn),訪問(wèn)的內(nèi)容的確是 Web 服務(wù)器 A 或 B 提供的內(nèi)容,表明我們的反向代理是配置成功了。而且,響應(yīng)內(nèi)容是由 Web 服務(wù)器 A、B 依次輪流提供的。
實(shí)現(xiàn)負(fù)載均衡負(fù)載均衡是反向代理技術(shù)的一種運(yùn)用。客戶端訪問(wèn)服務(wù)器,服務(wù)器會(huì)把請(qǐng)求分發(fā)給其它多個(gè)不同的服務(wù)器(即反向代理),從而減輕了單個(gè)服務(wù)器處理海量請(qǐng)求的壓力,不會(huì)出現(xiàn)崩潰,即如圖:
在上面的配置中,我們沒(méi)有設(shè)置 upstream 的分配方式,默認(rèn)情況下,這將采用輪詢的方式,即每個(gè)請(qǐng)求按時(shí)間逐一分配到不同的后端服務(wù)器。如果后端服務(wù)器 down 掉,能自動(dòng)剔除。而實(shí)現(xiàn)負(fù)載均衡的核心在于如何將請(qǐng)求合理地分配給不同的后端服務(wù)器。
在現(xiàn)實(shí)生活中,不同服務(wù)器的 CPU 、內(nèi)存、硬盤、網(wǎng)絡(luò)帶寬的性能都是不同的,因而它們各自的處理能力各不一樣。需要采用某種負(fù)載均衡調(diào)度算法,來(lái)將請(qǐng)求合理地分配給不同的后端服務(wù)器,以達(dá)到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。
在 Nginx 中,upstream 的分配方式有 5 種,分別是:
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉,能自動(dòng)剔除。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; }
指定輪詢幾率,weight 和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況。如:
upstream jochen { server 192.168.4.221:80 weight=10; server 192.168.4.222:80 weight=20; }
每個(gè)請(qǐng)求按訪問(wèn) ip 的 hash 結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決 session 的問(wèn)題。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; ip_hash; }
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。這個(gè)是第三方模塊,需要額外安裝。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; fair; }
按訪問(wèn) url 的 hash 結(jié)果來(lái)分配請(qǐng)求,使每個(gè) url 定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。這個(gè)是第三方模塊,需要額外安裝。如:
upstream jochen { server 192.168.4.221:80; server 192.168.4.222:80; hash $request_uri; hash_method crc32; }
在 upstream 模塊中,可以通過(guò) server 指令定義服務(wù)器的地址和其他參數(shù)。地址可以指定為域名,或 IP 地址(端口可選,默認(rèn)為80),或 "unix" 為前綴的套接字路徑。
Context: upstream
常用的參數(shù)有:
down 將服務(wù)器標(biāo)記為永久不可用
weight 設(shè)置服務(wù)器的權(quán)重,默認(rèn)情況下為 1
backup 將服務(wù)器標(biāo)記為備份服務(wù)器。當(dāng)主服務(wù)器不可用時(shí),它將被傳遞請(qǐng)求
max_fails 允許請(qǐng)求失敗的次數(shù),默認(rèn)為 1
fail_timeout 在經(jīng)歷了 max_fails 次失敗后,暫停服務(wù)的時(shí)間。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 自身是沒(méi)有針對(duì)負(fù)載均衡后端節(jié)點(diǎn)健康檢查的模塊,nginx_upstream_check_module 是專門用于負(fù)載均衡健康檢查的第三方模塊,由淘寶的姚偉斌大神開(kāi)發(fā),通過(guò)它可以用來(lái)檢測(cè)后端 server 的健康狀態(tài)。nginx_upstream_check_module 模塊會(huì)持續(xù)檢查 server 的狀態(tài),如果某個(gè) server 不可用,則請(qǐng)求就不會(huì)被轉(zhuǎn)發(fā)到該 server 上。項(xiàng)目地址:https://github.com/yaoweibin/... 。
下面的是一個(gè)帶負(fù)載均衡健康檢查的 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 日志如下信息,說(shuō)明 nginx_upstream_check_module 模塊已正常運(yùn)行:
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
同時(shí),訪問(wèn) http://192.168.4.223/check-status ,可以看到如下頁(yè)面:
上面配置的意思是,對(duì) jochen 這個(gè)服務(wù)器組中的所有 server,每5秒檢測(cè)一次,請(qǐng)求 2 次正常則標(biāo)記 server 狀態(tài)為up,如果檢測(cè) 3 次都失敗,則標(biāo)記 server 的狀態(tài)為 down,超時(shí)時(shí)間為1秒。
nginx_upstream_check_module 模塊的指令詳情見(jiàn) https://github.com/yaoweibin/...,常用指令說(shuō)明如下:
check 為上游服務(wù)器添加運(yùn)行狀況檢查,常用參數(shù)如下:
interval 向后端發(fā)送的健康檢查包的間隔
fall 如果連續(xù)失敗次數(shù)達(dá)到 fall_count,服務(wù)器就被認(rèn)為是 down
rise 如果連續(xù)成功次數(shù)達(dá)到 rise_count,服務(wù)器就被認(rèn)為是 up
timeout 后端健康請(qǐng)求的超時(shí)時(shí)間
type 健康檢查包的類型,包括 tcp、http、ajp、ssl_hello、mysql、fastcgi
check_http_send 配置 HTTP 監(jiān)控檢查包發(fā)送的請(qǐng)求內(nèi)容,為了減少傳輸數(shù)據(jù)量,推薦采用 HEAD 方法。
check_http_expect_alive 指定 HTTP 回復(fù)的成功狀態(tài),默認(rèn)認(rèn)為 2XX 和 3XX 的狀態(tài)是健康的。
參考文章:
Nginx 反向代理和負(fù)載均衡配置
Module ngx_http_upstream_module
nginx 做負(fù)載均衡器以及 proxy 緩存配置
nginx_upstream_check_module
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39872.html
摘要:配置信息主要分為六大部分全局設(shè)置事件設(shè)置服務(wù)器設(shè)置虛擬主機(jī)設(shè)置匹配設(shè)置反向代理設(shè)置。最大客戶端連接數(shù)由和決定作為服務(wù)器時(shí),作為反向代理時(shí),。參考文章服務(wù)器安裝及配置文件詳解的配置虛擬主機(jī)負(fù)載均衡和反向代理 這是 Nginx 學(xué)習(xí)總結(jié)的第二篇,上一篇介紹到了 Nginx 學(xué)習(xí)總結(jié)(1) —— 概述,這一篇會(huì)對(duì) Nginx 的基本配置做一些總結(jié)。 Nginx 配置信息主要分為六大部分: m...
摘要:模塊化體系的內(nèi)部結(jié)構(gòu)是由核心部分和一系列的功能模塊所組成。除此之外,應(yīng)用相關(guān)的功能都是在一系列的功能模塊中完成。將各功能模塊組織成一條鏈,當(dāng)有請(qǐng)求到達(dá)的時(shí)候,請(qǐng)求依次經(jīng)過(guò)這條鏈上的部分或者全部模塊進(jìn)行處理。 Nginx 是什么 Nginx 是一款輕量的(相比 Apache、Lighttpd 而言)、高性能的 HTTP 服務(wù)器,同時(shí)也可以用作反向代理、負(fù)載平衡器和 HTTP 緩存。Ngi...
摘要:此外,其也能夠提供強(qiáng)大的反向代理功能。是由為俄羅斯訪問(wèn)量第二的站點(diǎn)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本發(fā)布于年月日。 keepalived+nginx 實(shí)現(xiàn)高可用雙機(jī)熱備 + 負(fù)載均衡架構(gòu) 1 準(zhǔn)備4個(gè)ubuntu16.04虛擬機(jī)(啟用網(wǎng)卡二并使用橋接模式):A服務(wù)器:192.168.0.103 主B服務(wù)器:192.168.0.104 主(備) 前端工程師學(xué)習(xí) Nginx ...
閱讀 1537·2023-04-25 18:56
閱讀 1484·2021-09-29 09:34
閱讀 1710·2021-09-22 15:51
閱讀 3483·2021-09-14 18:03
閱讀 1160·2021-07-23 17:54
閱讀 2018·2019-08-29 18:38
閱讀 2900·2019-08-29 12:38
閱讀 610·2019-08-26 13:41