我正在尝试托管一个Python程序。它可以通过flask来托管它,但是当我将设置更改为flask + uwsgi + nginx时,奇怪的事情发生了:请求(POST)返回了正确的结果。但是,在几个请求之后,它将超时。之后,即使我重新启动所有服务,请求也会超时。
我有一个使用 AJAX 和jQuery进行测试的UI。每次击键都会调用我的API在elasticsearch中搜索。超时在几次尝试后开始,尝试的次数取决于我键入的速度。
一切都在docker内部运行,由docker-compose粘合。
我尝试了很多东西:
- 在nginx配置文件中设置uwsgi超时为较大值
- 设置nginx中的所有超时参数为较大值
- 将POST方法更改为GET
- 在uwsgi.ini中添加了harakiri=30
- 在uwsgi.ini中添加socket-timeout=60
- 仅通过
uwsgi --http 0.0.0.0:86 --wsgi-file main.py --callable application --post-buffering 1
使用uwsgi主机
它们都不起作用,它总是在第二个请求时超时。如果请求返回一个空的主体,它不会超时。
有趣的是,当socket-timeout设置为60 s时,它实际上有时会从第三个请求开始超时。
下面是我的设置:
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
main.py
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)
1条答案
按热度按时间rqqzpn5f1#
将http改为http-socket,如下所示:
uwsgi --http-socket 0.0.0.0:86--wsgi-file main.py--callable application --post-buffering 1
请参考uwsgi-docs https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html注意:当你有一个前端web服务器或者你正在做某种形式的基准测试时,不要使用--http,使用--http-socket。继续阅读快速入门,了解原因。