LB负载均衡之Nginx-Proxy

时间:2024-03-08 08:40:35

LB负载均衡之Nginx-Proxy

Nginx 反向代理及负载均衡引用实战

Nginx反向代理的原理优点:   

  Nginx proxy(反向代理)作为Nginx的重要功能,使用nginx proxy基本可以实现一个完整的7层负载均衡。反向代理可以简单的理解为:代理服务器来接收internet上的服务器请求,然后将请求转发给内部的服务器上,然后将结果返回给internet上请求的客户端,所以代理服务器对外表现出来的只是一台服务器。反向代理服务器也称为Web服务器加速,针对web服务器提供加速功能。他作为代理服务器,并不针对浏览器用户,而是针对一台或者多台特定的web服务器。可以缓存web的页面,降低web服务器的访问量,从而来降低web服务器的负载,实施反向代理,只要将反向代理设备放置在一台或多台Web服务器前端即可。

       当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是代理服务器的IP地址,而非原始Web服务器的IP地址,这时代理服务器设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被转载到反向代理服务上。不但能够很大程度上减轻web服务器的负担,提高访问速度,而且能够防止外部网主机直接和web服务器直接通信带来的安全隐患。

 

Lvs 等负载均衡是转发用户的请求包,而nginx是接受用户的请求然后重新发起请求去请求其后的节点。

 

Nginx负载均衡实现的主要组件模块

Proxy代理模块 :用于将请求后抛给服务器节点或者upsream

Upstream 负载均衡模块:可以实现网站的负载均衡功能及节点健康检查。

模块语法:配置案例

upstream www_server_pools{

server 192.168.1.6:80 weight=5

server 192.168.1.5:80 weigh=10

server 192.168.1.4:80 weigh=15

}

解释:upstream 模块关键字,www_server_pools最为upstream的集群组的命,,可以自己写。Weight优先级,如果server后面接域名:需要内外有dNS解析服务器或者在负载均衡器的hosts文件中添加域名解析。

Upstream 模块内容存在于nginx.conf配置的http{}标签内,默认调度节点算法是wrr 即:权重轮询。

Upstream 内部server标签说明:

1.Weight=1 权重默认值为1

2.Max_fails=1 nginx尝试连接后端主机失败的次数,这个需要配合其他参数使用,如当nginx接收到此参数的状态码时,会将请求转发给工作正常的后端服务器。如404,502,503等。

3.Backup nginx的热备配置。nginx负载均衡器中的backup.是针对RS节点的热备配置,nginx负载均衡器的高可用需要用keepalived来实现。)当签名激活的rs失败后,会自动启动热备rs,这标志这此服务器作为备份服务器。当主服务器宕机后,就会想他转发请求,注意当负载调度发为ip_hash时,后端服务器在负载调动中的状态不能为weight和back

4.fail_timeout=10s  max_fails定义的失败次数后,距离下次检查的时间间隔。默认10s.

实例:

upstream  backup  {

        server   127.0.0.1:8080;

        server   192.168.1.15:8080 backup;

}

 

只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器。

在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx才会启用这个节点。

一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。

可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性。

如果nginx代理cache服务,可能需要使用hash算法,此时如宕机,可通过down参数确保客户端安装当前的hash算法访问。实例

upstream backup {

Ip _hash;

Server backend1.example.com;

Server backend2.example.com down;

Server backend3.example.com;

}

Haproxy负载均衡器server标签的配置实例

server_php_server_1 10.12.12.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2

server_php_server_2 10.12.12.41:80 cookie 2  check inter 1500 rise 3 fall 3 weight 1

server_php_server_back 10.12.12.12:80 cookie 3 check inter 2000 rise 3 fall 3 back

Weigh 调节服务器的请求分配权重。

Check 开启对服务器的健康检查

Inter设置连续两次检查的间隔时间

Rise 制定多少次成功检查后认为服务器正常使用

Fall 多少次检查不成功,认为服务器宕机,默认3次

Maxconn 制定可被发送到该服务器的最大并发连接数,

4.upstream模块调度算法

