2014-02-28 8 views
20

Ich bekomme derzeit immer eine 502 auf eine Abfrage, die meine Benutzer tun ... die in der Regel 872 Zeilen zurückgibt und 2,07 zum Einlaufen MySQL. Es gibt jedoch eine Menge Informationen zurück. (Jede Zeile enthält eine Menge Zeug). Irgendwelche Ideen?Fehler: Upstream vorzeitig geschlossen Verbindung beim Lesen Antwort Header aus dem Upstream [UWSGI/Django/NGINX]

Ausführen des Django (Taskypie Rest API), Nginx- und uWSGI-Stacks.

Server Config mit 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 Config

# 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 
+1

offensichtliche Antwort würde die Daten oder das Timeout erhöhen aufgeteilt werden. Funktioniert das nicht? – jwalker

+0

Wo kann ich diese Zeitüberschreitung erhöhen? Das Erhöhen der Harakiri hilft nicht ... Ich werde die Daten in naher Zukunft teilen müssen ... aber ich habe gerade keine Zeit ... – abisson

+0

Ich nehme an, 2,07 Sekunden sind? Alles in den Protokollen? Führen Sie den uWSGI-HTTP-Server direkt aus, um zu sehen, ob uWSGI oder nginx ersticken? – jwalker

Antwort

9

Dies ist unwahrscheinlich, ein nginx Konfigurationsproblem.

Es ist fast sicher, dass das Back-End tatsächlich abstürzt (oder nur die Verbindung beendet), anstatt eine fehlerhafte Antwort zu geben. Die Fehlermeldung sagt Ihnen, was das Problem ist, aber Sie suchen an der falschen Stelle, um das Problem zu lösen.

Sie geben nicht genügend Informationen verwenden, um herauszufinden, was das genaue Problem ist, zu erlauben, aber wenn ich raten müsste:

which usually returns 872 rows and takes 2.07 to run in MySQL. It is however returning a LOT of information.

Es ist entweder Timing irgendwo oder aus dem Speicher ausgeführt wird.

+0

872 Zeilen ist nichts für den Moment ... es könnte in naher Zukunft auf 10.000 wachsen. Aber der Benutzer wird schließlich diese 10.000 Zeilen auf die eine oder andere Weise in sein iPad bekommen müssen. Sollte ich anfangen, die Daten in Stapeln zu senden? – abisson

+4

Nein, Sie sollten herausfinden, wodurch das Backend die Anfrage beendet. – Danack

1

In Ihrem @ django-Standortblock können Sie versuchen, einige Proxy-Lese- und Verbindungszeitüberschreitungseigenschaften hinzuzufügen. z.B.

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

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

Ich hatte das gleiche Problem, was für mich gerichtet ist meine Domain im settings.py zB Zugabe:

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

Nach dem gleichen Problem, ich meine, ich kann nicht einmal lade die Seite, nginx würde eine 502 zurückliefern, ohne irgendwelche Seiten zu liefern, wo ich die Anwendung zum Absturz bringen könnte.

Und das nginx Protokoll enthalten:

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