通过django + gunicorn + nginx设置向外部URL发送POST请求

我在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" 

更新:

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

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

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

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

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