http {
limit_conn_zone $binary_remote_addr zone=one:10m; //为每个IP定义一个存储session的容器,一个session有32bytes, 这里10兆的容器,(10*1024*1024)/32=320000个session
server {
listen 80;
server_name www.abc.com;
location / {
limit_conn one 1; //one对应上面的one, 1限制每个IP只能发起一个并发连接
limit_rate 300k;//对连接的限速,而不是对IP限速。如果一个IP允许两个并发连接,那么针对这个IP的限速limit_rate*2
}
}
}
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one bust=10;//每个ip一秒钟只处理一个请求,这样会导致其它队列等待,占用tcp连接。如果limit_req zone=one bust=10 nodelay; 就可以把多余的请求丢掉,不会占用tcp连接
}
}
}
在实际应用中,不能对所有资源限制,比如图片什么的不能限制,所以需要把图片等排除出来。
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location ~ .*\.(gif|png|css|js|icon)$ {
proxy_set_header Host $http_host;
proxy_set_hreader X-Real_IP $romote_addr;
proxy_set_hreader X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* .*\.(jpeg|jpg|JPG)$ {
proxy_set_header Host $http_host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
limit_conn addr 3;
limit_req zone=one bust=5;
}
}
}