如何测试nginx代理超时

时间:2013-06-24 15:59:34

标签: python sockets http nginx proxy

:定位:

我想在非常简单的场景中测试所有Nginx代理超时参数。我的第一种方法是创建非常简单的HTTP服务器并添加一些超时:

  1. 在listen和accept之间测试 proxy_connect_timeout
  2. 在接受和阅读之间测试 proxy_send_timeout
  3. 读取和发送到测试之间 proxy_read_timeout
  4. 测试

    1)服务器代码(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配置:

    我通过明确设置 proxy_connect_timeout 并添加 proxy_pass 指向我的本地HTTP服务器来扩展Nginx默认配置:

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

    3)观察:

    proxy_connect_timeout - 即使将其设置为200s并且在listen和accept之间仅休眠130s,Nginx在~60s之后返回504,这可能是由于默认的 proxy_read_timeout 值。我不明白 proxy_read_timeout 如何在早期阶段(接受之前)影响连接。我希望在这里200。请解释一下!

    proxy_send_timeout - 我不确定我的测试 proxy_send_timeout 的方法是否正确 - 我想我仍然无法正确理解此参数。毕竟,accept和read之间的延迟不会强制执行proxy_send_timeout。

    proxy_read_timeout - 看起来非常简单。设置读取和写入之间的延迟可以完成工作。

    所以我猜我的假设是错误的,可能我不理解proxy_connect和proxy_send超时。如果可能的话,可以使用上述测试向我解释它们(或者如果需要可以修改)。

1 个答案:

答案 0 :(得分:4)

根据the docs,连接超时不能超过75秒,这可以解释为什么它比你预期的更快。然而,并不积极。我从来没有真正使用过低级别的python套接字库,所以它可能会在你的程序中实际调用s.accept()之前接受低级别的池连接。

通过测量前往上游服务器的两个数据块之间的时间来发送超时。因为你在一个块中发送整个响应,我猜测你的实现是你再次达到读取超时,而不是发送超时。如果发送一个块,然后等待发送超时以发送其余响应并关闭连接,则应该发送超时。