NGINX、uWSGI和Flask无法运行子进程
这是我的NGINX配置:
server {
server_name 127.0.0.1;
listen 4450;
location ~* ^/.*$ {
include uwsgi_params;
uwsgi_pass unix:/tmp/esrvadmin.sock;
}
}
这是uWSGI的启动设置:
uwsgi --uid root -s /tmp/esrvadmin.sock --chown-socket nobody:root \
--file /var/www/sitios/manten/srv.py \
--processes 2 --callable app --pidfile /var/run/edesarrollos/esrvadmin.pid
这是用Python和Flask写的代码:
import os, subprocess
from flask import Flask, abort, request
app = Flask(__name__)
DETO_DIR = '/var/www/sitios/manten/detos'
@app.route('/detonate')
def index():
#return str(subprocess.check_output(['ls','-l']))
token = request.args.get('token','')
if token != '':
# Si no existe el directorio de detonatores, se crea
if not os.path.exists(DETO_DIR):
os.mkdir(DETO_DIR)
if os.path.isfile(DETO_DIR+"/"+token):
try:
os.system(open(DETO_DIR+"/"+token).read())
except Exception as ex:
return str(ex)
return "Reiniciado Correctamente"
else:
abort(404)
else:
abort(404)
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0')
在主模式下,我可以在os.system("something args")里面运行任何命令,并且能收到它的HTTP响应,甚至可以用“service something start”来启动服务,结果也都正常。不过我试过用subprocess函数,没成功。
但是当我通过NGINX和uWSGI来运行时,我的HTTP请求就像是一直在等待,当然也就没有响应,但它确实完成了任务(启动了一个服务)。
我在日志中找到的最好的错误描述是:
2013/01/28 03:38:24 [error] 3978#0: *3 upstream timed out (110: Connection timed out)
while reading response header from upstream, client:
127.0.0.1, server: 127.0.0.1, request: "GET
/detonate?token=start-
a81260812b643d8672ccf9570033109f200595779e0a352e630a75760328e2d375025ef349e
3d599f368092abb63511f-23611e81194b04d5d0a6d0f02baf7fb9
HTTP/1.1", upstream: "uwsgi://unix:/tmp/esrvadmin.sock:", host: "127.0.0.1:4450"
你觉得可能发生了什么呢?
1 个回答
2
可以在这里查看:http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html(注意里面提到的 --close-on-exec 这一部分)。还有,请务必不要以管理员身份运行 uWSGI!