Nginx使用问题汇总

1.nginx故障转移

故障转移:在nginx负载均衡配置里,如果转发到某台服务器的请求失败,nginx会自动转发到其它服务器上重试。故障转移与请求类型有关,GET请求会自动转发重试。POST、PUT等请求,如果已经发送到某台服务器并且处理异常,不会再转发;如果连接不上服务器,nginx会转发到其它服务器上处理。所以不要用GET请求做一下插入、更新业务,否则会出现问题。

http{
    #应用集群负载均衡
    upstream com.zhujn.hot {
        #两个tomcat,weight:权重
        server 192.168.1.100:8081 weight=3;
        server 192.168.1.101:8081 weight=2;
    }

    server {   #虚拟服务器,默认端口:80
        proxy_read_timeout 10s;
        proxy_next_upstream error timeout; #故障转移条件
        proxy_next_upstream_tries 3;   #重试次数,防止大集群里无限重试
        proxy_next_upstream_timeout 60s;   #重试的最长时间

        location / {
            #反向代理,指向负载均衡配置名称
            proxy_pass http://com.zhujn.hot
        }
    }
}    

2.雪崩

在多台服务器负载均衡的高并发场景下,由于nginx故障转移的特性,假设某台服务器1万个请求里有3000个请求处理失败,nginx会把这3000个请求均分到其它服务器,如果在把其它服务器压挂了,nginx会把出问题的机器上的请求再转发到余下的服务器,从而引发滚雪球效应,导致整个集群崩溃。

解决方法:加入熔断机制,配置如下。

upstream server_group {
    server backend1.example.com ;
    server backend2.example.com  max_fails=3 fail_timeout=30s;
    server backup1.example.com  backup;
}

max_fails=number

这个参数决定了多少次请求后端失败后会暂停这个业务节点,不再给它发新的请求,默认值是1。此参数需要配合fail_timeout一起用。

题外话:如何定义失败,有很多种类型,这里因为主要处理HTTP代理,所以更关注proxy_next_upstream。

proxy_next_upstream:主要定义了当服务节点出现状况时,会将请求发给其他节点,也就是定义了怎么算作业务节点失败。

fail_timeout=time

决定了当Nginx认定这个节点不可用时,暂停多久。不配置默认就是10s。

把上面两个参数联合起来考虑就是:当Nginx发现发送到这个节点上的请求失败了3次的时候,就会把这个节点摘除,摘除时间是30s,30s后才会再次发送请求到这个节点上。

backup

类似于switch语句中的default,当主要节点都挂了的时候,会把请求打到这个backup节点。这是最后一个救兵了。

3.限流

限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货) 

Nginx主要有两种限流方式:
(1)按连接数限流(ngx_http_limit_conn_module)(令牌算法实现)
(2)按请求速率限流(ngx_http_limit_req_module)(漏桶算法实现)

ngx_http_limit_req_module

模块提供限制请求处理速率能力,使用了漏桶算法(leaky bucket)。下面例子使用 nginx limit_req_zone 和 limit_req 两个指令,限制单个IP的请求处理速率。在 nginx.conf http 中添加限流配置:

http {
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s;
}

配置 server,使用 limit_req 指令应用限流

server {
location / {
limit_req zone=myRateLimit  burst=20 nodelay;
proxy_pass http://my_upstream;
}
}


key :定义限流对象,binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息, myRateLimit:10m 表示一个大小为10M,名字为myRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

burst 译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数。当 rate=10r/s 时,将1s拆成10份,即每100ms可处理1个请求。此处,burst=20 ,若同时有21个请求到达,Nginx 会处理第一个请求,剩余20个请求将放入队列,然后每隔100ms从队列中获取一个请求进行处理。若请求数大于21,将拒绝处理多余的请求,直接返回503.

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处理时间自然难以接受。因此,burst 往往结合 nodelay 一起使用。nodelay 针对的是 burst 参数,burst=20 nodelay 表示这20个请求立马处理,不能延迟,相当于特事特办。不过,即使这20个突发请求立马处理结束,后续来了请求也不会立马处理。burst=20 相当于缓存队列中占了20个坑,即使请求被处理了,这20个位置这只能按 100ms一个来释放。

这就达到了速率稳定,但突然流量也能正常处理的效果。

ngx_http_limit_conn_module

ngx_http_limit_conn_module 提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。下面是 Nginx 官方例子:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}


limit_conn perip 10 作用的key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。

limit_conn perserver 100 作用的key是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。

需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。

4.反向代理:

upstream mkt-cpc-intf {
        #ip_hash;
        server 133.64.172.28:9092;

}

location /mkt-cpc-intf {
         proxy_pass http://mkt-cpc-intf;

}

请求地址:/mkt-cpc-intf/aaa-------文根:mkt-cpc-intf要附加上

跳转到:133.64.172.28:9092/mkt-cpc-intf/aaa

location /mkt-cpc-intf {
         proxy_pass http://mkt-cpc-intf;

        rewrite  ^/mkt-cpc-intf/(.*)$  /$1  break;

}

请求地址:/mkt-cpc-intf/aaa-------文根:mkt-cpc-intf要附加上,正则去掉第一个/对应的值

跳转到:133.64.172.28:9092/aaa

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值