静态调度算法:负载均衡器更具自身设定的规定进行分配,不考虑后端节点服务器情况,例如:rr,wrr,ip_hash 等属于静态调度算法

动态调度算法:服务器根据后端节点服务器的当前状态决定是否分发请求,例如连接数少的优先获得请求。相应时间短的优先获的请求。例如:least_conn fair等

常见调度算法:

rr轮询:服务器正常请求逐一分配到不同节点。当一个节点宕机后,宕机的服务器会被自动从节点服务器池中剔除,是客户端不收影响。

wrr (选中轮询)rr轮询算法基础上加上权重,权重和用户访问成正比。权重越高,被转的请求就越多。可以更具服务器性能,配置,有效的解决了服务器性能不均带来的请求分配问题。

Ip_hash

每个请求安装客户端ip的hash(哈希值)的结果进行分配,当请求发送过来的ip进过hash计算后得到的值相同都会发送到同一个节点,这样就会影响用户请求分配不均的问题。不过此算法可以解决nginx动态网页的session的共享问题。

再次理解:1)ip_hash指令 
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。这样,当来自某ip用户在Sever A上登录后,再访问该站点的其他URL时,能保证访问仍在Server A上。如果不加ip_hash,加入用户在Server A上登录,再访问该站点其他URL,就有可能跳转到后端的Sever B、C…..,而session记录在A上,B、C上没有,就会提示用户未登录。 
注意:但这种访问不能保证后端服务器的负载均衡,可能后端有些server接受到的请求多,有些server接受的少,设置的权重值不起作用。 
建议如果后端的动态应用程序服务器能做到session共享,而不nginx上配置ip_hash的方式)

实例:

ipstream wyl_lb {

ip——hash;

server 192.168.1.5;

server 192.168.1.6;

}

upstream backup {

Ip _hash;

server backend1.example.com;

server backend2.example.com down;

server backend3.example.com;

}

注意当调度算法为ip_hash时,后端服务器在负载均衡其中的状态不能有weight和backup

即使有也不会生效。

Fair算法(动态调度发)

此算法会根据后端服务器的响应时间进行分配请求。Nginx本身不支持次算法,如果需要使用此算法需要下载相关模块如upstream_fair

upstream wyl_lb {

server 192.168.1.5;

server 192.168.1.6;

fair;

}

还有5.least_conn 6.url_hash算法。7.一致性hash算法等论坛查看nginx反向代理之负载均衡算法介绍:详见博客另附页。

Proxy模块介绍

Proxy_pass指令介绍

Proxy_pass属于proxy模块,此模块可以将请求转发到另一台服务器,在实际反向代理工作中,会通过location功能匹配制定的URI然后把接受道德符合匹配URI的请求通过proxy_pass抛给定义好的upstream节电池。

案例

location /name/ {

proxy_pass http://127.0.0.1/remote/

}

将匹配的url为/name/的请求给http://1227.0.0.1

location /name/ {

proxy_pass http://127.0.0.1/remote/

}

location /name/ {

rewrite /name/([ ^/ ]+)

proxy_pass http://127.0.0.1/remote/

}

匹配ur为uname的请求应用制定的rewriteg规则,然后抛给127.0.0.1

proxy模块参数

Nginx的代理功能是由proxy模块实现的

默认此模块是安装过得。详解proxy模块参数

Proxy模块详解:http://www.jb51.net/article/78746.htm

Proxy模块参数详解:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html

Nginx负载均衡配置实战简单参考实例:http://lichunhui.iteye.com/blog/1999131

实验:nginx反向代理之负载均衡

Nginx Proxy 服务器(的热备可用keepalived实现高可用)

新建配置文件vim /etc/nginx/conf.d/nginx.conf 或者在nginx主配置文件中配置。

upstream cluster {

  server 192.168.1.106:80 weight=8 max_fails=2 fail_timeout=30s;

  server 192.168.1.107:80 weight=8 max_fails=2 fail_timeout=30s;

}

 

