Flask timeout when serve using gunicorn
问题
项目基于Gunicorn+Flask去提供python接口服务,供前端调用。其中Flask的程序中有一环节是需要去通过传入的url去获取图片内容,然后进行后续的相应处理。问题来了,启动服务后,传入参数后,使用postman调用,对于内网链接能够正常返回结果,但是对于外网链接一直报错连接超时错误:
lib/python3.6/socket.py", line 713, in create_connection
sock.connect(sa)
TimeoutError: [Errno 110] Connection timed out
During handling of the above exception, another exception occurred:
lib/python3.6/urllib/request.py", line 1320, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 110] Connection timed out>
慢慢查看代码发现是卡在这一句上面了
resp = urllib.request.urlopen(url)
但是单独传入一样的url,这部分代码是没有问题的能够正常获取链接对应的内容,在这个地方查了一下午的bug,最后发现是一个小的失误导致的。
解决方法
基于问题去查看相关的资料,有的人给出的原因说是由于gunicorn默认的timeout
时间为30秒,可以对其进行配置文件进行设置来解决时间超时问题, 比如类似下面这种:
gunicorn -t 120
但尝试后还是会出现这种问题,也有相同的人问这个问题
https://stackoverflow.com/questions/60035871/flask-timeout-when-serve-using-gunicorn/62992081
情况一模一样,单独运行没有问题,串在一起出现问题了。
刚开始以为是外网地址链接会非常慢导致出现连接超时问题,但是按照上述设置等候时间,不管设置多久的时间还是报错,就知道应该不是gunicorn的问题。最后我找到这边的问题是代理服务器让我强制默认为空了,这是由于之前的一个下载fastdfs的时候报错解决的方法,这里程序暂时没有用到fastdfs,将其注释掉,能够正常访问外网地址,获取结果了。
os.environ['http_proxy'] = ""
os.environ['https_proxy'] = ""
-------> changed to
# os.environ['http_proxy'] = ""
# os.environ['https_proxy'] = ""
总结
遇到bug时候不要慌,分析bug问题是什么,针对这个问题去找对应的解决方法即可,慢慢在程序中找点输出对应的内容,看看是哪一步可能出现问题了,找到对应的点,针对性的去找问题,这样可能更容易更快的去解决bug。