当前位置: 首页 > 知识库问答 >
问题:

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

昌勇锐
2023-03-14

如果我尝试在本地运行该应用程序,它工作良好,反应良好。有人知道会出什么问题吗?

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

网关超时

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;
    }
}
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))
[uwsgi]
module = wsgi

master = true
processes = 5

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

die-on-term = true
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

我已经按照下面的教程在nginx上运行flask应用程序

共有1个答案

宗政浩慨
2023-03-14

这可能是Fabric任务的问题,而不是烧瓶的问题。您是否尝试过将Fabric从应用程序中隔离/移除,只是为了故障排除的目的?您可以尝试为resp插入一个值,而不是在函数中实际执行run/sudo命令。我敢打赌,如果你这样做了,应用程序就会工作得很好。

这意味着Fabric在执行该命令时遇到了问题。首先要做的是通过在生产服务器上模拟一个示例Fabfile来验证这一点,该示例使用您在某个请求中期望的信息,然后使用fab-f 运行该示例Fabfile。

还值得注意的是,将与设置一起使用(warn_only=true):可能会导致错误消息的抑制。我认为您应该删除它,因为您正处于故障排除方案中。来自关于管理输出的文档:

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

第三个建议是,通过使用show('debug')上下文管理器以及启用Paramiko的日志记录,可以从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/troleshooting.html。(1.6是一个较旧/过时的版本,但这些概念仍然适用。)

 类似资料:
  • 我们部署了一个Express web API,它获得了相当大的但相对较小的流量(平均每秒约10个请求),这些流量运行在通过Nginx代理的EC2 ubuntu服务器上。每隔一段时间,一个请求就会挂起,如果客户端等待的时间足够长,就会将包含以下内容的行输出到NGINX错误日志中: 我已经试过这里建议的解决办法,但似乎没有效果。这只发生在我们的知识大约1-3次每分钟,但我只是离开这些日志。如果客户机在

  • 我的应用程序有以下堆栈: Nginx(1.4.6) UWSGI(1.9.17.1-Debian(64bit)) 烧瓶 Python 3.4 NGINX重启后的问题在一段时间内(几分钟)都能正常工作。在此期间之后,我收到一个“504网关超时”错误。 NGINX日志: *13从上游读取响应标头时上游超时(110:连接超时),客户端:86.123.39.44,服务器:app.fc.com,请求:“get

  • null 我们得出的结论是,客户端可以连接到Nginx,但是Nginx在将请求重定向到FPM(可以通过端口7777访问)时没有收到响应,并显示超时错误。我们一直致力于解决Nginx和FPM之间的通信问题,但几个小时后,我们还没有找到解决方案。 注意:这个问题在我们设置的四个虚拟机中重复出现。 Nginx错误日志(注意:主机名和ip已被取消) 文件:/etc/nginx/fastcgi_params

  • 我有Puma运行作为上游应用服务器和Riak作为我的后台数据库集群。当我发送一个请求,为大约25K用户映射-减少一个数据块,并将其从Riak返回到应用程序时,我在Nginx日志中得到一个错误: Nginx有一系列超时指令。我不知道我是不是漏掉了什么重要的东西。如有任何帮助将不胜感激....