2017-04-24 57 views
1

我无法获得nginx的limit_conn指令正常工作。Nginx指令limit_conn无效

我有以下nginx的configuraton:

http { 
    limit_conn_zone $binary_remote_addr zone=per_ip:10m; 
    proxy_cache_path /var/nginx/cache/ levels=1:2 keys_zone=caching:10m max_size=10g inactive=525600m use_temp_path=off; 
    server { 
     listen 80; 
     expires -1; 
     limit_conn per_ip 1; 
     limit_conn_status 403; 
     location ~/{ 
      proxy_pass http://upstream; 
      proxy_cache caching; 
     } 
    } 
} 

如果我查询服务器具有以下Python脚本我想到的是,第二个请求应该返回一个403响应。

import httplib 

headers = {'Connection': 'keep-alive'} 

conn1 = httplib.HTTPConnection('nginx-server') 
conn1.request('GET', '/path/to/resource', '', headers) 
res1 = conn1.getresponse() 
print(res1.status) 

conn2 = httplib.HTTPConnection('nginx-server') 
conn2.request('GET', '/path/to/resource', '', headers) 
res2 = conn2.getresponse() 
# Should print 403 but most often it prints 200 
print(res2.status) 

conn1.close() 
conn2.close() 

响应状态码对第二个请求不一致。有时会返回200,有时会返回403。

也许我误解了limit_conn指令的含义,现在我期待的第二个请求始终返回403

nginx的版本:nginx的/ 1.11.9

回答

0

我觉得你的设置工作。之所以我认为你有时会得到200,有时会得到403,是因为有时当你的第二个请求运行时,第一个请求已经完成,让nginx服务器再次没有连接。

我想出的一件事就是通过睡觉让请求变成一个长时间的请求。在nginx的情况下,你可以使用echo_sleep来睡一定秒。

location ~/{ 
    echo_sleep 1.234; 
    proxy_pass http://upstream; 
    proxy_cache caching; 
} 

希望它能解决您的问题。

+0

当第二个连接发出请求时,第一个连接未关闭。这,我确信(用wireshark检查)。这可能是一个连接只在执行实际工作时才算,但我无法在任何地方找到它。但是这个指令的目的是什么呢? DDOS攻击然后可以用无用的连接填充服务器。 – olif