docker - 几次 POST 请求后 uwsgi 超时
问题描述
我正在尝试托管一个 python 程序。它可以通过flask托管它,但是当我将设置更改为flask + uwsgi + nginx时,会发生一些奇怪的事情:请求(POST)返回了正确的结果。然而,在几次请求之后,它就会超时。之后,即使我重新启动所有服务,请求也会超时。
我有一个使用 Ajax 和 jquery 进行测试的 UI。每次击键都会调用我在 elasticsearch 中的 API 搜索。几次尝试后超时开始,尝试次数取决于我输入的速度。
一切都在 docker 内部运行,由 docker-compose 粘合。
我尝试了多种方法:
- 将 nginx 配置文件中的 uwsgi 超时设置为更大的值
- 将nginx中的所有超时参数设置为更大的值
- 将 POST 方法更改为 GET
- 在 uwsgi.ini 中添加了 harakiri=30
- 在 uwsgi.ini 中添加了 socket-timeout=60
- 仅由 uwsgi 托管
uwsgi --http 0.0.0.0:86 --wsgi-file main.py --callable application --post-buffering 1
他们都没有工作,它总是在第二个请求时超时。如果请求返回空正文,则不会超时。
有趣的是,当 socket-timeout 设置为 60s 时,它实际上有时会从第三个请求开始超时。
以下是我的设置:
Nginx
server {listen <myport>; server_name <myip>; root /usr/share/nginx/html; location / { uwsgi_read_timeout 60s; include uwsgi_params; uwsgi_pass unix:///tmp/uwsgi.sock; } }
uwsgi
[uwsgi] socket = /tmp/uwsgi.sock chown-socket = www-data:www-data chmod-socket = 664 uid = www-data gid = www-data cheaper = 0 processes = 1 socket-timeout = 60 single-interpreter = true wsgi-file = main.py callable = application
主文件
from flask import Flask, jsonify, render_template, request
from <myfile> import _myapiworker
application = Flask(__name__)
@application.route('/_myapi', methods=['POST'])
def myapi():
req_data = request.get_json()
<assembling post body>
res_str = _myapiworker(<post body>)
return jsonify(res_str)
@application.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
application.run(host='0.0.0.0', debug=True, port=80)
解决方案
推荐阅读
- azure-devops - 使用 WIQL 获取工作项的所有子项
- python - 如何在不使用 return 的情况下从一个函数中获取信息以在 python 中的另一个函数中使用?
- java - Java跳过打印语句扫描器,具体
- javascript - 如何以编程方式隐藏 chrome 中的密码建议列表?
- angular6 - Angular 6 中 foreach 循环中的 HTTP POST 请求跳过第一项
- java - java.security.NoSuchProviderException:没有这样的提供者:nCipherKM
- javascript - CSS 技能栏响应式
- openai-gym - 如何修改健身房的环境 CarRacing-v0?
- linux - 在 ArchLinux 上屏幕找不到文件
- javascript - Typeorm:如何按关系查询