错误:从上游 [uWSGI/Django/NGINX] 读取响应标头时,上游过早关闭连接

Posted

技术标签:

【中文标题】错误:从上游 [uWSGI/Django/NGINX] 读取响应标头时,上游过早关闭连接【英文标题】:Error: upstream prematurely closed connection while reading response header from upstream [uWSGI/Django/NGINX] 【发布时间】:2014-04-02 04:43:30 【问题描述】:

我目前总是在我的用户正在执行的查询中得到 502...通常返回 872 行并且需要 2.07 才能在 mysql 中运行。然而,它返回了很多信息。 (每一行包含很多东西)。有什么想法吗?

运行 Django (tastypie Rest API)、nginx 和 uWSGI 堆栈。

使用 NGINX 配置服务器

# the upstream component nginx needs to connect to
upstream django 
    server unix:///srv/www/poka/app/poka/nginx/poka.sock; # for a file socket


# configuration of the server
server 
    # the port your site will be served on
    listen  443;


    # the domain name it will serve for
    server_name xxxx; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 750M;   # adjust to taste

    # Finally, send all non-media requests to the Django server.
    location / 
        uwsgi_pass  django;
        include     /srv/www/poka/app/poka/nginx/uwsgi_params; # the uwsgi_params file you installed
    

UWSGI 配置

# process-related settings
# master
master          = true
# maximum number of worker processes
processes   = 2
# the socket (use the full path to be safe
socket          = /srv/www/poka/app/poka/nginx/poka.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 666
# clear environment on exit
vacuum          = true

pidfile = /tmp/project-master.pid # create a pidfile
harakiri = 120 # respawn processes taking more than 20 seconds
max-requests = 5000 # respawn processes after serving 5000 requests
daemonize = /var/log/uwsgi/poka.log # background the process & log
log-maxsize = 10000000
#http://uwsgi-docs.readthedocs.org/en/latest/Options.html#post-buffering
post-buffering=1
logto = /var/log/uwsgi/poka.log # background the process & log

【问题讨论】:

显而易见的答案是拆分数据或增加超时。那不行吗? 在哪里可以增加超时时间?增加harakiri并没有帮助......我需要在不久的将来实际拆分数据......但我现在没有时间...... 我假设 2.07 是秒?日志中有任何内容吗?直接运行uWSGI HTTP server,看看是uWSGI还是nginx卡住了? 是的,在几秒钟内......但问题是 872 行现在不算什么......在不久的将来它可能会增长到 10,000。但用户最终需要以一种或另一种方式将这 10,000 行数据输入到他的 iPad 中。我应该开始考虑批量发送数据吗? 【参考方案1】:

这可能是 uwsgi 配置问题,而不是 Nginx。我看到您有 uwsgi processes = 2 和 harakiri = 120,您是否尝试过一一更改这些以及其他字段?

我遇到了同样的问题,但不是我的 NGINX 配置,而是我的 UWSGI 进程在我将 JSON 从客户端发布到服务器时导致超时错误。我的进程为 5,我将其更改为 1,它解决了这个问题。对于我的应用程序,我只需要一次运行 1 个进程。

这是解决超时问题和 502 网关问题(上游过早关闭)的有效 UWSGI 配置自动引导 ini 文件。

autoboot.ini

#!/bin/bash

[uwsgi]
socket          = /tmp/app.sock

master          = true

chmod-socket    = 660
module          = app.wsgi
chdir           = home/app

close-on-exec = true # Allow linux shell via uWSGI

processes = 1
threads = 2
vacuum = true

die-on-term = true

希望对你有帮助。

【讨论】:

【参考方案2】:

有时可能是权限问题。检查项目目录的权限。

【讨论】:

【参考方案3】:

我遇到了同样的问题,为我解决的问题是将我的域添加到 settings.py 例如:

ALLOWED_HOSTS = ['.mydomain.com', '127.0.0.1', 'localhost']

同样的问题,我的意思是我什至无法加载页面,nginx 会返回 502 而不提供任何可能导致应用程序崩溃的页面。

而 nginx 日志包含:

Error: upstream prematurely closed connection while reading response header from upstream

【讨论】:

【参考方案4】:

在您的@django 位置块中,您可以尝试添加一些代理读取和连接超时属性。例如

location @django 
   proxy_read_timeout 300;
   proxy_connect_timeout 300;
   proxy_redirect off;

   # proxy header definitions
   ...
   proxy_pass http://django;

【讨论】:

前 3 行帮助我解决了 502 ws 错误【参考方案5】:

这不太可能是 nginx 配置问题。

几乎可以肯定,后端实际上正在崩溃(或只是终止连接),而不是给出格式错误的响应。即错误消息告诉您问题是什么,但您正在寻找错误的地方来解决它。

您没有提供足够的信息来确定确切的问题是什么,但如果我不得不猜测:

通常返回 872 行并在 MySQL 中运行需要 2.07。然而,它返回了很多信息。

它要么在某个地方超时,要么内存不足。

【讨论】:

872 行现在不算什么...在不久的将来它可能会增长到 10,000。但用户最终需要以一种或另一种方式将这 10,000 行输入到他的 iPad 中。我应该开始考虑批量发送数据吗? 不,你应该找到导致后端终止请求的原因。 支持您的内存不足。我认为短期内很难意识到内存可能是此类错误流的问题。

以上是关于错误:从上游 [uWSGI/Django/NGINX] 读取响应标头时,上游过早关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

AWS Nginx“从上游读取响应标头时上游过早关闭连接”

nginx tomcat7 错误:-“从上游读取响应标头时,recv() 失败(104:对等连接重置)”

错误 28105#0:*1 FastCGI 在标准错误中发送:“主要脚本未知”,同时从上游读取响应标头

Nginx上游过早关闭连接,同时从上游读取响应标头,用于大型请求

*10 上游超时(110:连接超时),同时使用 uwsgi 从上游读取响应头

NGINX - 在标准错误中发送的 FastCGI:“主要脚本未知”,同时从上游读取响应标头