Nginx 限速和限制请求配置,使用limit模块仿cc

[ 2013-09-10 09:55:56 | 作者: admin ]
字号: | |
p.s.压力测试是很好的检验方法,用webbech或者ab等一些工具模拟并发服务器,若服务器没有限制连接数或带宽,服务器很容易被压跨。


http {


limit_conn_zone $binary_remote_addr zone=one:10m;
limit_req_zone $binary_remote_addr zone=perip:5m rate=20r/s;

#如果在1.1.8之后版本还用语法:limit_zone name $variable size,会报警告nginx: [warn] the “limit_zone” directive is deprecated, use the “limit_conn_zone” directive

#这里,设置客户端的IP地址作为键。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。$remote_addr变量的长度为7字节到15字节不等,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。而$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。一兆字节的共享内存空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。

server {
limit_conn one 10;
#指定一个会话最大的并发连接数(与之前的limit_conn_zone配合使用),可对单独目录做出限制,一个IP只能发起10个连接,多于10个,一律返回Services unavailable(503)状态,生产环境需考虑办公室或者局域网共享IP问题
limit_rate_after 1m;
#设置单连接限速条件(当下载文件字节数超过1MB后,limit_rate限速生效,限速100k)
limit_rate 100k;
#单连接限速

}

}


================================================================

nginx 是个不错的web服务器,提供了全方位的限速功能,主要的功能模块是ngx_http_core_module、ngx_http_limit_conn_module和 ngx_http_limit_req_module,第一个模块中有limit_rate功能(限网速带宽),后两个模块从字面上讲,功能分别是限制连接(limit connection)和限制请求(limit request),这几个模块默认都编译进了nginx核心。

所有的限制都是针对IP的,因此对CC、DDOS有一定的防御作用。

限带宽很容易明白,直接上例子

location /mp3 {
        limit_rate 200k;
}

有一种方式可以让限速更加人性化,即传输一定流量后开始限速,

比如先全速传输1M,然后开始限速:

location /photo {
        limit_rate_after 1m;
        limit_rate 100k;
}

接下来讲限并发数和请求数。

为什么有这两个模块呢?因为我们知道,一个页面通常有多个子模块,譬如5张图片,那么我们请求这个页面时发起了一个连接,但是这一个连接包含了5次图片请求,也就是说,一个连接可以发起多次请求。我们为了维持用户体验,是限制连接数还是请求数,要根据实际需要进行选择。

1、限制连接数
要限制连接,必须先有一个容器对连接进行计数,在http段加入如下代码:
limit_conn_zone $binary_remote_addr zone=addr:5m;

这样就在内存中创建了一个5M大小,名为addr的限速池(每个连接占用32或64字节,5m大小可容纳数以万计的连接,通常是足够的,如果5M内存耗尽,将返回503)

接下来需要对server不同的位置(location段)进行限速,比如限制每个IP并发连接数为2,则
limit_conn addr 2;

2、限制请求数

要限制请求数,也必须先创建一个限速池,在http段加入如下代码:
limit_req_zone $binary_remote_addr zone=one:5m;

限速分为全局限速和局部限速,

对于全局限速,我们只需要在后面加上参数即可,比如每秒20个请求,rate=20r/s,即:
limit_req_zone $binary_remote_addr zone=perip:5m rate=20r/s;

有时候我们希望在location段调整一下链接,可以借助burst参数
limit_req zone=one burst=50;

如果不希望延时,还有nodelay参数
limit_req zone=one burst=50 nodelay;

以上是nginx的限速功能简介,不当之处,欢迎指正。至于具体使用哪种限速方法,一定要斟酌,以免破坏用户体验。


推荐阅读:

Nginx配置优化说明 http://www.linuxidc.com/Linux/2013-07/86961.htm
[最后修改由 admin, 于 2013-09-10 10:02:47]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2129

这篇日志没有评论。

此日志不可发表评论。