server {  

 listen       80;   

server_name  www.123.com;   

            

location / {    

   root   html;   

   index  index.html index.htm;   

   proxy_pass http://cluster/;  #指定需要代理的URL,   

   proxy_redirect off;         #如果需要从后端打开location和Refresh字段,可以开启。   

   proxy_set_header X-Real-IP $remote_addr;  #允许将发送到后端的服务器请求重新定义或者增>加一个字段,这个可以是变量也是文本组合。   

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #联系下面PS中所写,在后>端web中就算加上$http_x_Forwarded_for这条,也得不到用户的IP,所以在nginx反向代理添加Header头信息 X-Forwarded-For在配合后端服务器日志文件的$http_x_Forwarded_for这条就可以获得用户的IP地址了。   

   proxy_set_header Host $host; #首先说明 proxy_set_header 指令在向反向代理的后端Web服务>器发起请求时添加指定的 Header头信息,后端web服务器有多个基于域名的虚拟主机时,通过头信息Host,用于指定请求的域名,这样后端web才能识别反向代理请求哪个虚拟主机处理。   

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503

   http_504 http_404; #服务器头部超时相应的各种状态   

 }

}

保存退出。

Web1 web2 yum安装即可(只是作为测试使用)

设置测试页面

echo "111111">/usr/share/nginx/html/index.html  wb1设置测试页面 192.168.1.106

echo "222222">/usr/share/nginx/html/index.html  wb2设置测试页面 192.168.1.107

启用web1 web2 及nginx proxy

测试:

Ok 更改权重测试

测试ok

 

 

Nginx反向代理实现动静态分离实验

通过Nginx实现动静分离,即通过Nginx反向代理配置规则实现让动态资源和静态资源及其他业务分享由不同的服务器解析,以解决网站性能、安全、用户体验等重要问题

Nginx反向代理实现动静分离其实是nginx根据url目录地址实现代理转发功能

企业案例:

实现:动态资源,静态资源及其他业务由不同的服务器解析,解决网站性能,安全,用户体验等重要问题。

当用户请求www.123.com/upload目录时候代理就会将请求上传到upload服务器分配池处理数据,当请求www.123.com/static时代理就会将请求上传到static服务器分配池处理数据,当用户请求www.123.com/xx不包含制定的目录地址时,代理就会将请求上传到默认的动态服务器分配池处理数据。

实验:URL中的目录实现代理转发(1)

实现方式:1

通过location 方式实现

location  /static/ {

proxy_pass http://static_pools;

include proxy.conf

}

location /upload/ {

proxy_pass http://upload_pools;

include proxy.conf

}

location / {

proxy_pass http://default_pools;

include proxy.conf

}

Proxy的内容可以单独列出来存放到proxy.conf中

vim /etc/nginx/conf.d/nginx.conf

   proxy_redirect off;

   proxy_set_header X-Real-IP $remote_addr;

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   proxy_set_header Host $host;

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;

   proxy_connect_timeout 60;

   proxy_send_timeout 60;

   proxy_read_timeout 60;

   proxy_buffer_size 4k;

   proxy_buffers 4 32k;

   proxy_busy_buffers_size 64k;

   proxy_temp_file_write_size 64k;

保存退出即可。

实现方式:2

通过if语句实现

if ( $request——uri ~* “^/static/(.*)$” )

{

proxy_pass http://static_pools;

}

....

这里省略查看论坛

下面以1方案为例实践完整配置

vim /etc/nginx/conf.d/nginx.conf

upstream upload_pools {

  server 192.168.1.105:80 weight=8 max_fails=2 fail_timeout=30s;

}

upstream static_pools {

  server 192.168.1.106:80 weight=8 max_fails=2 fail_timeout=30s;

}

upstream default_pools {

  server 192.168.1.108:80 weight=8 max_fails=2 fail_timeout=30s;

}

server {

 listen       80;

 server_name  www.123.com;

 

   location / {

   root   html;

   index  index.html index.htm;

   proxy_pass http://default_pools/;

   proxy_redirect off;

   proxy_set_header X-Real-IP $remote_addr;

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   proxy_set_header Host $host;

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503

   http_504 http_404;

   }

   location /static/ {

   root   html;

   index  index.html index.htm;

   proxy_pass http://static_pools/;

   proxy_redirect off;

   proxy_set_header X-Real-IP $remote_addr;

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   proxy_set_header Host $host;

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503

   http_504 http_404;

   }

   location /upload/ {

   root   html;

   index  index.html index.htm;

   proxy_pass http://upload_pools/;

   proxy_redirect off;

   proxy_set_header X-Real-IP $remote_addr;

   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   proxy_set_header Host $host;

   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503

   http_504 http_404;

 }

}

