使用Nginx上的Fabric在Python Flask Web应用程序中上游超时错误

时间:2016-06-22 08:29:39

标签: python nginx flask fabric

我在nginx上托管了我的Python Flask Web应用程序。在尝试执行请求时,它会在nginx错误日志中显示超时错误,如下所示:

  

[错误] 2084#0:* 1上游超时(110:连接超时)   从上游读取响应头,客户端:   192.168.2.224,服务器:192.168.2.131,请求:“POST /执行HTTP / 1.1”,上游:“uwsgi:// unix:/ hom
  e / jay / PythonFlaskApp / app.sock“,主持人:”192.168.2.131:9000“,推荐人:   “http://192.168.2.131:9000/

如果我尝试在本地运行应用程序,它可以正常工作并且响应很好。 任何人都知道可能出现什么问题?

浏览器控制台中发现的错误是:

  

网关超时

这是nginx配置文件:

server {
    listen 9000;
    server_name 192.168.2.131;

    location / {
        include uwsgi_params;
        proxy_read_timeout 300;
        uwsgi_pass unix:/home/jay/PythonFlaskApp/app.sock;
    }
}

这是我试图执行的Python Fabric代码。我不确定这是否导致了这个问题,但是这里的代码是代码:

from fabric.api import *

@application.route("/execute",methods=['POST'])
def execute():
    try:
        machineInfo = request.json['info']
        ip = machineInfo['ip']
        username = machineInfo['username']
        password = machineInfo['password']
        command = machineInfo['command']
        isRoot = machineInfo['isRoot']

        env.host_string = username + '@' + ip
        env.password = password
        resp = ''
        with settings(warn_only=True):
            if isRoot:
                resp = sudo(command)
            else:
                resp = run(command)

        return jsonify(status='OK',message=resp)
    except Exception, e:
        print 'Error is ' + str(e)
        return jsonify(status='ERROR',message=str(e))

我有一个用于Web应用程序的uWSGi配置文件,并使用upstart脚本启动它。这是uwSGi conf文件:

[uwsgi]
module = wsgi

master = true
processes = 5

socket = app.sock
chmod-socket = 660
vacuum = true

die-on-term = true

这是upstart脚本

description "uWSGI server instance configured to serve Python Flask App"

start on runlevel [2345]
stop on runlevel [!2345]

setuid jay
setgid www-data

chdir /home/jay/PythonFlaskApp
exec uwsgi --ini app.ini

我在running flask app on nginx

上遵循了以下教程

1 个答案:

答案 0 :(得分:0)

这可能是Fabric任务的问题,而不是Flask。您是否尝试过从应用程序中隔离/删除Fabric,仅用于故障排除?您可以尝试删除resp的值,而不是在函数中实际执行run / sudo命令。我敢打赌,如果你这样做,该应用程序的工作正常。

因此,这意味着您在Fabric执行相关命令时遇到问题。您应该做的第一件事是通过使用您在其中一个请求中期望的信息在生产服务器上模拟示例Fabfile,然后使用fab -f <mock_fabfile.py>运行它来验证这一点。

还值得注意的是,使用with settings(warn_only=True):可以导致错误消息的抑制。我认为您应该删除它,因为您处于故障排除方案中。来自the docs on Managing Output

  

警告:警告消息。当人们期望给定的操作失败时,例如当使用grep来测试文件中文本的存在时,这些通常会被关闭。 如果将env.warn_only设置为True,则在远程程序失败时会导致完全无声警告。与中止一样,此设置不控制实际警告行为,仅控制是打印还是隐藏警告消息。

作为第三个建议,您可以使用 the show('debug') context manager以及enabling Paramiko's logging从Fabric中获取更多信息:

from fabric.api import env
from fabric.context_managers import show

# You can also enable Paramiko's logging like so:
import logging
logging.basicConfig(level=logging.DEBUG)

def my_task():
    with show('debug'):
        run('my command...')

Fabric文档还提供了一些其他疑难解答建议:http://docs.fabfile.org/en/1.6/troubleshooting.html。 (1.6是较旧/过时的版本,但概念仍然适用。)