【Nginx】三、Nginx实现四层负载均衡&Nginx实现限流&防盗链&流量镜像

一、Nginx实现四层负载均衡

我们之前介绍的HTTP负载均衡,叫做“七层负载均衡”,工作在第七层“应用层”,而TCP负载均衡,就是我们通常所说的“四层负载均衡”,工作在“网络层”和“传输层”,例如,LVS(Linux Virtual Server,Linux虚拟服务)和F5(一种硬件负载均衡设备)、haproxy等,都属于“四层负载均衡”;
在这里插入图片描述

在这里插入图片描述

1、四层负载均衡与七层负载均衡区别

四层负载均衡,在网络模型中的传输层中,基于主要是基于tcp协议报文实现负载均衡(比如LVS、haproxy就是四层负载均衡器),使用改写报文的源地址和目的地址;
七层负载均衡,在网络模型中应用层中,基于URL或者HTTP协议实现负载均衡,Web服务器;

从nginx 1.9.0版本开发支持基于tcp的四层负载均衡,该版本增加了 stream 模块用于一般的 TCP 代理和负载均衡,ngx_stream_core_module 这个模块在1.9.0版本后被启用,但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块;

./configure --help

--with-stream    enable TCP/UDP proxy module

./configure --with-http_ssl_module --with-stream

make


然后在 objs 目录下得到nginx的可执行程序;
说明文档:
http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

2、Nginx四层负载均衡配置

stream {
   upstream tcp_power {
       server 192.168.194.1:6000 weight=5;
       server 192.168.194.1:6001 backup;
       server 192.168.194.1:6001 max_fails=3 fail_timeout=30s
       server 192.168.194.1:6001 down;
   }
   server {
       listen       12345;
       proxy_pass tcp_power;
   }
}

hash $remote_addr consistent;

3、SocketTool工具

TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案,方便我们发送和接收tcp连接数据;

4、TCP&UDPDebug工具

这是一款用于调试socket网络编程的小工具,可以作为客户端向某个地址发起连接并传送数据,也可以作为服务器端接收客户端的连接并响应数据;

二、Nginx实现限流

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=2r/s;

这两个命令的语法结构:
limit_req_zone key zone rate
key: 定义需要限流的对象。
zone: 定义共享内存区来存储访问信息。
rate: 用于设置最大访问速率;

示例:

http {
  limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
  limit_req_zone $server_name zone=perserver:10m rate=2r/s;
}

server {
location / {
    root html
    limit_req zone=perip burst=100 nodelay;
    limit_req zone=perserver burst=2;
}
}

上面binary_remote_addr就是key,表示基于客户端ip(remote_addr)进行限流,binary_表示压缩内存占用量;
zone定义了大小为10M的内存区,用于存储IP地址访问信息;
rate设置IP访问频率,rate=5r/s表示每秒只能处理每个IP地址的5个请求,Nginx限流是按照毫秒级为单位的,也就是说1秒处理5个请求会变成每200ms只处理一个请求,如果200ms内已经处理完1个请求,但是还是有新的请求到达,这时候Nginx就会拒绝处理该请求;
上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量;
Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数;
可以将之前的例子添加burst及nodelay参数:

http {
  limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}
server {
location / {
    limit_req zone=myLimit burst=5 nodelay;
  }
}

limit_req指令中添加了burst=5 nodelay两个参数;
burst=5表示预先在内存中预留了5个请求的位置;
如果没有添加nodelay参数,此时有5个突发请求就会按照200ms去依次处理请求,也就是1s内把5个请求全部处理完毕,如果1s内有新的请求到达就不会立即进行处理;
如果添加了nodelay参数则表示要立即处理这5个突发请求;

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_status 506;
}
error_page   506  /506.html;

三、Nginx实现防盗链

防盗链是什么意思?就是本站内的资源比如图片、CSS、JS、视频、文档等只能本站可以访问,其他网站不能访问;

location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
     valid_referers none blocked www.web.com *.power.com;
     if ($invalid_referer) {
         return 403;
     }
}

location /img/ {
    root /data/img/;
    valid_referers none blocked www.web.com *.power.com;
    if ($invalid_referer) {
		#return 403;
    }
}

none表示空的来路,也就是直接访问,比如直接在浏览器打开一个图片;
blocked 表示 “Referer”字段出现在请求头中,但其值已被防火墙或代理服务器删除;

四、Nginx流量镜像

流量镜像(流量拷贝,流量复制,请求复制)
原来网易公司开源了一个TcpCopy https://www.oschina.net/p/tcpcopy
Nginx提供的流量镜像功能能将生产环境的流量拷贝到预生产环境或测试环境,进行真实的流量测试,可以验证功能是否正常,以及服务的性能和稳定性;
由于是用真实有效的流量请求去验证,所以不用造测试数据,不影响线上正常访问,也可以用来排查线上问题;
Nginx提供了ngx_http_mirror_module模块实现流量镜像,从1.13.4版本开始提供;
文档:http://nginx.org/en/docs/http/ngx_http_mirror_module.html

location / {
	mirror /docs;
	root html;
	index index.html index.htm;
}

location = /docs {
	internal;
	proxy_pass http://abc;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值