【问题标题】:Making a POST request to an external URL from a django + gunicorn + nginx setup从 django + gunicorn + nginx 设置向外部 URL 发出 POST 请求
【发布时间】:2017-01-22 08:11:30
【问题描述】:

我正在从运行在 django+nginx+gunicorn 上的 Web 应用程序中的方法发送发布请求。在 django 自己的服务器(使用 runserver)上执行时,我没有收到来自相同代码的 200 响应的问题。

try:
    response = requests.post(post_url, data=some_data)
    if response.status_code == OK and response.content == '':
        logger.info("Request successful")
    else:
        logger.info("Request failed with response({}): {}".format(response.status_code, response.content))
        return response.status_code == OK and response.content == ''
except requests.RequestException as e:
    logger.info("Request failed with exception: {}".format(e.message))
    return False

我检查了 post_url 的服务器日志,它确实返回了 200 响应与此数据。但是,当我在 gunicorn 和 nginx 后面运行应用程序时,我无法接收响应(但是正在发送请求)。代码在 try 块后卡在第一行,gunicorn worker 超时(30 秒后)。

这是 post_url 处的 apache 服务器日志:

[14/Sep/2016:13:19:20 +0000] "POST POST_URL_PATH HTTP/1.0" 200 295 "-" "python-requests/2.9.1"

更新:

我忘了说,这个请求执行不到一秒,所以不是超时问题。配置有问题?我有标准的 nginx+gunicorn 设置,其中 gunicorn 设置为 nginx 中的 proxy_pass。我猜,因为我在 nginx 代理后面,我应该在从应用程序发送发布请求时做一些不同的事情吗?

【问题讨论】:

  • 由于您提供了一些有用的诊断信息,我认为您可以在这里遇到{}类型的错误:-似乎您可以实现http请求但无法获得结果。首先,检查你的防火墙(可能是iptables -L 命令,看看你的INPUT 表上是否有关于端口80 的规则)。 - 您的请求是对不可信服务器的 https 请求吗? - 您是否尝试过访问另一台服务器?
  • 你有多少个 gunicorn 工人?
  • @artragis 我可以使用 django shell 成功执行请求。我可以在同一台机器上在 python 脚本中运行相同的代码,而不会出现任何问题。
  • @VBart 我没有设置任何数字,这意味着它默认为 1。为了完成这个请求,另一个请求被发送回服务器......这让我觉得有更多的工人会解决这个问题吗?是的。

标签: django nginx gunicorn


【解决方案1】:

这是一个 gunicorn 超时问题。您可以通过在用于执行 gunicorn 的命令中指定附加标志 --timeout 60 来增加 gunicorn 的超时时间。当然,您可以根据需要自定义超时长度。参数以秒为单位。

【讨论】:

  • 这不是超时问题。如果没有 gunicorn,发布请求只需不到一秒钟即可完成。
【解决方案2】:

您可能在使用 Nginx 时遇到问题,问题可能是 nginx request entity too large。如果您向服务器发送的数据太大,Nginx 可能会拒绝该请求。当我们尝试上传太大的图像时,我们遇到了 Nginx 问题。我们还使用 nginx + gunicorn 和 django。所以我怀疑。这可能是同一个问题。

【讨论】:

  • 不,我只是发送一个带有一些数据的小型 python 对象,没什么大不了的。无论如何我可以调试这个?
  • 另外,请求正在发送中,我没有收到响应,仅此而已
【解决方案3】:

在我的 gunicorn 设置中,设置 workers=2 解决了这个问题。

当我向外部 URL 发送请求时,外部应用程序会发回请求。这个新请求将占用应用程序中唯一的工作人员。我发出的原始请求是无工人的,所以它被卡住了。 有了 2 个工作人员,我可以同时发出一个请求并接收另一个请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2013-09-17
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多