java 微软 shell php Android 云计算 linux Windows centos apache 编程 wordpress mysql 程序员 nginx 开源 Ubuntu google Firefox Python

Nginx負載均衡集群介紹

1.1 集群簡介

1.1.1 什麽是集群

簡單說,集群就是一組(若幹個)相互獨立的計算機,利用高速通信網絡組成的一個較大的計算機服務系統,每個集群節點(即集群中的每臺計算機)都是運行各自服務的獨立服務器,這些服務器之間可以彼此通信,協同向用戶提供應用程序,系統資源和數據,並以單一系統的模式加以管理。當用戶客戶機請求集群系統時,集群給用戶的感覺就是一臺服務器幹一件事。

                           

1.2 集群的優勢特點

高性能(performance)

一些國家重要的計算密集型應用(如天氣預報,核試驗模擬等),需要計算機有很強的計算處理能力。以全世界現有的技術,即使是大型機,其計算能力也是有限的,很難單獨完成此任務。因為計算時間可能會相當長,也許幾天,甚至幾年或更久。因此,對於這類復雜的計算業務,便使用了計算機集群技術,集中有幾十甚至上百臺計算機進行計算。

高可用(availability)

   單一的計算機系統總會面臨設備損毀的問題,例如:CPU,內存,主板,電源,硬盤等,只要一個部件壞掉,這個計算機系統就有可能會宕機,無法正常提供服務。在集群系統中,盡管硬件和軟件也還是會發生故障,但整個系統的服務可以是每天24*7可用的。

數據不能丟

網站7*24不宕機

用戶的體驗好

高可用性集群常用的開源軟件包括keepalived,heartbeat等。

1.3 集群的分類

計算機集群架構按功能和結構可以分成以下幾類:

負載均衡集群(load balancing clusters),簡稱LBC或LB.

高可用性集群(HIGH-availability(HA)clusters),簡稱HAC.

高性能計算集群(High-performance(HPC)clusters),簡稱HPC。

網格計算(grid computing)

提示:負載均衡和高可用性集群是互聯網行業常用的集群架構模式。

負載均衡集群的作用為:

分擔用戶訪問請求及數據流量(負載均衡)。

保持業務連續性,即7*24小時服務(高可用性)

應用於web業務及數據庫從庫(讀)等服務器的業務。

負載均衡集群典型的開源軟件包括LVS,Nginx,Haproxy等

1.4 常見的集群軟硬件介紹

互聯網企業常用的開源集群軟件有:Nginx(7 [v1.9] 4),LVS(4層),haproxy(4,7),keepalived,heartbeat.

應用層(http HTTPS)

傳輸層(tcp)

互聯網企業常用的商業集群硬件有:F5,netscaler,radware,A10等,工作模式相當於haproxy的工作模式。

淘寶,趕集網,新浪等公司曾使用過Netscaler負載均衡產品。

當企業業務重要,技術力量有薄弱,並且希望出錢購買產品及獲取更好的服務時,可以選擇硬件負載均衡產品,如F5,Netscaler,Radware等,此類公司多為傳統的大型非互聯網企業,如銀行,證券,金融,寶馬,奔馳等。

對於門戶網站來說,大多會並用軟件及硬件產品來分擔單一產品的風險,如淘寶,騰訊,新浪等。融資了的企業會購買硬件產品,如趕集網等網站。

中小型互聯網企業,由於起步階段無利潤可賺或利潤很低,會希望通過使用開源免費的方案來解決問題,因此會雇傭專門的運維人員進行維護。

第2章 Nginx負載均衡集群介紹

2.1 反向代理與負載均衡概念簡介

嚴格的說,nginx僅僅是作為nginxproxy反向代理使用的,因為這個反向代理功能表現的效果是負載均衡的效果,所以本文稱之為nginx負載均衡。那麽反向代理和負載均衡有什麽區別?

普通負載均衡軟件,例如大名鼎鼎的LVS,其實現的功能只是對請求數據包的轉發(也可能會改寫數據包),傳遞,其中DR模式明顯的特征是從負載均衡下面的節點服務器來看,接收到的請求還是來自訪問負載均衡器的客戶端的真實用戶,而反向代理就不一樣了,反向代理接受訪問用戶的請求後,會代理用戶重新發起請求代理下的節點服務器,最後把數據返回給客戶端用戶,在節點服務器看來,訪問的節點服務器的客戶端用戶就是反向代理服務器了,而非真實的網站訪問用戶。

