使用nginx做負(fù)載均衡的模塊解讀
使用nginx做負(fù)載均衡的兩大模塊:
- upstream 定義負(fù)載節(jié)點(diǎn)池。
- location 模塊 進(jìn)行URL匹配。
- proxy模塊 發(fā)送請(qǐng)求給upstream定義的節(jié)點(diǎn)池。
upstream模塊解讀
nginx 的負(fù)載均衡功能依賴于 ngx_http_upstream_module模塊,所支持的代理方式有 proxy_pass(一般用于反向代理),fastcgi_pass(一般用于和動(dòng)態(tài)程序交互),memcached_pass,proxy_next_upstream,fastcgi_next_pass,memcached_next_pass 。
upstream 模塊應(yīng)該放于http{}標(biāo)簽內(nèi)。
模塊寫法:
upstream backend { ip_hash; server backend1.example.com weight=5; server backend2.example.com:8080; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; }
實(shí)例一:
upstream dynamic { zone upstream_dynamic 64k; server backend1.example.com weight=5; server backend2.example.com:8080 fail_timeout=5s slow_start=30s; server 192.0.2.1 max_fails=3; server backend3.example.com resolve; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; }
語(yǔ)法解釋:
nginx默認(rèn)支持四種調(diào)度算法
- 輪詢(rr),每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器故障,故障系統(tǒng)自動(dòng)清除,使用戶訪問(wèn)不受影響。
- 輪詢權(quán)值(weight),weight值越大,分配到的訪問(wèn)幾率越高,主要用于后端每個(gè)服務(wù)器性能不均的情況。
- ip_hash,每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣來(lái)自同一個(gè)IP的固定訪問(wèn)一個(gè)后端服務(wù)器,主要解決動(dòng)態(tài)網(wǎng)站session共享的問(wèn)題。
- url_hash,按照訪問(wèn)的URL的hash結(jié)果來(lái)分配請(qǐng)求,是每個(gè)URL定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率,nginx本身不支持,如果想使用需要安裝nginx的hash軟件包。
- fair,這個(gè)算法可以依據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能的進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,相應(yīng)時(shí)間短的優(yōu)先分配,默認(rèn)不支持,如果想使用需要安裝upstream_fail模塊。
- least_conn 最少鏈接數(shù),那個(gè)機(jī)器連接數(shù)少就分發(fā)。
server模塊的寫法
server IP 調(diào)度狀態(tài)
server指令指定后端服務(wù)器IP地址和端口,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。
- down 表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
- backup 預(yù)留的備份服務(wù)器,當(dāng)其他所有的非backup服務(wù)器出現(xiàn)故障或者忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因?yàn)檫@臺(tái)集群的壓力最小。
- max_fails 允許請(qǐng)求失敗的次數(shù),默認(rèn)是1,當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstream模塊定義的錯(cuò)誤。0表示禁止失敗嘗試,企業(yè)場(chǎng)景:2-3.京東1次,藍(lán)汛10次,根據(jù)業(yè)務(wù)需求去配置。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。京東是3s,藍(lán)汛是3s,根據(jù)業(yè)務(wù)需求配置。常規(guī)業(yè)務(wù)2-3秒合理。
例:如果max_fails是5,他就檢測(cè)5次,如果五次都是502.那么,他就會(huì)根據(jù)fail_timeout 的值,等待10秒,再去檢測(cè)。
server 如果接域名,需要內(nèi)網(wǎng)有DNS服務(wù)器,或者在負(fù)載均衡器的hosts文件做域名解析。server后面還可以直接接IP或IP加端口。
長(zhǎng)連接 keepalive
upstream backend { server backend2.example.com:8080; server backup1.example.com:8080 backup; keepalive 100; }
通過(guò)該指令配置了每個(gè)worker進(jìn)程與上游服務(wù)器可緩存的空閑連接的最大數(shù)量。
當(dāng)超出這個(gè)數(shù)量時(shí),最近最少使用的連接將被關(guān)閉。keepalive指令不限制worker進(jìn)程與上游服務(wù)器的總連接。
location / { # 支持keep-alive proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://backup; }
- 如果是http/1.0 需要配置發(fā)送"Connection: Keep-Alive" 請(qǐng)求頭。
- 上游服務(wù)器不要忘記開(kāi)啟長(zhǎng)連接支持。
連接池配置建議
- 總長(zhǎng)連接數(shù)是"空閑連接池"+"釋放連接池"的長(zhǎng)連接總數(shù)。
- 首先,長(zhǎng)連接配置不會(huì)限制worker進(jìn)程可以打開(kāi)的總連接數(shù)(超了的作為短連接)。另外連接池一定要根據(jù)場(chǎng)景合理進(jìn)行設(shè)置。
空閑連接池太小,連接不夠用,需要不斷建連接。
空閑連接池太大,空閑連接太多,還沒(méi)使用就超時(shí)。
建議只對(duì)小報(bào)文開(kāi)啟長(zhǎng)連接。
location 模塊解讀
location作用:基于一個(gè)指令設(shè)置URI。
基本語(yǔ)法:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location
- = 精確匹配,如果找到匹配=號(hào)的內(nèi)容,立即停止搜索,并立即處理請(qǐng)求(優(yōu)先級(jí)最高)
- ~ 區(qū)分大小寫
- ~* 不區(qū)分大小寫
- ^~ 只匹配字符串,不匹配正則表達(dá)式
- @ 指定一個(gè)命名的location,一般用于內(nèi)部重定義請(qǐng)求,location @name {…}
匹配是有優(yōu)先級(jí)的,不是按照nginx的配置文件進(jìn)行。
官方的例子:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
結(jié)論:
- / 匹配A。
- /index.html 匹配B
- /documents/document.html 匹配C
- /images/1.gif 匹配D
- /documents/1.jpg 匹配的是E。
測(cè)試用的例子:
location / { return 401; } location = / { return 402; } location /documents/ { return 403; } location ^~ /images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; }
測(cè)試結(jié)果(重點(diǎn)看):
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/ 402 [root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/index.html 401 [root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/documents/document.html 403 [root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/images/1.gif 404 [root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/dddd/1.gif 500
結(jié)果總結(jié):
匹配的優(yōu)先順序,=>^~(匹配固定字符串,忽略正則)>完全相等>~*>空>/ 。
工作中盡量將'='放在前面
proxy_pass 模塊解讀
proxy_pass 指令屬于ngx_http_proxy_module 模塊,此模塊可以將請(qǐng)求轉(zhuǎn)發(fā)到另一臺(tái)服務(wù)器。
寫法:
proxy_pass http://localhost:8000/uri/;
實(shí)例一:
upstream blog_real_servers { server 10.0.0.9:80 weight=5; server 10.0.0.10:80 weight=10; server 10.0.0.19:82 weight=15; } server { listen 80; server_name blog.etiantian.org; location / { proxy_pass http://blog_real_servers; proxy_set_header host $host; } }
- proxy_set_header:當(dāng)后端Web服務(wù)器上也配置有多個(gè)虛擬主機(jī)時(shí),需要用該Header來(lái)區(qū)分反向代理哪個(gè)主機(jī)名,proxy_set_header host $host;。
- proxy_set_header X-Forwarded-For :如果后端Web服務(wù)器上的程序需要獲取用戶IP,從該Header頭獲取。proxy_set_header X-Forwarded-For $remote_addr;
配置后端服務(wù)器接收前端真實(shí)IP
配置如下:
log_format commonlog '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
rs_apache節(jié)點(diǎn)的httpd.conf配置
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{U ser-Agent}i\"" combined修改日志記錄 apache LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b" common
proxy_pass相關(guān)的優(yōu)化參數(shù)
- client_max_body_size 10m; 允許客戶端請(qǐng)求的最大的單個(gè)文件字節(jié)數(shù)。
- client_body_buffer_size 128k; 緩沖區(qū)代理緩沖用戶端請(qǐng)求的最大字節(jié)數(shù) 可以理解為先保存到本地再傳給用戶。
- proxy_connect_timeout 600; 跟后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間。
- proxy_read_timeout 600; 連接成功后_等候后端服務(wù)器響應(yīng)時(shí)間_其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理。
- proxy_send_timeout 600; 后端服務(wù)器回傳數(shù)據(jù)時(shí)間,就是在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)。
- proxy_buffer_size 8k; 代理請(qǐng)求緩存區(qū),這個(gè)緩存區(qū)間會(huì)保存用戶的頭信息以供Nginx進(jìn)行規(guī)則處理,一般只要設(shè)置能保存下頭信息即可。
- proxy_buffers 4 32k; 同上 告訴Nginx保存單個(gè)頁(yè)面使用的空間大小,假設(shè)網(wǎng)頁(yè)大小平均在32k以下的話。
- proxy_busy_buffers_size 64k; 如果系統(tǒng)很忙的時(shí)候可以申請(qǐng)更大的proxy_buffers 官方推薦(proxy_buffers*2)。
- proxy_max_temp_file_size 1024m; 當(dāng) proxy_buffers 放不下后端服務(wù)器的響應(yīng)內(nèi)容時(shí),會(huì)將一部分保存到硬盤的臨時(shí)文件中,這個(gè)值用來(lái)設(shè)置最大臨時(shí)文件大小,默認(rèn)1024M,它與 proxy_cache 沒(méi)有關(guān)系。大于這個(gè)值,將從upstream服務(wù)器傳回。設(shè)置為0禁用。
- proxy_temp_file_write_size 64k; proxy緩存臨時(shí)文件的大小 proxy_temp_path(可以在編譯的時(shí)候)指定寫到哪那個(gè)目錄。
健康檢查
Nginx提供了health_check語(yǔ)句來(lái)提供負(fù)載(upstream)時(shí)的鍵康檢查機(jī)制(注意:此語(yǔ)句需要設(shè)置在location上下文中)。
支持的參數(shù)有:
- interval=time:設(shè)置兩次健康檢查之間的間隔值,默認(rèn)為5秒
- fails=number:設(shè)置將服務(wù)器視為不健康的連續(xù)檢查次數(shù),默認(rèn)為1次
- passes=number:設(shè)置一個(gè)服務(wù)器被視為健康的連續(xù)檢查次數(shù),默認(rèn)為1次
- uri=uri:定義健康檢查的請(qǐng)求URI,默認(rèn)為”/“
- match=name:指定匹配配置塊的名字,用記測(cè)試響應(yīng)是否通過(guò)健康檢測(cè)。默認(rèn)為測(cè)試返回狀態(tài)碼為2xx和3xx
一個(gè)簡(jiǎn)單的設(shè)置如下,將使用默認(rèn)值:
location / { proxy_pass http://backend; health_check; }
對(duì)就應(yīng)用,我們可以專門定義一個(gè)API用于健康檢查:/api/health_check,并只返回HTTP狀態(tài)碼為200。并設(shè)置兩次檢查之間的間隔值為1秒。這樣,health_check語(yǔ)句的配置如下:
health_check uri="/api/health_check" interval;
匹配match的方法
http { server { ... location / { proxy_pass http://backend; health_check match=welcome; } } match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; } }
match 例子舉例
- status 200;: status 等于 200
- status ! 500;: status 不是 500
- status 200 204;: status 是 200 或 204
- status ! 301 302;: status 不是301或302。
- status 200-399;: status 在 200 到 399之間。
- status ! 400-599;: status 不在 400 到 599之間。
- status 301-303 307;: status 是 301, 302, 303, 或 307。
- header Content-Type = text/html;: “Content-Type” 得值是 text/html。
- header Content-Type != text/html;: “Content-Type” 不是 text/html。
- header Connection ~ close;: “Connection” 包含 close。
- header Connection !~ close;: “Connection” 不包含 close。
- header Host;: 請(qǐng)求頭包含 “Host”。
- header ! X-Accel-Redirect;: 請(qǐng)求頭不包含 “X-Accel-Redirect”。
- body ~ "Welcome to nginx!";: body 包含 “Welcome to nginx!”。
- body !~ "Welcome to nginx!";: body 不包含 “Welcome to nginx!”。
一個(gè)完整的nginx實(shí)例
[root@lb01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #blog lb by oldboy at 201303 upstream blog_real_servers { server 10.0.0.9:80 weight=1 max_fails=1 fail_timeout=10s; server 10.0.0.10:80 weight=1 max_fails=2 fail_timeout=20s; } server { listen 80; server_name blog.etiantian.org; location / { proxy_pass http://blog_real_servers; include proxy.conf; } } } [root@lb01 conf]# cat proxy.conf proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
擴(kuò)展補(bǔ)充
只允許使用GET,HEAD,POST方法去請(qǐng)求
## Only allow these request methods ## if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
實(shí)戰(zhàn)
根據(jù)URI及l(fā)ocation實(shí)現(xiàn)動(dòng)靜分離。
最終實(shí)現(xiàn):
- /static/的URL都去訪問(wèn)10.0.0.9。
- /dynamic/的URL都去訪問(wèn)10.0.0.10。
- 圖片這些靜態(tài)文件去訪問(wèn)10.0.0.9。
- /upload/的URL都去訪問(wèn)10.0.0.10。
[root@lb01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #blog lb by oldboy at 201303 upstream static_pools { server 10.0.0.9:80; } upstream dynamic_pools { server 10.0.0.10:80; } upstream upload_pools { server 10.0.0.9:80; } server { listen 80; server_name blog.biglittleant.cn; location / { proxy_pass http://static_pools; include proxy.conf; } location /static/ { proxy_pass http://static_pools; include proxy.conf; } location ~* \.(gif|jpg|jpeg)$ { proxy_pass http://static_pools; include proxy.conf; } location /dynamic/ { proxy_pass http://dynamic_pools; include proxy.conf; } location /upload/ { proxy_pass http://upload_pools; include proxy.conf; } } }
實(shí)現(xiàn)蘋果手機(jī)和安卓手機(jī)訪問(wèn)不同的地址
server { listen 80; server_name blog.etiantian.org; location / { if ($http_user_agent ~* "android") { proxy_pass http://android_pools; } if ($http_user_agent ~* "iphone") { proxy_pass http://iphone_pools; } proxy_pass http://pc_pools; include extra/proxy.conf; } access_log off; }
參考文檔
到此這篇關(guān)于使用nginx做負(fù)載均衡的模塊解讀的文章就介紹到這了,更多相關(guān)nginx 負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx配置負(fù)載均衡的服務(wù)宕機(jī)了怎么處理
這篇文章主要為大家介紹了nginx配置負(fù)載均衡的服務(wù)宕機(jī)的處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Nginx/Openresty中啟用http2支持的方法教程
Openresty/Nginx默認(rèn)是不支持http2的,需要將http2模塊編譯進(jìn)應(yīng)用中。這篇文章主要給大家介紹了關(guān)于在Nginx/Openresty中啟用http2支持的方法教程,文中介紹的非常詳細(xì),對(duì)大家具有一的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07簡(jiǎn)介使用Nginx Plus的在線活動(dòng)監(jiān)控功能的方法
這篇文章主要介紹了簡(jiǎn)介使用Nginx Plus的在線活動(dòng)監(jiān)控功能的方法,注意其目前暫時(shí)為收費(fèi)項(xiàng)目,需要的朋友可以參考下2015-06-06Nginx服務(wù)器作反向代理時(shí)的緩存配置要點(diǎn)解析
這篇文章主要介紹了Nginx服務(wù)器作反向代理時(shí)的緩存配置要點(diǎn)解析,需要的朋友可以參考下2016-04-04nginx 代理域名到另外一個(gè)域名的實(shí)現(xiàn)方法
本文主要介紹了nginx 代理域名到另外一個(gè)域名的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05寶塔nginx部署前端頁(yè)面刷新報(bào)404錯(cuò)誤解決辦法
使用nginx部署前端項(xiàng)目是一篇非常詳細(xì)的教程,旨在幫助初學(xué)者使用Nginx來(lái)部署前端項(xiàng)目,這篇文章主要給大家介紹了關(guān)于寶塔nginx部署前端頁(yè)面刷新報(bào)404錯(cuò)誤的解決辦法,需要的朋友可以參考下2024-03-03Nginx的405 not allowed錯(cuò)誤解決方法
本文主要介紹了Nginx的405 not allowed錯(cuò)誤解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05