2017-04-24 80 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