2013-03-17 10 views
10

Ho un'applicazione Django in esecuzione in Gunicorn dietro Nginx. Tutto funziona bene, per una cosa strana: ho una vista "download" e una API JSON RESTful. Quando chiami la vista download, uso urllib2 per accedere all'API json per ottenere informazioni. Ed esattamente quando provo a fare questa http ottenere la richiesta a json api, la richiesta scade con un errore Errore HTTP 504: Timeout gateway.Timeout operaio Gunicorn

Quando eseguo il codice con ./manage.py runserver, tutto funziona correttamente. La richiesta di http per la json api richiede anche solo pochi millisecondi, quindi non c'è pericolo di incorrere in un timeout.

qui la situazione in pseudo codice:

myproject/views.py: (accessibili come: http://myproject.com/download)

1 def download(request, *args, **kwargs): 
2  import urllib2 
3  opener = urllib2.build_opener() 
4  opener.open('http://myproject.com/api/get_project_stats') 

Il opener.open() chiamata nella linea di quattro piste in un timeout durante l'esecuzione in Gunicorn , quando si esegue con ./manage.py runserver everytihng funziona bene (e la chiamata api richiede solo pochi millisecondi.

Qualcuno ha avuto lo stesso problema? importante: come l'hai risolto?

+0

Hai provato a giocare con le impostazioni di timeout [Gunicorn] (http: // docs.gunicorn.org/en/latest/configure.html#timeout) –

risposta

13

Ho avuto lo stesso problema con Gunicorn, Nginx, Django e Requests

ogni volta che ho fatto:

response = requests.get('http://my.url.com/here') 

i lavoratori avrebbero timeout

ho risolto il problema passando da Sincrono (sync) lavoratori a lavoratori asincroni (eventlet).

se si sta avviando a riga di comando add:

-k 'eventlet' 

se si utilizza un file di configurazione aggiuntivo:

worker_class = "eventlet" 
+0

Grazie per la risposta! Questo è! (Ma non l'ho risolto con gli operatori di eventi asincroni, l'ho risolto facendo la richiesta HTTP in un'attività asincrona usando il sedano.) – Anton

+0

Questo ha funzionato per me quando avevo un problema simile. –

+1

Devi installare eventlet pure. Ho usato 'pip install eventlet' e poi aggiunto' --worker-class eventlet' alla riga di comando. – Gesias