Nginx实战案例—限制用户的访问
1. 为什么要限制用户访问
我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费、服务器压力、影响业务,往往考虑对同一个ip的连接数、并发数进行限制。
2. 如何限制用户访问
修改nginx配置文件:
vim /usr/local/nginx/conf/nginx.conf
33 #gzip on;
34 limit_conn_zone $binary_remote_addr zone=addr:10m; #大小是10M内存,10M的内存用来对于IP传输开销
35 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #1s中不超过一个请求
36 server {
37 listen 80;
38 server_name localhost;
39
40 #charset koi8-r;
41
42 #access_log logs/host.access.log main;
43
44 location / {
45 root html;
46 index index.html index.htm;
47 }
48 location /download {
49 limit_conn addr 1; ##只能一个并发,多了会报错
50 #limit_rate 50k; ##限制带宽,每秒最多50k,访问速度会变的很慢
51 }
nginx -t #语法检测
nginx -s reload #在不暂停服务的情况下重新加载
说明:
limit_conn_zone
用来限制同一时间连接数,即并发限制
limit_req_zone
用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”
$binary_remote_addr
是限制同一客户端ip地址
zone=one:10m
表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频此信息
定义一个名为addr的limit_conn_zone
mkdir /usr/local/nginx/html/download/
cd /usr/local/nginx/html/download/
ls
cd /usr/local/nginx/logs
>access.log #清空日志(方便实验效果的观察)
测试(在真机中):
ab -c 10 -n 1000 http://172.25.1.1/download/huge.jpg #一次10个并发,一共并发1000(也就是模拟10个人,发送1000个请求)
查看日至(在server1中):
200就是可以的,503就是服务器端有问题(服务器端发现并发太多了,就会返回503)