WSGI vs. dev server

39 views
Skip to first unread message

Jan Walter

unread,
Jun 19, 2017, 1:52:57 AM6/19/17
to djan...@googlegroups.com
Ahoj,
mám problém, se kterým si nevím moc rady. Spočívá v odlišnosti výsledku volání jedné specifické metody přes Apache mod_wsgi vs. vývojový server via manage.py runserver (nebo i interaktivní shell) v konzoli.
  1. Django 1.5.4 (vím, není to soudobé).
  2. Volám metodu transform z premailer knihovny (https://github.com/peterbe/premailer/blob/master/premailer/premailer.py#L279).
  3. Když to zavolám pomocí manage.py (runserver nebo shell), funguje naprosto OK - distribuuje styly do elementů vstupního dokumentu.
  4. Když ji volám přes Apache, vrací prázdný řetězec, žádná chyba. Stejný vstup, stejný virtual env.
Máte nějakou ideu, co na to může mít vliv, co by mohlo být jinak, resp. co/jak debuggovat? Jsem už trochu bez nápadů.

Dík moc za případnou inspiraci,
John

Jirka Vejrazka

unread,
Jun 19, 2017, 2:47:01 AM6/19/17
to Jan Walter
Premai‎ler neznam, ale ve vetsine pripadu byva problem v pravech. Apache obvykle bezi pod jinym OS uzivatelem. Necte ten premailer nejake soubory, ke kterym Apache nema pristup?

 Jirka
--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK-vJUknM%3D4PDrJFD%3Dt-xbe38nL%2B8P-W1xmCYJpN17WqKR-1Vg%40mail.gmail.com.
Další možnosti najdete na https://groups.google.com/d/optout.

Vláďa Macek

unread,
Jun 19, 2017, 2:57:31 AM6/19/17
to djan...@googlegroups.com
Ahoj,

to jsou nepříjemný problémy. Mimochodem, jakmile to půjde, opravdu upgraduj
Django.

Neznám premailer, ale vypadá to, že nemá nic společného s běhovým
prostředím/middlewary, takže by nemělo na způsobu spuštění záležet.

Odhaduju, že bude mít jiné vstupy. V obou případech si "vytiskni" vše, co
leze do konstruktoru třídy Premailer a do té metody a porovnej, budou tam
rozdíly.

Nezapomeň na objekty v globálních identifikátorech, které mohou taky změnit
chování. Django settings je taky globální. Filesystém je globální. Ovlivněn
může být i kód volaný z modulu premailer.py (nebo jím děděný, nebo i z něj
děděný) a tedy to hned nevidíš.

Vytiskni si i výstupy těsně před oběma returny. Je možné, že jsi se
přehlédl a problém bude někde jinde. Mozek je mrška a někdy sám sebe
přesvědčí o nesmyslu.
(http://s2.quickmeme.com/img/fe/fe6a68c7673a3ae9b8856a27ab2ddbe578daedd9755be7cda3182ed8252d3743.jpg)

V.


On 19.6.2017 07:52, Jan Walter wrote:
> Ahoj,
> mám problém, se kterým si nevím moc rady. Spočívá v odlišnosti výsledku
> volání jedné specifické metody přes Apache mod_wsgi vs. vývojový server
> via manage.py runserver (nebo i interaktivní shell) v konzoli.
>
> 1. Django 1.5.4 (vím, není to soudobé).
> 2. Volám metodu transform z premailer knihovny
> (https://github.com/peterbe/premailer/blob/master/premailer/premailer.py#L279).
> 3. Když to zavolám pomocí manage.py (runserver nebo shell), funguje
> naprosto OK - distribuuje styly do elementů vstupního dokumentu.
> 4. Když ji volám přes Apache, vrací prázdný řetězec, žádná chyba. Stejný

Jan Walter

unread,
Jun 19, 2017, 5:02:22 AM6/19/17
to djan...@googlegroups.com
Díky moc za nápady.

Metodu volám s jednoduchým modelovým vstupem totožným v obou případech.
Vypsal jsem si v místě volání locals() a globals() (ne do hloubky). Jediný, co vidím jako odlišnost je cesta k importovaným balíčkům
/home/ct/www/env/local/lib/python2.7/site-packages/django/db/models/__init__.pyc (apache) vs.
/home/ct/www/env/lib/python2.7/site-packages/django/db/models/__init__.pyc (manage.py)
nicméně local je jen link
lrwxrwxrwx 1 ct ct 20 Jun 18 20:52 /home/ct/www/env/local/lib -> /home/ct/www/env/lib

Apache běží pod jiným uživatelem (WSGIDaemonProcess má ale nastaven atribut user), je to asi dobrá hypotéza; i když jsem ale dal celýmu obsahu virtualenvu rwx, je to beze změny. Možná nějaký pracovní soubory, adresáře, rychle jsem prohlídl, jestli to něco čte (bez úspěchu), ještě to budu muset prozkoumat víc. Divný je, že to nepíše žádnou chybu, suverénně to vrátí ''. Je to v principu věc, která z jednoho řetězce udělá jiný bez dalších externalit.

Dost možná přehlížím něco úplně triviálního, až to najdu, dám vědět.

Ještě jednou díky.


--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/1e0c244c-708e-3ca0-2c86-df0732efd594%40sandbox.cz.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

Petr Messner

unread,
Jun 19, 2017, 6:20:39 AM6/19/17
to djan...@googlegroups.com
Přinejhorším můžeš kód toho balíku upravit (editovat přímo soubor v envu) a dát si tam nějaké debug logování.

A když si to spustíš přes gunicorn místo mod_wsgi, tak to funguje? Kdoví, oproti jakému python interpretreu je ten mod_wsgi zkompilovaný.

PM

Dne 19. června 2017 11:02 Jan Walter <jnw...@gmail.com> napsal(a):
Díky moc za nápady.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.

Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/1e0c244c-708e-3ca0-2c86-df0732efd594%40sandbox.cz.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK-vJU%3DRi0b4--HQX1%3DXxvAKjMDQS9BZDcHjFFxgCqn-t0W9YQ%40mail.gmail.com.

Jan Walter

unread,
Jun 19, 2017, 8:25:51 PM6/19/17
to djan...@googlegroups.com
Protože se mi nepovedlo rychle rozběhnout gunicorn (nedával jsem teď pár let pozor, to je standard i pro produkci?), debuggoval jsem nainstalovaný balíček, našel podezřelou závislost libxml2, nainstaloval její systémový balík a následně udělal nový env a pip install, kde se leccos souvisejícího buildovalo. Moje chápání podstaty a zejm. odlišnosti mezi manage.py a wsgi je dost na vodě, ale třeba to přes noc docvakne. Kdybyste mi to někdo uměl jednoduše vysvětlit, budu nadšen stejně, jako že to už funguje :).

Každopádně dík moc za pomoc,
John

Díky moc za nápady.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.

Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/1e0c244c-708e-3ca0-2c86-df0732efd594%40sandbox.cz.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK9Q5BQRe7MaiVuYRC7N-b_w0PA8Dghdbq8zpsKymiPURJiTgw%40mail.gmail.com.

Petr Messner

unread,
Jun 22, 2017, 9:21:59 PM6/22/17
to djan...@googlegroups.com
Dne 20. června 2017 2:25 Jan Walter <jnw...@gmail.com> napsal(a):

Protože se mi nepovedlo rychle rozběhnout gunicorn (nedával jsem teď pár let pozor, to je standard i pro produkci?), debuggoval jsem nainstalovaný balíček, našel podezřelou závislost libxml2, nainstaloval její systémový balík a následně udělal nový env a pip install, kde se leccos souvisejícího buildovalo. Moje chápání podstaty a zejm. odlišnosti mezi manage.py a wsgi je dost na vodě, ale třeba to přes noc docvakne. Kdybyste mi to někdo uměl jednoduše vysvětlit, budu nadšen stejně, jako že to už funguje :).


Tak gratuluji :)

