Nginx负载均衡(upstream)

Nginx负载均衡(upstream)

upstream 主要是配置均衡池和调度方法
proxy_pass 主要是配置代理服务器ip或服务器组的名字

1

2

3

4

5

6

7

8

9

10

11

12

13

14

upstream testTomcat{

   server 127.0.0.1:81 weight=1;

   server 127.0.0.1:82 weight=1;

   server 127.0.0.1:83 weight=1;

}

server {

    listen 80;

    server_name test.xm;

    location /test/ {

       proxy_pass http://testTomcat;

       proxy_set_header Host $host;

    }

}

proxy_pass配置的4种方式

假如访问:http://192.168.1.1/test/index.php

 第一种:

1

2

3

location /test/ {

     proxy_pass http://testTomcat/;

  }

代理到URL:http://127.0.0.1:81/index.php

第二种(相对于第一种,最后少一个 / )

  location /test/ {
       proxy_pass http://testTomcat;
    }

代理到URL:http://127.0.0.1:81/test/index.php

第三种:

  location /test/ {
       proxy_pass http://testTomcat/abc/;
    }

代理到URL:http://127.0.0.1:81/abc/index.php

第四种(相对于第三种,最后少一个 / )

  location /test/ {
       proxy_pass http://testTomcat/abc;
    }

代理到URL:http://127.0.0.1:81/abcindex.php

问题1:

假如正访问购物网,看中一款商品,网页一刷新,就被代理到台后端另一台服务器上了,这就会出现问题。希望的是能识别主机,也就是:当一个客户端访问前端,被代理到后台一台服务器后,以后就始终被代理到这台服务器。这里用到ip_hash 通过客户端ip进行hash,再通过hash值选择后端server

upstream testTomcat{
   ip_hash;      ##客户端ip进行hash
   server 127.0.0.1:89 weight=1;
   server 61.155.141.13:888 weight=1;
   server 61.155.141.14:81 weight=1;
}

ps:其实 ip_hash也还是有一定问题,比如用户在下单时,突然切换网络了(这个问题下次讨论。。。。。。) 

问题2:

服务器性能不一样,有的配置较高,有的已经老旧,配置较低,采用上面轮询方式显然不符合负载均衡要求。解决这个问题的办法是:采用比重的方式,在前端配置文件里加入比重参数(weight)

1

2

3

4

5

upstream testTomcat{

   server 127.0.0.1:81 weight=1;

   server 127.0.0.1:82 weight=2;

   server 127.0.0.1:83 weight=3;

}

问题3:

如果其中的一台服务器发生错误或超时时,通常希望Nginx自动重试其他的服务。

实际上Nginx本身默认会有错误重试机制,并且可以通过proxy_next_upstream来自定义配置,其默认值是proxy_next_upstream error timeout,即发生网络错误以及超时,才会重试其他服务器

如果想其他服务器其他状态重试,

 location /test/ {
       proxy_pass http://testTomcat;
       ## 配置http 404 http502
       proxy_next_upstream error timeout  http_404 http_502;
    }

 注意: 如果get 请求 http://127.0.0.1:81/test/index.php  Nginx默认会失败重试,但是如果是post请求时 Nginx默认不会失败重试

如果想post也默认会失败重试,可以加上选项 non_idempotent

 location /test/ {
       proxy_pass http://testTomcat;
       ## 配置http 404 http502   non_idempotent
       proxy_next_upstream error timeout  http_404 http_502 non_idempotent;
    }

ps:通常情况下,如果请求使用非等幂方法(POST、LOCK、PATCH),请求失败后不会再到其他服务器进行重试。加上non_idempotent选项后,即使是非幂等请求类型(例如POST请求),发生错误后也会重试。

什么是幂等方法

如果使用该方法的多个相同请求对服务器的预期效果与单个请求的效果相同,则认为请求方法是幂等的。常见的HTTP请求方法中,GET是幂等的,而POST是非幂等的。如果在回答面试题"GET和POST区别"时能答出这一点,才能说明对HTTP协议有一定的理解

在做业务开发是如何理解幂等性,举个最简单的例子:GET方法一般用于获取数据,如果获取的是数据库数据,对应的是SELECT语句。同样的SELECT语句执行一次还是多次,都不会影响数据。而POST一般对应INSERT,如果执行多次后,可能会造成数据重复插入的问题。所以不要使用GET方法做一些INSERT操作,在业务开发时要遵循HTTP协议规范。

注意:生产环境中不建议加上non_idempotent选项,因为无论是发生500错误还是timeout,服务器上的业务可能已经执行过了,而重试会导致非幂等方法重复执行,从而导致业务问题,例如一个请求会创建了多个订单,或者收到多条短信的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值