2.2 負載均衡演示

2.2.1 web服務器上配置站點

2.2.1.1web服務器上配置站點,操作前先備份

[root@web01 ~]# cp/application/nginx/conf/nginx.conf{,.bak.lb}

2.2.1.2創建配置文件

vim/application/nginx/conf/nginx.conf

 

  worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '

                      '$status $body_bytes_sent"$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

 

   server {

        listen       80;

        server_name  www.etiantian.org;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

        access_log  logs/access_www.log  main;

   }

        server {

        listen       80;

        server_name  bbs.etiantian.org;

        location / {

            root   html/bbs;

            index  index.html index.htm;

        }

        access_log  logs/access_bbs.log  main;

   }

}

 

2.2.1.3創建站點並追加內容到站點目錄主頁內容

mkdir -p/application/nginx/html/{www,bbs}

for dir in www bbs;do echo"`ifconfig eth0|egrep -o "10.0.0.[0-9]+"` $dir">/application/nginx/html/$dir/bingbing.html;done

2.2.1.4檢查語法並重啟服務

/application/nginx/sbin/nginx -t

/application/nginx/sbin/nginx -s reload

2.2.1.5lb01 上面進行測試

curl 10.0.0.7/bingbing.html

curl 10.0.0.8/bingbing.html

curl 10.0.0.9/bingbing.html

2.2.2 負載均衡服務器上配置服務

2.2.2.1在負載均衡lb01上配置配置文件()

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

 

   upstreamserver_pools {

         server 10.0.0.7;

         server 10.0.0.8;

         server 10.0.0.9;

    }      

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

      }

   }

}

注:多台负载均衡都要配置upstream服务器地址池。

2.2.2.2重启配置文件

[root@lb01 conf]# /application/nginx/sbin/nginx-t

nginx: the configuration file/application/nginx-1.10.2/conf/nginx.conf syntax is ok

nginx: configuration file/application/nginx-1.10.2/conf/nginx.conf test is successful

[root@lb01 conf]# lsof -i:80

command  PID USER  FD   type DEVICE SIZE/OFF NODENAME

nginx   4717 root   6u  IPv4  16704     0t0  TCP *:http (LISTEN)

nginx   4719 www    6u  IPv4 16704      0t0  TCP *:http (LISTEN)

[root@lb01 conf]#/application/nginx/sbin/nginx -s reload

2.2.2.3测试结果

[root@lb01-05 conf]# curl10.0.0.5/bingbing.html

10.0.0.9

10.0.0.255 www

[root@lb01-05 conf]# curl10.0.0.5/bingbing.html

10.0.0.7

10.0.0.255 www

[root@lb01-05 conf]# curl10.0.0.5/bingbing.html

10.0.0.8

10.0.0.255 www

 

第3章 负载均衡模块说明

nginx http 功能模块

模块说明

ngx_http_proxy_module

proxy代理模块,用于把请求后抛给服务器节点或upstream 服务器池。

ngx_http_upstream_module

负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查,创建一个池子,web服务器。

 

3.1 Nginxupstream模塊

nginx的負載均衡功能依賴於ngx_httpstream_module模塊,所支持的代理方式包括proxy_pass,fastcgi_pass,memcached_pass等,新版nginx軟件支持的方式有所增加。

ngx_http_upstream_module模塊允許nginx定義一組或多組節點服務器組,使用時可以通過proxy_pass代理方式把網站的請求發送到實現定義好的對應的upstream組的名字上,具體寫法為“proxy_pass  http://www_server_pools”,其中www_server_pools就是一個upstream節點服務器組的名字。

3.1.1 upstream的server標簽參數說明

server标签

参数说明

server 10.0.0.8:80

负载均衡后面的RS配置,可以是ip或域名,如果端口不写,默认是80端口。高并发场景下,IP可以换成域名,通过DNS做负载均衡。

weight=1

代表服务器的权重,默认值是1.权重数字越大表示接受的请求比例越大。

max_fails=1

