我无法让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
答案 0 :(得分:0)
我认为你的设置正常。我认为你有时会得到200并且有时会得到403的原因是,有时候当你的第二个请求运行时,第一个请求已经完成,让nginx服务器再次没有连接。
我想出的一件事就是通过睡觉来提出长期请求。在nginx的情况下,您可以使用echo_sleep
来休息几秒钟。
location ~ / {
echo_sleep 1.234;
proxy_pass http://upstream;
proxy_cache caching;
}
希望它能解决你的问题。