2013-06-24 185 views
7

目標:如何測試的nginx代理超時

我想測試非常簡單的場景,所有的Nginx代理超時參數。我的第一個方法是創建非常簡單的HTTP服務器,並把一些超時:

  1. 之間傾聽和接受測試proxy_connect_timeout
  2. 之間接受和讀取測試讀取之間proxy_send_timeout
  3. 併發送至測試proxy_read_timeout

測試:

1)服務器的代碼(蟒蛇):

import socket 
import os 
import time 
import threading 

def http_resp(conn): 
    conn.send("HTTP/1.1 200 OK\r\n") 
    conn.send("Content-Length: 0\r\n") 
    conn.send("Content-Type: text/xml\r\n\r\n\r\n") 

def do(conn, addr): 
    print 'Connected by', addr 
    print 'Sleeping before reading data...' 
    time.sleep(0) # Set to test proxy_send_timeout 
    data = conn.recv(1024) 
    print 'Sleeping before sending data...' 
    time.sleep(0) # Set to test proxy_read_timeout 
    http_resp(conn) 
    print 'End of data stream, closing connection' 
    conn.close() 

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    s.bind(('', int(os.environ['PORT']))) 
    s.listen(1) 
    print 'Sleeping before accept...' 
    time.sleep(130) # Set to test proxy_connect_timeout 
    while 1: 
     conn, addr = s.accept() 
     t = threading.Thread(target=do, args=(conn, addr)) 
     t.start() 

if __name__ == "__main__": 
    main() 

2)Nginx的配置:

我已經通過設置明確proxy_connect_timeout並添加proxy_pass指着我的本地擴展Nginx的默認配置HTTP服務器:

location/{ 
     proxy_pass http://localhost:8888; 
     proxy_connect_timeout 200; 
    } 

3)Obse rvation:

proxy_connect_timeout - 即使它設定爲200s,睡覺只能聽和接受的Nginx後返回504〜這可能是因爲默認proxy_read_timeout值的60間130S。我不明白如何proxy_read_timeout可能會影響在這麼早的階段(接受之前)的連接。我期望在這裏200。請解釋!

proxy_send_timeout - 我不知道如果我的方法進行測試proxy_send_timeout是正確的 - 我想我還是不正確理解此參數。畢竟,accept和read之間的延遲不會強制proxy_send_timeout。

proxy_read_timeout - 它似乎很簡單。設置讀取和寫入之間的延遲完成作業。

所以我想我的假設是錯誤的,可能我不明白proxy_connect和proxy_send超時正確。如果可能的話,是否可以使用上述測試向我解釋它們(或者如果需要修改)。

回答

4

根據the docs連接超時不能超過75秒,這可能解釋爲什麼它比您預期的更早超時。然而,不是積極的。我從來沒有真正完成低級別的python套接字庫的工作,所以在實際調用程序中的s.accept()之前,它可能會在較低級別上接受連接池。

發送超時通過測量兩個數據塊之間的時間間隔來工作,這些數據朝向上游服務器。由於您將整個響應發送到一個塊中,我猜測在您的實現中,您再次發生讀取超時,而不是發送超時。如果您發送一個塊,然後等待發送超時發送剩餘的響應並關閉連接,則應該觸發發送超時。

+0

是的,你是正確的約75s proxy_connect_timeout限制。無論如何,我也嘗試將proxy_connect_timeout設置爲30秒,並聽取/接受延遲至50秒 - 我得到200,這有點意外!當我將延遲增加到65秒並將proxy_read_timeout設置爲75秒後,我在〜60s後得到了504。 – mkorszun