有什么方法可以使用nginx(1.6.0)来限制动词请求吗?
例如,对于任何一个IP地址,每秒最多允许15 GET
秒,但每秒只允许3 POST
秒?
目前尝试使用以下内容会在nginx错误日志中出现错误:
2014/05/20 16:24:39 [emerg] 1914#0: "limit_req" directive is not allowed here in /etc/nginx/sites-enabled/site.conf:13
site.conf
包含在http块中。
# Rate limiting
limit_req_zone $binary_remote_addr zone=get_requests:10m rate=15r/s;
limit_req_zone $binary_remote_addr zone=post_requests:10m rate=3r/s;
limit_req_status 429;
server {
listen 4000;
# Rate limiting
limit_req zone=get_requests;
if ($request_method = 'POST') {
limit_req zone=post_requests;
}
location / {
}
}
修改1
我也尝试在location /
之后插入以下条件中断子句,但这不起作用,因为系统每秒限制为1个请求:
limit_req zone=get_requests;
if ($request_method != 'POST') {
break;
}
limit_req zone=post_requests;
答案 0 :(得分:1)
尝试这样的事情。
如果$request_method
是POST,请返回一个数字代码(" 588"在此示例中),这将由命名位置@postrequests处理以限制它。
# Rate limiting
limit_req_zone $binary_remote_addr zone=get_requests:10m rate=15r/s;
limit_req_zone $binary_remote_addr zone=post_requests:10m rate=3r/s;
limit_req_status 429;
server {
listen 4000;
error_page 588 = @postrequests;
if ($request_method = 'POST') {
return 588;
}
location / {
limit_req zone=get_requests burst=0;
# the usual stuff..
}
location @postrequests {
limit_req zone=post_requests burst=0;
# the usual stuff..
}
}