"odlišnosti mezi manage.py a wsgi" - tím "wsgi" asi myslíš mod_wsgi. Protože mod_wsgi a WSGI jsou různé věci :) 

Co dělá manage runserver: spustí django.core.servers.basehttp.WSGIServer , který je odvozený od wsgiref import simple_server ze standardní knihovny Pythonu, a jako handler to tomu dá Django WSGI handler, který umí odpovídat na requesty. Toto vše běží v kontextu toho příkazu manage.py, takže pod venvem, pod kterým to spouštíte.

Co dělá gunicorn: gunicorn je web server naimplementovaný v Pythonu, můžete si ho nainstalovat do venvu. Django aplikace se v něm spouští opět přes WSGI handler té Django aplikace. Situace je v podstatě stejná jako při "manage runserver", akorát místo wsgiref.simple_server se použije gunicorn webserver. Ta Django aplikace běží přímo v procesech nebo vláknech spuštěných gunicornem, pokud gunicorn spustíte z venvu, tak i Django aplikace bude používat tenhle venv.

Co dělá mod_wsgi: je to modul do Apache webserveru. Apache je napsaný v C a i moduly do něj jsou v C. Python se z něj spouští pomocí Python C API (Python.h): https://github.com/GrahamDumpleton/mod_wsgi/blob/033bfc7ac5bce9bacb9bbc7594f48d7c5551df3a/src/server/wsgi_interp.c#L2263
Takže např. to, jaká verze Pythonu se spustí, záleží na tom, oproti čemu byl mod_wsgi zkompilovaný a s čím je nalinkovaný (libpython). Teoreticky se může stát, že by mohly kolidovat závislosti (C knihovny) Python modulů a Apache (nebo ostatních *_mod v Apache). 