nginx尝试连接后端主机的次数,这个数值是配合proxy_next_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用,当nginx接收后返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,列如404,502,503,max_fails的默认值是1;企业场景:建议2-3次,京东1次,蓝汛10次(CDN),根据业务需求去配置。

fail_timeout=10s

在max_fails定义的失败次数后,距离下次检查的间隔时间,默认是10s,如果max_fails是5,它就检测5次,如果5次都是502。那么,他就会根据fail_timeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载nginx配置的情况下,每隔10s都只检测一次,常规业务2-3秒比较合理,比如京东3秒,蓝汛3秒,可根据业务需求去配置。

backup

热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS,这标志这个服务器作为备份服务器,若主服务器全部宕机了,就会向他转发请求;注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能使weight和backup。

3.1.1.1nginx upstream weight标签测试

  • 操作前备份

[root@lb01 ~]# cd/application/nginx/conf/

[root@lb01 conf]# pwd

/application/nginx/conf

[root@lb01 conf]# hostname

lb01

[root@lb01 conf]# cpnginx.conf{,.bak.before.upsteam}

[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;

   

   

   upstreamserver_pools {

         server 10.0.0.7:80weight=2;

         server 10.0.0.8:80weight=1;

         server 10.0.0.9:80weight=1;

    }       

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

      }

   }

}

  • 检查语法并重启

/application/nginx/sbin/nginx -t

 

lsof -i:80

/application/nginx/sbin/nginx

  • 测试结果

curl 10.0.0.5/bingbing.html

for i in {1..10};do curl10.0.0.5/bingbing.html;done

3.1.1.2nginx upstream  max_fails和 fail_timeout标签测试

  • 修改配置文件

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type  application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   

   

   upstream server_pools {

         server 10.0.0.7:80 weight=4 max_fails=3 fail_timeout=30s;

         server 10.0.0.8:80 weight=4 max_fails=3 fail_timeout=30s;

#         server 10.0.0.9:80 weight=1;

   }      

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

      }

   }

}

  • 测试结果:

for n in {1..1000};do curl -s  10.0.0.5/bingbing.html|grep"[78]$";sleep 1;date +%T;done

 

sed -i 'N;s#\n10.0.0.255# #g'/application/nginx/html/{www,bbs}/bingbing.html

3.1.1.3nginx upstream backup标签 测试

  • 修改配置文件

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type  application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   

   

   upstream server_pools {

         server 10.0.0.7:80 weight=4 max_fails=3fail_timeout=30s;

         server 10.0.0.8:80 weight=4 max_fails=3 fail_timeout=30s;

         server 10.0.0.9:80 weight=4 max_fails=3fail_timeout=30s backup;

   }      

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

      }

   }

}

3.2 upstream模块调度算法

调度算法一般分为两类,第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr,wrr,ip_hash等都属于静态调度算法。

 

 

第二类为动态调度算法,即

 

3.2.1 WRR权重轮询

 

 

3.2.2 RR轮询

 

3.2.3 IP_hash(静态调度算法)

 

 

3.2.4 least_conn

 

 

 

#####nginx.conf 多个虚拟主机

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   

   upstream server_pools {

         server 10.0.0.7:80 weight=4max_fails=3 fail_timeout=30s;

         server 10.0.0.8:80 weight=4max_fails=3 fail_timeout=30s;

         server 10.0.0.9:80 weight=4max_fails=3 fail_timeout=30s;

   }      

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

        proxy_set_header host $host;

      }

   }

   server {

      listen       80;

      server_name  bbs.etiantian.org;

      location / {

       proxy_pass http://server_pools;

        proxy_set_header Host $host;

      }

   }

}

註:多個虛擬主機設置主機頭:因為一個web服務器中可能有很多的虛擬主機站點,如果使用IP地址訪問時,默認每次訪問都會到達第一個站點,此時如果加上主機頭,訪問一個web網站的時候,會有針對性的訪問帶有的主機頭的虛擬主機。

 

X-Forwarded-For

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   

   

   upstream server_pools {

         server 10.0.0.7:80 weight=4max_fails=3 fail_timeout=30s;

         server 10.0.0.8:80 weight=4max_fails=3 fail_timeout=30s;

         server 10.0.0.9:80 weight=4max_fails=3 fail_timeout=30s;

   }      

   

   server {

      listen       80;

      server_name  www.etiantian.org;

      location / {

        proxy_pass http://server_pools;

        proxy_set_header  Host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

      }

   }

   server {

      listen       80;

      server_name  bbs.etiantian.org;

      location / {

        proxy_pass http://server_pools;

        proxy_set_header  Host $host;

        proxy_set_header X-Forwarded-For $remote_addr;

      }

   }

}

 

 

