从django + gunicorn + nginx设置向外部URL发出POST请求

时间:2016-09-14 13:30:52

标签: django nginx gunicorn

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

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代理后面,我应该在从应用程序发送帖子请求时做些不同的事情吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

这是一个枪支超时问题。您可以通过在执行gunicorn的命令中指定附加标志--timeout 60来增加gunicorn的超时。当然,您可以根据需要自定义超时长度。争论的时间是几秒钟。