2014-10-30 16 views
10

Ho un progetto Django che corre dietro Nginx e Gunicorn. Una delle applicazioni interagisce con i dispositivi di rete usando Exscript, che a sua volta utilizza Paramiko. Alcuni dispositivi non funzionano correttamente quando sono dietro a Gunicorn.Potrebbe causare un problema a gunicorn con exScript/paramiko?

Lo stesso codice esatto funzionerà bene all'interno della shell di django-admin. Funzionerà anche se lancio il server django integrato, ma ottengo comunque l'errore se ignoro nginx e mi collego direttamente a Gunicorn.

Ho provato a spostare la funzionalità in un compito di sedici, aveva lo stesso problema esatto, ma solo dietro Gunicorn.

Ho scritto uno script usando django-extensions che funziona dalla riga di comando, ma fallirà se chiamato tramite sottoprocesso. Ma solo dietro Gunicorn.

I dispositivi che stanno fallendo sembrano essere F5 LTM e sembra che il buffer sull'oggetto exscript sia in qualche modo modificato. Se dovessi indovinare, direi che Gunicorn, e ExScript/Paramiko sono in qualche modo calpestati l'un l'altro nella memoria, o forse Gunicorn sta impostando alcune variabili d'ambiente che Exscript sta rilevando.

In ogni caso, sono completamente sconcertato e apprezzerei qualsiasi guida su come risolvere questo problema.

+0

Come hai installato paramiko? Con un pacchetto del sistema operativo? Con pip? Usi virtualenv? Sei sicuro che Gunicorn usi lo stesso paramiko della tua linea di comando? –

+0

Parimiko è stato installato con pip, e solo nella virtualenv che gunicorn sta usando. Buona idea però. –

+2

Se si ha ancora il problema, si prega di commentare quale [tipo di corridore] (http://gunicorn-docs.readthedocs.org/en/latest/run.html#commonly-used-arguments) stai usando in gunicorn? Quando dici che fallisce, puoi elaborare ciò che accade esattamente (un'eccezione, il processo si blocca, ecc.)? – tutuDajuju

risposta

1

Indovina totale, ma forse ciò sarà utile nel debug. Fondamentalmente, assicurati di aver rimosso tutto il buffer di output, che spesso può nascondere ciò che sta realmente accadendo quando si sovrappongono più framework di grandi dimensioni (come si fa qui).

Assicurarsi di disattivare tutti i buffer di uscita in Python, sia per il vostro processo webserver primo piano e per eventuali processi di lavoro (impostazione PYTHONUNBUFFERED è un modo semplice per garantire che nessuno dei vostri script Python hanno il buffering, almeno sulle funzioni della libreria standard).

Il terminale può anche introdurre buffer che rendono eccezionalmente difficile il debug. Considerare la commutazione da your command a stdbuf -o0 -e0 your command per disabilitare i buffer su stdout e stderr (your command potrebbe ancora riattivarli, ma la maggior parte dei programmi non lo fa).

+0

In aumento perché è qualcosa che non ho considerato in passato, ma alla fine abbiamo risolto il problema utilizzando la libreria f5. –