A jak do toho všeho zapadá venv? venv je jen sada adresářů, která obsahuje Python moduly. Pokud spustíte python "normálně", tj. bez venvu, tak se pro importované moduly použije cesta např. /usr/lib/python3/dist-packages. Když spustíte python ve venvu (např. venv/bin/python), tak se pustí ten Python (binárka), pomocí kterého byl tento venv vytvořen, jen se místo cesty /usr/lib/python3/dist-packages  použije venv/lib/python3.5/site-packages.

Jak je to s venv a mod_wsgi? Tady může nastat rozpor v tom, pomocí které Python binárky byl ten venv vytvořen, a pomocí čeho (libpython) potom ten kód spouští mod_wsgi - jestli tyhle dvě věci (python binárka a libpython knihovna) jsou spolu kompatibilní, nejlépe jestli oboje pochází ze stejného buildu zdrojových souborů Pythonu.

U mod_wsgi je ještě několik dalších věcí, které se mohou rozbít (např. Python subinterpretery), a taky best practice je nespouštět Python věci přímo v procesu Apache, ale spustit na to dedikovaný proces, se kterým ten Apache komunikuje - mod_wsgi Daemon mode (což mimochodem mod_python neumí). No a to už pak člověk nemusí mod_wsgi používat vůbec (a řešit tyhle obskurity), ale pustit Python aplikaci nějak "normálně" (ne z nějakého cizího C kódu) a nechat ji z Apache/Nginxu/čehokoliv volat přes HTTP nebo FastCGI protokol. No a Gunicorn je implementace HTTP v Pythonu. Používá se v produkci od roku 2010. 

PM

starenka .

unread,
Jun 23, 2017, 3:12:09 AM6/23/17
to djan...@googlegroups.com
Me by teda taky zajimalo, v cem byl zakopanej pes. Pokud neco potrebovalo libxml2, je to vetsinou lxml nebo neco podobnyho (libxml2-dev a libxslt-dev baliky na debosich). Nechapu, jak to bez tech baliku mohlo fungovat. Protoze v tom virtualenvu to prece musela lehnout pri instalaci ty knihovny, ktera tohle potrebuje, cili by si vedel, ze je neco spatne. Pokud bys to mel blbe nakonfeny a env by to bralo ze systemu, tak by si taky na to zahy prisel, protoze na 99% nemas urcite v globalnich site packages nainstalovany veci, ktery appka potrebuje. 

