nginx能够经过limit_conn_zone 和limit_req_zone两个组件来对客户端访问目录和文件的访问频率和次数进行限制,另外还能够善用进行服务安全加固,两个模块都可以对客户端访问进行限制,具体如何使用要结合公司业务环境进行配置。css
如能善用此模块可以对 cc、ddos等此类的攻击进行有效的防护。html
一:nginx访问限制模块简介node
nginx限速配置指令nginx
1.安全
指令服务器
limit_zonesession
语法:limit_conn_zone $variable zone=name:size;并发
默认值:notcp
使用字段:http性能
指令描述会话状态存储区域。
会话的数目按照指定的变量来决定,它依赖于使用的变量大小和memory_max_size的值。
2.
指令
limit_conn
语法:limit_conn zone_name max_clients_per_ip
默认值:no
使用字段:http, server, location
指令指定一个会话的最大同时链接数,超过这个数字的请求将被返回”Service unavailable” (503)代码。
以下例:
http { imit_conn_zone $binary_remote_addr zone=one:10m; ............ server { listen 80; server_name www.abc.com; location / { limit_conn one 1; #这将指定一个地址只能同时存在一个链接。“one”与上面的对应,也能够自定义命名 limit_rate 300k; } }
limit_zone: 是针对每一个IP定义一个存储session状态的容器.这个示例中定义了一个10m的容器,按照32bytes/session, 能够处理320000个session。
limit_conn one 1:限制每一个IP只能发起一个并发链接。
limit_rate 300k: 对每一个链接限速300k. 注意,这里是对链接限速,而不是对IP限速。若是一个IP容许两个并发链接,那么这个IP就是限速limit_rate×2。
nginx限制访问频率配置指令
3.
指令
limit_req_zone
语法:limit_req_zone $session_variable zone=name:size rate=rate
默认值:none
上下文:http
命令解析:为session会话状态分配一个大小为size的内存存储区,限制了每秒(分、小时)只接受rate个IP的频率。
4.
指令
limit_req
语法:limit_req zone=name burst=burst [nodelay]
默认值:none
使用字段:http、server、location
命令解析:该指令用于指定使用的内存存储区(zone)名称,以及最大的突发请求数(burse)。若是请求的速率超过了limit_req_zone指令中设置的速率,这些请求将被延迟处理,在这种状况下,请求得到服务不可用信息,返回503状态码。
以下例:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /{ limit_req zone=one burst=10; } }
上面的参数会让nginx 每一个IP一秒钟只处理一个请求,可是仍然会有不少还在队列里面等待处理,这样也会占用不少tcp链接,从上面那条命令的结果中就能看得出来。
若是加上nodelay就会当即丢弃
limit_req zone=one burst=10 nodelay;
5.
指令
limit_conn_log_level
语法: limit_conn_log_level info | notice | warn | error
默认值: error
使用字段: http, server, location
指定当链接数超过设定的最大链接数,服务器限制链接时的日志等级。
2、实际应用
若是做为代理服务器,咱们须要限制每一个用户的请求速度和连接数量,可是,因为一个页面有多个子资源,若是毫无选择的都进行限制,那就会出现不少没必要要的麻烦,如:一个页面有40个子资源,那么若是想让一个页面完整的显示,就须要将请求速度和链接数都调整到40,以此达到不阻塞用户正常请求,而这个限制,对服务器性能影响很大,几百用户就能把一台nginx的处理性能拉下来。
因此咱们须要制定哪些请求是须要进行限制的,如html页面;哪些是不须要限制的,如css、js、图片等,这样就须要经过配置对应的location进一步细化。
咱们不对css、js、gif、png,jpg等进行链接限制,而对除此以外的连接进行限制
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_header X-Real_IP $remote_addr; proxy_set_header 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; #p_w_picpath_filter resize 480 -; #p_w_picpath_filter_jpeg_quality 50; #p_w_picpath_filter_sharpen 10; #p_w_picpath_filter_buffer 4M; } location / { 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; #limit limit_conn addr 3; limit_req zone=one burst=5; } }
补充路径详解:
格式:location ??? {
}
路径优先级 (与代码所在先后顺序无关,只与规则有关)
1. = /error.html
2. ^~ /images/
3. ~* \.(gif|jpg|jpeg|png|bmp|swf)$
4. /static/
5. /
解释:
1.表示完整匹配,用=和彻底的路径匹配,好比 =/error.html 就匹配 error.html =/ 匹配根路径
2.表示开头等于,优先级第二,越长就越能匹配,好比^~ /abc/cd ^~/abc 第一个会优先匹配/abc/cd/xxx
3.表示不区分大小的正则,而且正则中含义是.jpg等结尾的,优先级第三,一样正则越长越高。
4.表示开头等于/static/的,可是优先级比第二种低,是一种其余配置找不到再找它,越长就越能匹配。
5.由于4说了是越长越能匹配,当能匹配/static/就不会匹配/,而/是全部其余的一个默认匹配。
特别补充好比:location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ { //注意正则与其余符号要空格,其余一些配置也是如是。
参考官方文档:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html