2014-10-30 13 views
10

Mam projekt Django działający za Nginx i Gunicorn. Jedna z aplikacji współpracuje z urządzeniami sieciowymi za pomocą Exscript, który z kolei korzysta z Paramiko. Niektóre urządzenia nie działają poprawnie, gdy znajdują się za Gunicornem.Czy gunicorn może spowodować problem z exscript/paramiko?

Ten sam dokładny kod zadziała dobrze z poziomu powłoki django-admin. Będzie również działać, jeśli uruchomię wbudowany serwer Django, ale nadal otrzymuję błąd, jeśli pomijam Nginx i łączę się bezpośrednio z Gunicorn.

Próbowałem przenieść funkcję do zadania selera, miał ten sam dokładny problem, ale tylko za Gunicorn.

Napisałem skrypt używając django-extensions, który działa z linii poleceń, ale zawiedzie, jeśli zostanie wywołany przez podproces. Ale tylko za Gunicornem.

Wszystkie urządzenia, które ulegają awarii, wydają się być modułami LTM F5 i wygląda na to, że bufor w obiekcie exscript jest w jakiś sposób modyfikowany. Gdybym miał zgadywać, powiedziałbym, że Gunicorn i Exscript/Paramiko w jakiś sposób nadepną sobie na pamięć innych, a może Gunicorn ustawia pewną zmienną środowiskową, którą odbiera Exscript.

W każdym razie jestem całkowicie zaskoczony i docenię wszelkie wskazówki, jak rozwiązać ten problem.

+0

W jaki sposób zainstalowałeś paramiko? Z pakietem OS? Z pip? Czy używasz virtualenv? Czy jesteś pewien, że gunicorn używa tego samego paramiko co linia poleceń? –

+0

Parimiko został zainstalowany z pipem i tylko w virtualenv, którego używa gunicorn. Dobry pomysł. –

+2

Jeśli nadal masz problem, zwróć uwagę na to, który typ uczestnika (http://gunicorn-docs.readthedocs.org/en/latest/run.html#commonly-used-arguments) używasz w gunicorn? Kiedy mówisz, że się nie powiedzie, możesz wyjaśnić, co dokładnie się dzieje (wyjątek, proces się zawiesza, itp.)? – tutuDajuju

Odpowiedz

1

Całkowite zgadnięcie, ale być może będzie to pomocne w debugowaniu. Zasadniczo, upewnij się, że usunąłeś wszystkie buforowanie wyjściowe, które często ukrywasz to, co naprawdę dzieje się podczas układania wielu dużych frameworków (tak jak tu robisz).

Upewnij się, że wyłączyłeś buforowanie danych wyjściowych w Pythonie, zarówno dla pierwszego serwera sieciowego, jak i dla procesów roboczych (ustawienie PYTHONUNBUFFERED jest łatwym sposobem na zapewnienie, że żaden ze skryptów Pythona nie ma buforowania, przynajmniej w standardowych funkcjach biblioteki).

Terminal może również wprowadzić bufory, które wyjątkowo utrudniają debugowanie. Rozważ przełączenie your command na stdbuf -o0 -e0 your command w celu wyłączenia buforów na standardowym wyjściu i stderr (your command może je ponownie włączyć, ale większość programów tego nie robi).

+0

Przeszukano, ponieważ jest to coś, co wtedy nie brałem pod uwagę, ale w końcu udało nam się rozwiązać problem za pomocą biblioteki f5. –

Powiązane problemy