2013-06-24 3 views
7

Ziel:Wie nginx Proxy testen Timeouts

ich alle Nginx Proxy-Timeout-Parameter in sehr einfaches Szenario testen möchten. Mein erster Ansatz war wirklich einfachen HTTP-Server zu erstellen und setzt einige Timeouts:

  1. Zwischen hören und akzeptieren proxy_connect_timeout
  2. Zwischen akzeptieren und proxy_send_timeout
  3. Zwischen Lese zu testen lesen zu testen und senden Test proxy_read_timeout

Test:

1) Server-Code (Python):

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 Konfiguration:

I Nginx Standardkonfiguration explizit proxy_connect_timeout Einstellung und das Hinzufügen von proxy_pass deutet auf meinem lokal erweitert HTTP-Server:

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

3) Obse rvation:

proxy_connect_timeout - Auch wenn es zu 200s Einstellung und nur 130s zwischen hören schlafen und akzeptieren Nginx 504 kehrt nach ~ 60s, die proxy_read_timeout Wert, weil der Standard sein könnte. Ich verstehe nicht, wie proxy_read_timeout Verbindung in so frühen Stadium beeinflussen könnte (bevor akzeptieren). Ich würde 200 hier erwarten. Bitte erkläre!

proxy_send_timeout - Ich bin nicht sicher, ob mein Ansatz proxy_send_timeout zu testen ist richtig - ich glaube, ich richtig noch diesen Parameter nicht verstehen. Schließlich zwingt die Verzögerung zwischen akzeptieren und lesen Proxy_send_timeout nicht.

proxy_read_timeout - es scheint ziemlich einfach zu sein. Das Einstellen der Verzögerung zwischen Lesen und Schreiben erledigt den Job.

Also ich denke, meine Annahmen sind falsch und wahrscheinlich verstehe ich nicht proxy_connect und proxy_send timeouts richtig. Können mir einige die Möglichkeit geben, den obigen Test zu benutzen, wenn möglich (oder wenn nötig, zu ändern).

Antwort

4

Laut the docs darf der Verbindungs-Timeout nicht mehr als 75 Sekunden betragen, was erklären könnte, warum er schneller als erwartet abläuft. Nicht positiv, jedoch. Ich habe nie wirklich mit der Low-Level-Python-Socket-Bibliothek gearbeitet, so dass es die Verbindung in den Pool auf einer niedrigen Ebene akzeptiert, bevor Sie in Ihrem Programm tatsächlich s.accept() aufrufen.

Sende-Timeout funktioniert durch Messung der Zeit zwischen zwei Datenblöcken, die zum Upstream-Server geleitet werden. Da Sie die gesamte Antwort in einem Chunk senden, vermute ich in Ihrer Implementierung, dass Sie das Lese-Timeout erneut treffen, anstatt ein Sende-Timeout.Wenn Sie einen Chunk senden, dann nach dem Send-Timeout warten, um den Rest der Antwort zu senden und die Verbindung zu schließen, sollten Sie das Send-Timeout erreichen.

+0

Ja, Sie haben Recht ungefähr 75s proxy_connect_timeout Limit. Wie auch immer, ich habe auch probiert, proxy_connect_timeout auf 30s zu setzen und die Verzögerung zu 50s zu hören/zu akzeptieren - ich bekomme 200, was ein bisschen unerwartet ist !!! Wenn ich die Verzögerung auf 65s vergrößere und proxy_read_timeout auf 75s setze, erhalte ich 504 nach ~ 60s. – mkorszun