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共享的方法)见博客

LB负载均衡之Nginx-Proxy的更多相关文章

  1. centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课

    centos   LB负载均衡集群 三种模式区别 LVS/NAT 配置  LVS/DR 配置  LVS/DR + keepalived配置  nginx ip_hash 实现长连接  LVS是四层LB ...

  2. 反向代理负载均衡之nginx

    一.集群 1.1 什么是集群 集群是一组相互独立的.通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理.一个客户与集群相互作用时,集群像是一个独立的服务器.集群配置是用于提高可用性 ...

  3. 动态负载均衡(Nginx+Consul+UpSync)

    Http动态负载均衡 什么是动态负载均衡 传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件, 因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upst ...

  4. LB负载均衡集群及NAT模式配置

    一.LB(load balance)负载均衡集群 负载均衡集群常用的有: 1.软件实现的 nginx(工作在OSI第七层应用层) lvs+keepalived(工作在OSI第四层传输层) 2.硬件实现 ...

  5. 分布式存储之MogileFS基于Nginx实现负载均衡(Nginx+MogileFS)

    MogileFS分布式文件系统特点: 1.具有raid的性能 2.不存在单点故障 3.简单的命名空间: 每个文件对应一个key:用于domain定义名称空间 4.不共享任何数据 5.传输中立,无特殊协 ...

  6. 动态负载均衡(Nginx+Consul+UpSync)环境搭建

    首先 安装好 Consul upsync 然后: 1.配置安装Nginx 需要做配置,包括分组之类的,创建目录,有些插件是需要存放在这些目录的 groupadd nginx useradd -g ng ...

  7. 终结者:负载均衡之Nginx(一)

            相信非常多人都听过Nginx.这个小巧的东西能够和Apache及IIS相媲美.那么它有什么作用呢?一句话.它是一个减轻Web应用server(如Tomcat)压力和实现Web应用ser ...

  8. 正反向代理、负载均衡、Nginx配置实现

    一.正反向代理 1.前提 我们曾经使用翻墙软件,访问google:使用了代理软件时,需要在浏览器选项中配置代理的地址,我们仅仅有代理这个概念,并不清楚代理还有正向和反向之分. 2.正向代理(代替客户端 ...

  9. nginx安装&负载均衡配置&nginx反爬虫&nginx命令

    Nginx安装 wget https://nginx.org/download/nginx-1.14.0.tar.gz tar -zxvf nginx-1.14.0.tar.gz cd nginx-1 ...

随机推荐

  1. .NET微信模拟登录及{base_resp:{ret:-4,err_msg:nvalid referrer}}的解决办法

    12年的时候写了些关于微信开发的内容,当时看好这个东西,可惜当时腾讯开放的权限太少,之后的一年多时间没有太关注了. 现在又要重新开始微信开发的阵容了,微信只是个入口,微网站才是趋势. 我是个水货,所以 ...

  2. delphi里动态创建AlphaControls实现换肤

    AlphaControls是一套Delphi下的优秀的皮肤vcl控件.几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了.后来就看到更多的人开始推崇AlphaCon ...

  3. PKU 1005

    比较简单吧,其实算是数学问题了 // 1005.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdio.h ...

  4. ORB

    http://wenku.baidu.com/link?url=R4Ev8aJNxwmjV0egSUqVBjmnt1KT_llzp8Oy2NbHnwa7Me9UAIHkiMG2Vwucu3RSDKwy ...

  5. BZOJ 4204 && BZOJ 2510 循环矩阵

    n^3logn非常显然.所以要用一种因为这个矩阵是一个循环矩阵,所以只要知道第一行就可以知道所有行了. C[i][j]=C[i-1][j-1]; #include <iostream> # ...

  6. DotNetBar TabControl的使用

    这个和系统的TabPage不同,一个TabPage分为了DevComponents.DotNetBar.TabItem,DevComponents.DotNetBar.TabControlPanel两 ...

  7. 微信公众号红包接口开发PHP开发 CA证书出错,请登陆微信支付商户平台下载证书

    微信红包接口调试过程中一直提示“CA证书出错,请登陆微信支付商户平台下载证书”,经反复调试,大致解决方法如下: 1.首先确保CA证书的路径是否正确,一定得是绝对路径,因为是PHP开发的,这里需要三个p ...

  8. 旷世奇坑!!!spring 不能自动注入

    一入此坑,只想跳楼.我发誓应该不会有第二个人会进这种坑! 问题描述: 总是不能注入dao层,即@Resposity.always!always!always!(尝试了天下之因特网所有的注入方式,都不能 ...

  9. html+css基础知识总结

    1.HTML书写的基本规范      img标签必须得写alt=""      标签名和属性名字必须小写      引号必须用双引号      双标签必须有闭合标签      单标 ...

  10. pvoid64 pvoid

    如果需要某一个结构体,既在kernel space用,又在user space用,如 typedef struct { PVOID data; int size; }binary,pbinary; 上 ...