如何测试nginx代理超时

目标:

我想在非常简单的情况下测试所有的Nginx代理超时参数。 我的第一个方法是创建一个非常简单的HTTP服务器并放置一些超时:

  • 在listen和accept之间测试proxy_connect_timeout
  • 在accept和read之间测试proxy_send_timeout
  • 在读取和发送之间测试proxy_read_timeout
  • 测试:

    1)服务器代码(python):

    import socket
    import os
    import time
    import threading
    
    def http_resp(conn):
        conn.send("HTTP/1.1 200 OKrn")
        conn.send("Content-Length: 0rn")
        conn.send("Content-Type: text/xmlrnrnrn")
    
    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并添加指向我本地HTTP服务器的proxy_pass来扩展了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超时。 如果可能的话,是否可以使用上述测试向我解释它们(或者如果需要修改)。


    根据文档,连接超时不能超过75秒,这可以解释为什么它比您预期的更早超时。 然而,不是积极的。 我从来没有真正完成低级别的python套接字库的工作,所以在实际调用程序中的s.accept()之前,它可能会在较低级别上接受连接池。

    通过测量朝向上游服务器的两个数据块之间的时间来发送超时。 由于您将整个响应发送到一个块中,我猜测在您的实现中,您再次发生读取超时,而不是发送超时。 如果您发送一个块,然后等待发送超时发送剩余的响应并关闭连接,则应该触发发送超时。

    链接地址: http://www.djcxy.com/p/72229.html

    上一篇: How to test nginx proxy timeouts

    下一篇: Case insensitive f key in vim?