加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > Nginx > 正文

如何测试nginx代理超时

发布时间:2020-12-13 21:21:06 所属栏目:Nginx 来源:网络整理
导读:目标: 我想在非常简单的场景中测试所有Nginx代理超时参数.我的第一个方法是创建非常简单的HTTP服务器并添加一些超时: 在listen和accept之间测试proxy_connect_timeout 在accept和read之间测试proxy_send_timeout 读取和发送之间测试proxy_read_timeout 测

目标:

我想在非常简单的场景中测试所有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超时.有些人可以使用上述测试向我解释它们(如果需要可以修改).

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读