Nginx实现四层负载均衡
- 一、Nginx实现四层负载均衡
- 1、四层负载均衡与七层负载均衡区别
- 2、Nginx四层负载均衡配置
- 3、SocketTool工具
- 4、TCP&UDPDebug工具
- 二、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实现限流
- (1)ngx_http_limit_req_module模块 -(2)ngx_http_limit_conn_module 模块 Nginx中使用这两个模块来限制访问的频率,在nginx.conf配置文件中进行配置即可; 文档http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
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 ; 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;
}