Ad gunicorn: jo, je to standard. Pak je tady par lidi (ehm ehm), ktery proste jednou zkusili uwsgi a ne gunicorn a nemeli duvod menit ;) 

Letos sme na pyconu meli o uwsgi talk, kdyby te to zajimalo 
-----
'aknerats'[::-1]

Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK9Q5BQYbAPp_Q1LktUB1x4i1meoUpNoL-rR-EQHOGq9sgHCSQ%40mail.gmail.com.

Jan Walter

unread,
Jun 23, 2017, 4:06:37 AM6/23/17
to djan...@googlegroups.com
Petre, dik moc za podrobnej vhled. Trochu lip chapu souvislosti.
Nicmene, jak pise Starenka, presnej duvod odlisnyho chovani (jo, myslel jsem mod_wsgi vs. manage.py ve virtualenvu) jsem zatim nenazrel. V jednom ze svych experimentu jsem z envu smazal tu knihovnu, co jsem volal, a zaclo to padat, ze chybi - cili se urcite pouzivala v obou modelech. Odlisnost musela bejt nekde hloubejc.
Vlastne me nejvic fascinuje, ze nikde (viditelne) nebyla zadna chybova hlaska, proste ta metoda suverenne vracela prazdnej retezec.

Nicmene je to jasny memento, ze je to model hodny opusteni, prejdu na gunicorn (uwsgi?), kde cejtim vetsi jistotu, ze ty volani lezou stejnou cestou.

Dik moc,
John

Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CA%2B7MNVq-oCwaC1d0aXkZMk0b2_oFu-pa0QXj5ym2ZKif6mkxTQ%40mail.gmail.com.

Petr Messner

unread,
Jun 23, 2017, 4:24:51 AM6/23/17
to djan...@googlegroups.com
Dne 23. června 2017 9:12 starenka . <star...@gmail.com> napsal(a):

... Pak je tady par lidi (ehm ehm), ktery proste jednou zkusili uwsgi a ne gunicorn a nemeli duvod menit ;) 

Letos sme na pyconu meli o uwsgi talk, kdyby te to zajimalo 

uwsgi poskytuje RPC framework, in-memory datbázi, publish-subscribe, kromě Pythonu to umí Ruby, Perl, Go a Javascript (takže node.js se vlastně dělalo zbytečně), stará se to o kešování, má to v sobě embeded snmp server... jo a kdybyste chtěli, tak to můžete použít i jako WSGI server pro Python webovku. Znáte ty vtipy o Emacsu, ne? :)

Nezastaví se před ničím :) vymysleli si i vlastní protokol (umí ho nginx), protože fastcgi zřejmě není moc fast.

Upřímně mi ale víc vyhovují (micro?)services postavené nad nějakou messaging infrastrukturou (RabbitMQ, ZeroMQ...) a samotný web pak v node.js. Zajímavější možnosti škálování, může to fungovat asynchronně, přežít výpadky, fungovat distribuovaně v různých serverovnách bez čekání na roundtrip a tak. Omlouvám se za herezi a off-topic :) Pro typické use cases je tohle zbytečné, ale když děláte něco většího (nebo když si myslíte, že děláte něco většího... :) ), tak je možností více.

PM
 

Pavel Francirek

unread,
Jun 28, 2017, 12:50:23 PM6/28/17
to django-cs
Me zaujalo, ze to fusuje do systemd :) Umi treba ovladat beh dalsich daemonu (napr. si to pusti lokalni redis nebo ten "predsunuty" nginx a hlida si jeho beh).

PF
-----
'aknerats'[::-1]

Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.

starenka .

unread,
Jun 28, 2017, 1:02:40 PM6/28/17
to djan...@googlegroups.com
Me prislo, ze to fusuje spis do supervisoru...

-----
'aknerats'[::-1]

Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/a46e6c6a-3e8b-4c0f-b746-1d76d26f613a%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages