【问题标题】:How to test nginx proxy timeouts如何测试 nginx 代理超时
【发布时间】:2013-06-21 05:15:30
【问题描述】:

目标:

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

  1. 在侦听和接受测试之间proxy_connect_timeout
  2. 在接受和阅读之间测试 proxy_send_timeout
  3. 在读取和发送测试之间proxy_read_timeout

测试:

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 并添加指向我的本地 HTTP 服务器的 proxy_pass 扩展了 Nginx 默认配置:

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

3) 观察:

proxy_connect_timeout - 即使将其设置为 200 秒并且在侦听和接受之间仅休眠 130 秒,Nginx 在大约 60 秒后返回 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 超时。如果可能的话,有人可以使用上述测试向我解释它们(或根据需要进行修改)。

【问题讨论】:

    标签: python sockets http nginx proxy


    【解决方案1】:

    根据the docs,连接超时不能超过 75 秒,这可以解释为什么它的超时时间比您预期的要早。然而,不是积极的。我从未真正使用过低级 python 套接字库,因此它可能会在您实际调用程序中的 s.accept() 之前以低级接受连接到池中。

    发送超时的工作原理是测量向上游服务器发送的两个数据块之间的时间。由于您在一个块中发送整个响应,我猜在您的实现中您再次达到读取超时,而不是发送超时。如果您发送一个块,然后等待超过发送超时以发送其余响应并关闭连接,您应该达到发送超时。

    【讨论】:

    • 是的,关于 75 秒 proxy_connect_timeout 限制是正确的。无论如何,我也尝试将 proxy_connect_timeout 设置为 30 秒,并将侦听/接受延迟设置为 50 秒 - 我得到 200,这有点出乎意料!!!当我将延迟增加到 65 秒并将 proxy_read_timeout 设置为 75 秒时,我在 ~60 秒后得到 504。
    猜你喜欢
    • 2019-02-08
    • 2015-03-22
    • 2019-02-04
    • 2015-12-28
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多