Django + WSGI: Проблеми с опресняването?

Разработвам сайт на Django. Правя всичките си промени на живия сървър, просто защото така е по-лесно. Проблемът е, че от време на време изглежда иска да кешира някой от *.py файловете, върху които работя. Понякога, ако натискам опресняване много, той ще превключва напред и назад между по-стара версия на страницата и по-нова версия.

Моята настройка е повече или по-малко като това, което е описано в уроците за Django: http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

Предполагам, че прави това, защото задейства множество екземпляри на WSGI манипулатора и в зависимост от това до кой манипулатор се изпраща http заявката, може да получа различни версии на страницата. Рестартирането на apache изглежда решава проблема, но е досадно.

Наистина не знам много за WSGI или "MiddleWare" или нещо от тези неща за обработка на заявки. Идвам от опит в PHP, където всичко работи :)

Както и да е, какъв е хубавият начин за разрешаване на този проблем? Изпълнението на манипулатора на WSGI е "режим на демон" ще облекчи ли проблема? Ако е така, как да го накарам да работи в режим на демон?


person mpen    schedule 28.10.2009    source източник


Отговори (4)


Можете да разрешите този проблем, като не редактирате кода си на живия сървър. Сериозно, няма извинение за това. Разработвайте локално с помощта на контрол на версиите и, ако трябва, стартирайте сървъра си от проверка на живо, с кука след ангажиране, която проверява най-новата ви версия и рестартира Apache.

person Daniel Roseman    schedule 28.10.2009
comment
да, но понякога производствената среда се държи различно от вградения сървър за разработка, така че няма избор :) - person jujule; 28.10.2009
comment
@jujule: можете да настроите тестов домейн на prod сървъра, така че да можете да тествате това, което разработвате локално. Не мога да измисля никакви извинения, които да оправдаят редактирането на код на prod сървъра. - person shanyu; 28.10.2009
comment
копирането на сървърната среда обаче е толкова много работа! сървърът ми работи с ubuntu/apache2/postgres, а домашният ми компютър използва win7... и дори не съм пробвал да инсталирам другите два. ако приемем, че успях да стартирам това, как бих мигрирал db към производство? - person mpen; 29.10.2009
comment
Да не говорим, че рестартирането на apache причинява няколко ценни секунди престой. - person Harel; 10.10.2013
comment
Много причини хората да кодират на жив сървър. Не си в състояние да му кажеш обратното. Моля, придържайте се към темата. - person Randy Greencorn; 09.11.2014

Изпълнението на процеса в режим на демон няма да помогне. Ето какво се случва:

mod_wsgi ражда множество идентични процеси за обработка на входящи заявки за вашия Django сайт. Всеки от тези процеси е свой собствен интерпретатор на Python и може да обработва входяща уеб заявка. Тези процеси са постоянни (те не се извеждат и премахват за всяка заявка), така че един процес може да обработва хиляди заявки една след друга. mod_wsgi може да обработва множество уеб заявки едновременно, тъй като има множество процеси.

Python интерпретаторът на всеки процес ще зареди вашите модули (вашите персонализирани Python файлове) всеки път, когато се изпълнява „модул за импортиране“. В контекста на django това ще се случи, когато е необходим нов view.py поради уеб заявка. След като модулът бъде зареден, той се намира в паметта и така всички промени, които правите във файла, няма да бъдат отразени в този процес. Тъй като постъпват повече уеб заявки, Python интерпретаторът на процеса просто ще използва версията на модула, която вече е заредена в паметта. Виждате несъответствия между опресняванията, тъй като всяка уеб заявка, която правите, може да се обработва от различни процеси. Някои процеси може да са заредили вашите Python модули по време на по-ранни ревизии на вашия код, докато други може да са ги заредили по-късно (тъй като тези процеси не са получили уеб заявка).

Простото решение: Всеки път, когато промените кода си, рестартирайте процеса на Apache. Повечето пъти това е толкова просто, колкото стартиране като root от обвивката "/etc/init.d/apache2 restart". Вярвам, че обикновеното презареждане също работи, което е по-бързо, "/etc/init.d/apache2 reload"

Решението на демон: Ако използвате mod_wsgi в режим на демон, тогава всичко, което трябва да направите, е да докоснете (unix команда) или да промените вашия wsgi скрипт файл. За да изясним публикацията на scrompt.com, модификациите на вашия изходен код на Python няма да доведат до повторно зареждане на кода от mod_wsgi. Презареждането се извършва само когато файлът на скрипта wsgi е променен.

Последна точка за отбелязване: Говорих само за wsgi като използване на процеси за простота. wsgi всъщност използва пулове от нишки във всеки процес. Не смятам, че тази подробност е подходяща за този отговор, но можете да научите повече, като прочетете за mod_wsgi.

person BrainCore    schedule 05.12.2009
comment
Хубаво обяснение! Благодаря. Това обединяване на нишки изгодно/по-бързо ли е от всичко, което PHP прави тогава? - person mpen; 05.12.2009
comment
Когато използвате многопоточност, трябва да се борите с GIL на Python. По този начин, за код за обработка на заявки с интензивни изчисления, можете да страдате малко от невъзможността да използвате няколко CPU/ядра в един процес. Ако кодът има достъп до бази данни и други модули, които освобождават GIL, това не е толкова голям проблем. Както и да е, много по-сложно от това. Препоръчваме ви да прочетете „blog.dscpl.com. au/2007/09/“. - person Graham Dumpleton; 07.12.2009
comment
Между другото, режимът на демон може да помогне, тъй като ви позволява да стартирате монитора на кода, както е описано в документацията на mod_wsgi, посочена в друг отговор. По този начин всяка промяна на кода на Python, а не само на WSGI скриптовия файл, може автоматично да задейства рестартиране на групата процеси на демон. - person Graham Dumpleton; 07.12.2009

Тъй като използвате mod_wsgi във вграден режим, вашите промени не се виждат автоматично. Виждате ги от време на време, защото Apache стартира понякога нови манипулатори, които улавят актуализациите.

Можете да разрешите това, като използвате режим на демон, както е описано тук. По-конкретно, ще искате да добавите следните директиви към вашата конфигурация на Apache:

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
person Edward Dale    schedule 28.10.2009
comment
Предполагам, че можете просто да поставите декларациите в същия контекст като WSGIScriptAlias. - person Edward Dale; 29.10.2009
comment
Изглежда, че няма никакъв ефект, btw. - person mpen; 02.11.2009
comment
Ти просто ми спаси деня! :) - person Nico Coallier; 16.08.2018

Прочетете документацията на mod_wsgi, вместо да разчитате на минималната информация за хостинг на mod_wsgi, съдържаща се на сайта на Django. По-специално, прочетете:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

Това ви казва как точно работи презареждането на изходния код в mod_wsgi, включително монитор, който можете да използвате, за да приложите същия вид презареждане на изходния код, който прави Django runserver. Вижте също кои говори за това как да приложите това към Django.

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html

person Graham Dumpleton    schedule 28.10.2009