Nginx指令limit_conn不起作用

时间:2017-04-24 12:44:42

标签: nginx

我无法让nginx limit_conn指令正常工作。

我有以下nginx配置:

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

1 个答案:

答案 0 :(得分:0)

我认为你的设置正常。我认为你有时会得到200并且有时会得到403的原因是,有时候当你的第二个请求运行时,第一个请求已经完成,让nginx服务器再次没有连接。

我想出的一件事就是通过睡觉来提出长期请求。在nginx的情况下,您可以使用echo_sleep来休息几秒钟。

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

希望它能解决你的问题。