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

时间:2014-02-28 23:25:04

标签: mysql django nginx amazon-ec2 uwsgi

我目前总是在用户正在进行的查询中得到502 ...这通常会返回872行并在MySQL中运行2.07。然而,它返回了大量信息。 (每行包含很多东西)。有什么想法吗?

运行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

5 个答案:

答案 0 :(得分:12)

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

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

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

  

通常返回872行,并在MySQL中运行2.07。然而,它返回了大量信息。

它要么在某个地方超时,要么耗尽内存。

答案 1 :(得分:6)

我有同样的问题,为我修复的是在我的域名中添加我的域名   settings.py 例如:

ag -t

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

nginx日志包含:

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

这是工作的UWSGI配置自动启动ini文件,该文件解决了超时问题,从而解决了502网关问题(上游提前关闭)。

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

希望有帮助。