##

##根据用户请求的url目录(URI)进行转发 用户的请求

 

####第一个里程碑-规划 分类

/upload      10.0.0.8:80       upload服务器

/static           10.0.0.7:80       static静态服务器

/            10.0.0.9:80       默认

 

####第二个里程碑-创建澡堂子

 

 

upstream upload_pools {

 server 10.0.0.8:80;

}

 

upstream static_pools {

 server 10.0.0.7:80;

}

 

upstream default_pools {

 server 10.0.0.9:80;

}

 

 

##第三个里程碑-什么时候去某一个澡堂子(条件)

location  ====== 专门用来匹配判断 uri  if ($uri ~ xxxx)

 

 

location /static/ {

    proxy_passhttp://static_pools;

   proxy_set_header Host $host;

   proxy_set_header X-Forwarded-For $remote_addr;

}

 

#将符合upload的请求交给上传服务器池upload_pools,配置如下:

location /upload/ {

    proxy_passhttp://upload_pools;

   proxy_set_header Host $host;

   proxy_set_header X-Forwarded-For $remote_addr;

}

 

#不符合上述规则的请求,默认全部交给动态服务器池default_pools,配置如下:

location / {

    proxy_passhttp://default_pools;

   proxy_set_header Host $host;

   proxy_set_header X-Forwarded-For $remote_addr;

}

 

###第四个里程碑-配置lb负载均衡

 

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '

                      '$status $body_bytes_sent"$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

                           

                           

    upstreamupload_pools {

      server 10.0.0.8:80;

    }

 

    upstreamstatic_pools {

      server 10.0.0.7:80;

    }

 

    upstreamdefault_pools {

      server 10.0.0.9:80;

    }

 

   server {

        listen 80;

        server_name www.etiantian.org;

    location/static/ {

        proxy_pass http://static_pools;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For$remote_addr;

    }

 

        location /upload/ {

        proxy_pass http://upload_pools;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For$remote_addr;

    }

 

     location / {

        proxy_pass http://default_pools;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For$remote_addr;

    }

         access_log  logs/access_www.log  main;

    }

}

 

###第五个里程碑-创建环境

www.etiantian.org/bingbing.html

www.etiantian.org/upload/bingbing.html

www.etiantian.org/static/bingbing.html

 

##web01

mkdir -p/application/nginx/html/www/upload

echo "web01 upload">/application/nginx/html/www/upload/bingbing.html

 

##web02

mkdir -p/application/nginx/html/www/static

echo "web02 static">/application/nginx/html/www/static/bingbing.html

 

##web03

echo "web03 default" >/application/nginx/html/www/bingbing.html

 

###第五个里程碑-进行测试

 

[root@lb01 conf]# curlwww.etiantian.org/bingbing.html

web03 default

[root@lb01 conf]# curlwww.etiantian.org/static/bingbing.html

web02 static

[root@lb01 conf]# curlwww.etiantian.org/upload/bingbing.html

web01 upload

 

 #####nginx.conflb01 基于 用户的客户端浏览器

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   

   upstream upload_pools {

     server 10.0.0.8:80;

   }

   

   upstream static_pools {

     server 10.0.0.7:80;

   }

   

   upstream default_pools {

     server 10.0.0.9:80;

   }

   

   server {

      listen       80;

      server_name  www.etiantian.org;

        location / {

         if ($http_user_agent ~*"MSIE")

 

          {

            proxy_pass http://static_pools;

          }

         if ($http_user_agent ~*"Chrome")

 

          {

            proxy_pass http://upload_pools;

          }

        proxy_pass http://default_pools;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For$remote_addr;

       

      }

   }

}

 

 

[root@lb01 conf]# curl10.0.0.5/bingbing.html

web03 default

[root@lb01 conf]# curl10.0.0.5/static/bingbing.html

<html>

<head><title>404 NotFound</title></head>

<bodybgcolor="white">