保存退出测试

注释Proxy的内容可以单独列出来存放到proxy.conf中。

编辑测试页

Web1--> 192.168.1.105

echo "upload-upload----22222"/usr/share/nginx/html/index.html

Web2-->2 192.168.1.106

echo "static-static----11111"/usr/share/nginx/html/index.html

Web3-->192.168.1.108

echo "static-static----11111"/usr/share/nginx/html/index.html

测试:

Nginx proxy 

Ok

实验2根据user_agent转发(2)

案例2

 

场景:希望只有一个域名对外服务,不希望多个域名对应同一个业务,这类业务:

1.业务域名不希望拆分,但希望实现动静分离

2.不同的客户端设备(如手机pc端)使用同一个域名,访问统一业务,实现动静分离,让不同设备访问请求,交给后端不同的服务器处理。以便得到最佳的效果体验。

根据客户端设备user_agent 转发请求实践

这里继续利用staitc_poos upload_pools作为本次实验的后端服务器池,下面根据计算机客户端浏览器的不同设置对应的匹配规则。

实践:根据浏览器配置(1)

vim /etc/nginx/conf.d/proxy.conf

upstream upload_pools {

  server 192.168.1.105:80 weight=8 max_fails=2 fail_timeout=30s;

}

 

upstream static_pools {

  server 192.168.1.106:80 weight=8 max_fails=2 fail_timeout=30s;

}

upstream default_pools {

  server 192.168.1.108:80 weight=8 max_fails=2 fail_timeout=30s;

}

 

server {

 listen       80;

 server_name  www.123.com;

location  / {

if ( $http_user_agent ~* “MSIE” )

#如果请求的浏览器为IE浏览器MSIE(IE)则让static_pools;池处理

{

proxy_pass http://static_pools;

}

if ( $http_user_agent ~* “Chrome” )

#如果请求的浏览器为goole浏览器则让upload_pools;池处理

{

proxy_pass http://upload_pools;

}

proxy_pass http://default_pools;

#如果请求的是其他客户端则让default_pools;池处理

#include proxy.conf;(如果在主配置文件里面写去掉#即可,再此实例中新建的nginx.conf默认自动加载*.conf)

}

access_log off;

}

保存退出

Proxy.conf配置项单独配置同上。

配置完结。

实践:根据客户端设备配置(2)

 同理正对安卓苹果手机pc等配置同上,只需要提前定义好地址池即可。

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

}

配置完结。

案例

根据文件扩展名实现代理转发(3)

根据扩展名实现动静分离访问如图片,视频,等请求静态服务器池,php,jsp等请求动态服务器池

实例通过location方式匹配规则如下:

location ~.*.(gif|jpg|jpeg|png|bmp|swf|css|js)${

proxy_pass http://static_pools;

include proxy.conf;

}

location ~.*.(php|php3|php5)${

proxy_pass http://dynamic_pools;

include proxy.conf;

}

实例通过if语句方法匹配规则

if ( $request_uri ~* “.*\.(php|php5)$” )

{

proxy_pass http://php_server_pools;

}

if ( $request_uri ~* “.*\(jsp|jsp*|do|do*)$”)

{

proxy_pass http://java_server_pools;

}

Nginx 负载均衡检测节点状态

1.通过插件如:Tengine(Nginx的分支)模块nginx_upstream_check_module用于提供主动式后端服务器健康检查(RS)如果某一个rs不可用,则请求不会发送到该节点上。

2.也可通过自己开发shell脚本达到相同的效果。

后续补充..........

博友实验案例:

(Nginx反向代理负载均衡页面缓存URL重写及读写分离详解)

http://www.360doc.com/content/13/1114/12/7694408_329125489.shtml

(解决session共享的方法)见博客