<center><h1>404 NotFound</h1></center>

<hr><center>nginx/1.10.2</center>

</body>

</html>

[root@lb01 conf]# curl10.0.0.5/upload/bingbing.html

<html>

<head><title>404 NotFound</title></head>

<body bgcolor="white">

<center><h1>404 NotFound</h1></center>

<hr><center>nginx/1.10.2</center>

</body>

</html>

 

[root@lb01 conf]# curl -A chrome10.0.0.5/upload/bingbing.html

web01 upload

[root@lb01 conf]# curl10.0.0.5/bingbing.html

web03 default

[root@lb01 conf]# curl -A msie10.0.0.5/static/bingbing.html

web02 static

 

[root@lb01 conf]# ####访问一个目录  nginx 默认找的文件是 index.html index.htm

[root@lb01 conf]# #####如果这些文件不存在  nginx报错 403

[root@lb01 conf]# curl -A chrome10.0.0.5/upload/oldboy.txt

<html>

<head><title>404 NotFound</title></head>

<bodybgcolor="white">

<center><h1>404 NotFound</h1></center>

<hr><center>nginx/1.10.2</center>

</body>

</html>

 

404错误

[root@lb01 conf]# ####1.10.0.0.5  访问我的反向代理 lb01

[root@lb01 conf]# ####2.10.0.0.5 默认访问第一个虚拟主机 server 

[root@lb01 conf]# ####3.查看对应的条件 uri 目录

[root@lb01 conf]#         # if ($http_user_agent ~*"MSIE")

[root@lb01 conf]#         #

[root@lb01 conf]#         # {

[root@lb01 conf]#         #   proxy_pass http://static_pools;

[root@lb01 conf]#         # }

[root@lb01 conf]#         # if ($http_user_agent ~*"Chrome")

[root@lb01 conf]#         #

[root@lb01 conf]#         # {

[root@lb01 conf]#         #   proxy_pass http://upload_pools;

[root@lb01 conf]#         # }

[root@lb01 conf]#         #proxy_pass http://default_pools;

[root@lb01 conf]# ####4.最后找到的是 默认的池塘 里面没有 upload 目录

[root@lb01 conf]# ####5. 没有这个目录 404 找不到

[root@lb01 conf]# curl  10.0.0.5/upload/

<html>

<head><title>404 NotFound</title></head>

<bodybgcolor="white">

<center><h1>404 NotFound</h1></center>

<hr><center>nginx/1.10.2</center>

</body>

</html>

403错误

[root@lb01 conf]# curl -A msie  10.0.0.5/static/

<html>

<head><title>403Forbidden</title></head>

<bodybgcolor="white">

<center><h1>403Forbidden</h1></center>

<hr><center>nginx/1.10.2</center>

</body>

</html>

[root@lb01 conf]# ####1.lb01

[root@lb01 conf]# ####2.匹配的是第一个虚拟主机 10.0.0.5  www.etiantian.org

[root@lb01 conf]# ####3.进入location

[root@lb01 conf]#         # if ($http_user_agent ~*"MSIE")

[root@lb01 conf]#         #

[root@lb01 conf]#         # {

[root@lb01 conf]#         #   proxy_pass http://static_pools;

[root@lb01 conf]#         # }

[root@lb01 conf]#         # if ($http_user_agent ~*"Chrome")

[root@lb01 conf]#         #

[root@lb01 conf]#         # {

[root@lb01 conf]#         #   proxy_pass http://upload_pools;

[root@lb01 conf]#         # }

[root@lb01 conf]# ####5.判斷

[root@lb01 conf]# ####-A 裝作是msie

[root@lb01 conf]# ####6.扔到了static_pools  10.0.0.7

[root@lb01 conf]# ####7.10.0.0.7 這個機器上面  有/static 目錄

[root@lb01 conf]#####8.10.0.0.5/static/  =====10.0.0.5/static/index.html

[root@lb01 conf]# ####9.找首頁文件 但是 首頁文件不存在就顯示403     默認去找index.html

[root@lb01 conf]#

[root@lb01 conf]# ####10.找不到就匯報403 錯誤 。

##1.瀏覽器緩存 ctrl+F5

##2.域名沒有解析

##3.修改了配置文件,沒重啟  配置文件沒生效

延伸阅读

    评论