<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Superблог компании LOCUM &#187; хостинг</title>
	<atom:link href="http://locum.ru/blog/tag/xosting/feed" rel="self" type="application/rss+xml" />
	<link>http://locum.ru/blog</link>
	<description></description>
	<lastBuildDate>Thu, 26 Mar 2015 11:44:11 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Грейлистинг как средство борьбы со спамом</title>
		<link>http://locum.ru/blog/news/grejlisting-kak-sredstvo-borby-so-spamom</link>
		<comments>http://locum.ru/blog/news/grejlisting-kak-sredstvo-borby-so-spamom#comments</comments>
		<pubDate>Mon, 07 Dec 2009 10:42:08 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[greylisting]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=113</guid>
		<description><![CDATA[Не так давно у нас появилась новая услуга в управлении почтовых записей, теперь для каждого отдельно взятого почтового аккаунта можно включить грейлистинг. Что же это такое, как работает и зачем нужно? Грейлистинг, от английского grey list или «серый список» &#8212; метод автоматической защиты от спама, который на данный момент является почти самым эффективным при минимальным [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Не так давно у нас появилась новая услуга в управлении почтовых записей, теперь для каждого отдельно взятого почтового аккаунта можно включить грейлистинг. Что же это такое, как работает и зачем нужно?<br />
Грейлистинг, от английского grey list или «серый список» &#8212; метод автоматической защиты от спама, который на данный момент является почти самым эффективным при минимальным требованиям к вычислительным ресурсам и тонкой настройки со стороны пользователя.</p>
<p>Как это работает? Дело в том, что спам рассылается специальным программным обеспечением, которое ведет себя так же как обычный почтовый сервер, но с некоторыми особенностями. Оно перебирает почтовые сервера и пытается отправить нежелательную корреспонденцию на известные ему адреса. Если почтовый сервер, к которому обращается программа рассылки, сообщает о временной ошибке, то она просто пропускает его и продолжает рассылку дальше. Объемы рассылаемой спамерами почты огромны, а ошибки в доставке таких писем возникают постоянно, поэтому этими ошибками обычно пренебрегают. Нормальный же почтовый сервер всегда пытается повторно доставить письмо, если он получил сообщение о временной ошибке. Суть грейлистинга заключается в том, что при первой попытке отправить почту на определенный адрес сервер сообщает о временной проблеме и заносит данные о сервере отправителе и письме в свою базу данных. Если сервер повторил попытку отправить через некоторое время, то его письмо уже будет принято, а адрес сервера попадет на определенный период в белый список. Почта с серверов из белого списка принимается без задержки. В отличие от честного SMTP сервера, программа, рассылающая спам, обычно не будет предпринимать попыток повторной отправки письма, если при первой попытке возникла ошибка. Таким образом адреса, с которых идет рассылка спама не будут попадать в белый список и эта нежелательная корреспонденция не будет доставлена ее предположительному адресату. Практика показывает, что грейлистинг является на данный момент очень эффективным средством борьбы со спамом и позволяет решить эту проблему почти на сто процентов.<br />
Ну а теперь ложка дегтя. Основным недостатком такого подхода являются задержки в доставке почты, причем задержки эти по сути никак не регулируются на стороне принимающего сервера, где используется грейлистинг. Дело в том, что отправляющий сервер будет предпринимать повторную попытку отправки после определенного таймаута, который определяется его настройками. Например, в случае нашей почты, для попадания в белый список достаточно повторить попытку через 10 минут, но сервер может сделать это и через час. Конечно, после попадания в белый список, задержка пропадает, но при доставке первых писем она всегда будет проявляться. К сожалению с нашей стороны мы не можем повлиять на величину этой задержки, как уже было сказано выше, она полностью зависит от администрации других серверов электронной почты.<br />
Удобно это или нет — решать вам, в любом случае вы можете включить грейлистинг отдельно для любого из ваших адресов электронной почты, расположенных на наших серверах. Стоит так же заметить, что если код вашего проекта будет отправлять почту на ваши адреса, например, какие-нибудь уведомления о регистрации посетителей или иных событиях, то эти сообщения будут доходить без задержки, так как грейлистинг касается только той почты, что приходит от внешних серверов.<br />
По умолчанию грейлистинг выключен, включить его вы можете в подробных настройках учетной записи в разделе «ПОЧТА» вашей панели управления.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/grejlisting-kak-sredstvo-borby-so-spamom/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проект-ориентированный хостинг</title>
		<link>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting</link>
		<comments>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting#comments</comments>
		<pubDate>Thu, 01 Oct 2009 07:28:04 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[web-проекты]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[компания]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=97</guid>
		<description><![CDATA[Web-приложения набирают все большую популярность, развиваются средства разработки таких приложений, появляются новые языки программирования и фреймворки. Понятие «сайт» практически стало синонимом «проект», когда от браузера требуется гораздо больше, чем просто показать страничку-другую текста. Хостинговые технологии не должны отставать от технологий создания web-проектов. Необходимо обеспечивать работоспособность широкого спектра фреймворков, написанных на очень разных языках: от традиционного [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.locum.ru/news/proekt-orienti…shared-hosting"><img class="alignleft size-full wp-image-99" title="Проект-ориентированный хостинг" src="http://blog.locum.ru/wp-content/uploads/2009/10/Fotolia_7682116_S.png" alt="Проект-ориентированный хостинг" width="600" height="355" /></a></p>
<p>Web-приложения набирают все большую популярность, развиваются средства разработки таких приложений, появляются новые языки программирования и фреймворки. Понятие «сайт» практически стало синонимом «проект», когда от браузера требуется гораздо больше, чем просто показать страничку-другую текста.<br />
<span id="more-97"></span></p>
<p>Хостинговые технологии не должны отставать от технологий создания web-проектов. Необходимо обеспечивать работоспособность широкого спектра фреймворков, написанных на очень разных языках: от традиционного PHP до нетривиального <a href="http://ru.wikipedia.org/wiki/Lisp" target="_blank">Lisp</a>.</p>
<p>Именно этими принципами мы руководствовались, когда проектировали наш хостинг: разнородная среда, скорость и масштабируемость — именно такими были основные критерии. В результате каждый пользователь нашей системы имеет возможность создавать «проекты» — это специально подобранные наборы системных и внешних ресурсов. Именно проект является основой системы. Далее пользователь получает контроль над основными ресурсами, которые предоставлены ему в рамках проекта, а также может изменять набор этих ресурсов, например, добавить в проект еще одну базу данных.</p>
<p>Виртуальный хостинг предполагает работу множества пользователей на одном физическом сервере. В такой среде необходимо строго следить за соблюдением прав доступа к объектам. Все проекты на нашем хостинге выполняются только от имени пользователя, который создал этот проект.</p>
<p>Основное преимущество проектно-ориентированного подхода — это возможность одному пользователю создавать проекты разных типов без необходимости повторной регистрации или переключения на другой сервер. К одному аккаунту можно привязать как традиционный PHP-проект, так и <a href="http://www.djangoproject.com/" target="_blank">Django</a>-приложение, которое будет работать также прозрачно для пользователя. В будущем мы планируем значительно расширить список доступных типов проектов, наша архитектура позволяет сделать это без особого труда.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/proekt-orientirovannyj-shared-hosting/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Невидимая архитектура</title>
		<link>http://locum.ru/blog/hosting/invisible_architecture</link>
		<comments>http://locum.ru/blog/hosting/invisible_architecture#comments</comments>
		<pubDate>Mon, 17 Aug 2009 13:04:04 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[веб-интерфейс]]></category>
		<category><![CDATA[компания]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=80</guid>
		<description><![CDATA[Пользуясь услугами хостинга, клиенты видят только веб-интерфейс панели управления и окно ftp-клиента. А ведь многим наверняка интересно узнать о том, каким же образом работает вся система? Вот вкратце принципы работы архитектуры, которую мы выбрали для предоставления общего интерфейса управления ресурсами хостинг-серверов. Естественно, веб-интерфейс &#8212; это далеко не основной компонент системы. Он лишь принимает запрос пользователя, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;"><a href="http://blog.locum.ru/hosting/invisible_architecture"><img class="alignleft size-full wp-image-92" title="Superблог LOCUM: Невидимая архитектура" src="http://blog.locum.ru/wp-content/uploads/2009/08/arch.png" alt="Superблог LOCUM: Невидимая архитектура" width="600" height="300" /></a></p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { color: #000080; so-language: zxx; text-decoration: underline } 		A:visited { color: #800000; so-language: zxx; text-decoration: underline } --></p>
<p style="margin-bottom: 0cm;">Пользуясь услугами хостинга, клиенты видят только веб-интерфейс панели управления и окно ftp-клиента. А ведь многим наверняка интересно узнать о том, каким же образом работает вся система? Вот вкратце принципы работы архитектуры, которую мы выбрали для предоставления общего интерфейса управления  ресурсами хостинг-серверов.</p>
<p><span id="more-80"></span></p>
<p style="margin-bottom: 0cm;">Естественно, веб-интерфейс &#8212; это далеко не основной компонент системы. Он лишь принимает запрос пользователя, конвертирует его в удобный для системы формат и кладет в особую очередь задач для выполнения. Стоит заметить, что какое-либо атомарное с точки зрения интерфейса пользователя действие может на самом деле состоять из некоторого количества мелких операций. Например, пользователь, создавая новый сайт, кликает на соответствующую кнопку в своей панели управления. Та определяет, какие действия нужно выполнить: добавить DNS-имя, создать директорию сайта в домашней папке пользователя, скопировать в нее стандартные файлы-заглушки, создать конфигурационный файл веб-сервера и т.д. После того, как задачи отправлены в очередь, работа веб-интерфейса  заканчивается. В дело вступает второе звено нашей системы &#8212; специальный процесс, который следит за очередью задач и их выполнением. Он постоянно получает запросы и отчеты от третьего звена — маленьких рабочих серверов, отвечающих за исполнение всех физических действий на той или иной машине. Обработчик очереди, руководствуясь системой приоритетов, а также специализацией конкретного сервера, видит запросы от этих приложений, анализирует текущую очередь задач и выбирает из них первоочередную. После этого задача получает статус «в работе», и обработчик очереди ожидает отчета об ее исполнении. Тут надо отметить, что некоторые задачи (регистрация доменного имени и др.) требуют достаточно много времени, поэтому была выбрана именно такая схема взаимодействия компонентов  системы. Обработчик очереди не ждет мгновенного ответа от исполнителя, но помнит о каждой задаче и в любой момент готов принять отчет о ее исполнении.</p>
<p style="margin-bottom: 0cm;">Если все эти операции прошли без помех, то действия, которые пользователь хотел выполнить, обретают свое физическое воплощение. Если же произошла ошибка, этот факт логируется для дальнейшего разбирательства администратором. В любом случае, обработчик очереди получит отчет об удачном или неудачном исполнении каждой поставленной задачи. Когда задача выполнена, она получает соответствующий статус и покидает активную очередь. Однако все сведения о запрошенных действиях сохраняются, чтобы всегда можно было восстановить картину событий для поиска ошибок, а также сбора статистики. Настройка серверов организована таким образом, что пользователи, выполняя свои команды, никак не могут помешать друг другу. Сервера-исполнители задач выполняют физические действия от имени соответствующей учетной записи в системе. Такой подход позволяет при непредвиденных обстоятельствах максимально обезопасить данные наших клиентов.</p>
<p style="margin-bottom: 0cm;">Помимо постоянно функционирующих трех основных звеньев системы на главном сервере периодически запускаются вспомогательные процессы. Они предназначены для обработки биллинга, данных системы электронных платежей, API-регистра доменов и тому подобных внешних сервисов.</p>
<p style="margin-bottom: 0cm;">Использование такой архитектуры позволяет нам легко расширять инфраструктуру. На обработчике очереди для этого имеется специальная карта серверов, в которой описаны все существующие в инфраструктуре машины, их роли и функции. Для ввода нового сервера достаточно лишь установить на него приложение по исполнению задач и внести его в карту серверов на обработчике очереди.</p>
<p style="margin-bottom: 0cm;">Такой подход нам представляется весьма удобным. Сложности, с которыми приходится сталкиваться при разработке данной системы, с лихвой окупаются в дальнейшем за счет удобства использования и масштабируемости.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/invisible_architecture/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Современный хостинг — на переднем краю разработок</title>
		<link>http://locum.ru/blog/hosting/sovremennyj_hosting</link>
		<comments>http://locum.ru/blog/hosting/sovremennyj_hosting#comments</comments>
		<pubDate>Fri, 31 Jul 2009 07:43:08 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[it]]></category>
		<category><![CDATA[новые технологии]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=36</guid>
		<description><![CDATA[С каждым днем отрасль IT бурно прогрессирует и новые технологии растут как грибы после дождя. С одной стороны, такие темпы радуют, но с другой &#8212; создают достаточно много сложностей. Хостерам (мы же все живые люди!) за динамикой развития технологий уследить также непросто. Отсюда и возникают проблемы при выполнении важнейшей задачи для любой хостинговой компании &#8212; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } 		A:link { color: #000080; so-language: zxx; text-decoration: underline } 		A:visited { color: #800000; so-language: zxx; text-decoration: underline } --><a href="http://blog.locum.ru/hosting/sovremennyj_hosting"><img class="alignleft size-full wp-image-37" title="Современный хостинг — на переднем краю разработок." src="http://blog.locum.ru/wp-content/uploads/2009/07/problems.png" alt="Современный хостинг — на переднем краю разработок." width="600" height="247" /></a></p>
<p>С каждым днем отрасль IT бурно прогрессирует и новые технологии растут как грибы после дождя. С одной стороны, такие темпы радуют, но с другой &#8212; создают достаточно много сложностей. Хостерам (мы же все живые люди!) за динамикой развития технологий уследить также непросто. Отсюда и возникают проблемы при выполнении важнейшей задачи для любой хостинговой компании &#8212; как предоставить клиентам возможность использовать самые передовые IT-достижения, при этом не нарушив работу старых проектов? Ведь, с одной стороны, нельзя отставать от прогресса и конкурентов, а с другой — хочется стабильности и проверенных временем решений.<br />
<span id="more-36"></span></p>
<p>В таких ситуациях часто приходится балансировать на грани, к тому же разработчики языков  программирования, фреймворков и серверов приложений иногда недостаточно заботятся об обратной совместимости своих продуктов.  Это сильно усложняет работу хостеров. Посудите сами: код, написанный под <a href="http://www.php.net/" target="_blank">php 4</a>, вовсе не обязательно будет стабильно работать с пятой версией этого популярного языка, с <a href="http://www.ruby-lang.org/" target="_blank">ruby</a> 1.9 будет работать  <a href="http://rubyonrails.org/" target="_blank">rails</a>, но половина популярных <a href="http://ru.wikipedia.org/wiki/RubyGems" target="_blank">gem</a>-ов — не будет.</p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } --><img class="alignleft size-full wp-image-44" title="Работает — не трогай!" src="http://blog.locum.ru/wp-content/uploads/2009/07/Fotolia_9698814_XS1.png" alt="Работает — не трогай!" width="220" height="214" />Многим IT-специалистам известен золотой принцип: «Работает — не трогай!». Он действительно помогает избежать лишних  проблем, но, к сожалению, не универсален. С таким подходом  легко превратиться в этакого IT-ретрограда, ведь на современном рынке хостинга  можно и сейчас встретить серверы под управлением <a href="http://www.freebsd.org/" target="_blank">FreeBSD</a> 4.11 (вышедшей еще в  2005 году), на которых предоставляется хостинг с php 4 и <a href="http://www.mysql.com/" target="_blank">mysql</a> четвертой  ветки. В такой ситуации и сотрудники хостинговой компании, и их клиенты не могут  использовать множество новых возможностей, появившихся в последующих версиях  операционной системы и прочего программного обеспечения. В итоге хостер имеет стабильность ради стабильности, пожертвовав ради нее как своим  удобством, так и новыми клиентами, которые хотят пользоваться всеми  современными технологиями.<br />
Постоянное обновление до последних версий в день их появления на свет тоже  не будет разумным решением. Ведь помимо очевидных проблем с безопасностью и  стабильностью это может привести к ситуации, когда у половины клиентов перестанут  работать их проекты (просто потому, что разработчики не очень хорошо подумали о  вопросах обратной совместимости, или были сделаны слишком принципиальные  изменения, и добиться совместимости со старым кодом не представлялось  возможным).<br />
Таким образом, хороший хостер вынужден постоянно балансировать на грани между  ретроградством и переднем краем разработок, изучать вопрос совместимости  старого кода с новыми версиями языков и платформ, выделять новые сервера для  запуска новых решений, а потом тестировать все это для выявления проблем с безопасностью  и стабильностью работы.</p>
<p>Прежде чем внедрить какую-либо новую технологию в проект LOCUM, мы тщательно изучаем опыт других  специалистов, чтобы убедиться в готовности данного решения для практического  использования. Затем тестируем его на некотором количестве размещаемых у нас ресурсов, чтобы выявить очевидные проблемы с совместимостью старого  кода. И уже только после этого предлагаем нашим клиентам использовать новинку. Если у кого-то после перехода на нее возникают проблемы, мы всегда  готовы дать советы по запуску проекта под новой версией или предложить вариант  с возможностью сохранения старой версии языка, фреймворка или сопутствующего  программного обеспечения. Конечно, этот путь намного хлопотнее, чем просто не трогать то, что уже работает. Но  топтаться на месте &#8212; занятие бесполезное и скучное. А нам и нашим клиентам нужны широкие перспективы.</p>
<p style="margin-bottom: 0cm;">
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		PRE { font-family: "Courier New", monospace; font-size: 10pt } 		P { margin-bottom: 0.21cm } --></p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/sovremennyj_hosting/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сравнение производительности Django-проектов, размещенных на виртуальном хостинге с FastCGI и WSGI</title>
		<link>http://locum.ru/blog/lab/fastcgi_protiv_wsgi</link>
		<comments>http://locum.ru/blog/lab/fastcgi_protiv_wsgi#comments</comments>
		<pubDate>Thu, 30 Jul 2009 10:55:17 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Лаборатория]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[wsgi]]></category>
		<category><![CDATA[тестирование]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=8</guid>
		<description><![CDATA[Для создания работоспособного виртуального хостинга, который мог бы предоставлять клиентам возможность размещать Django-проекты, мы изучили три основных способа их размещения: с использованием mod_python web-сервера Apache2, FastCGI и mod_wsgi. Родной модуль mod_python был отвергнут сразу, поскольку он не позволяет запускать сценарии от имени выбранного пользователя. Остальные два метода изначально казались равнопривлекательными, хотя про mod_wsgi на профессиональных [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } --><a href="http://blog.locum.ru/hosting/fastcgi_protiv_wsgi"><img class="alignleft size-full wp-image-12" title="FASTCGI против WSCGI" src="http://blog.locum.ru/wp-content/uploads/2009/07/battle1.png" alt="battle" width="600" height="152" /></a></p>
<p>Для создания работоспособного виртуального хостинга, который мог бы предоставлять клиентам возможность размещать <a href="http://www.djangoproject.com/" target="_blank">Django</a>-проекты, <a href="http://locum.ru" target="_self">мы</a> изучили три основных способа их размещения: с использованием mod_python web-сервера <a href="http://httpd.apache.org/" target="_blank">Apache2</a>, FastCGI и mod_wsgi.</p>
<p>Родной модуль <a href="http://www.modpython.org/" target="_blank">mod_python</a> был отвергнут сразу, поскольку он не позволяет запускать сценарии от имени выбранного пользователя. Остальные два метода изначально казались равнопривлекательными, хотя про mod_wsgi на профессиональных форумах отзываются заметно лучше.</p>
<p><span id="more-8"></span></p>
<p><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } 		H2 { margin-bottom: 0.21cm; page-break-after: avoid } 		H2.western { font-family: "Arial", sans-serif; font-size: 14pt; font-style: italic; font-weight: bold } 		H2.cjk { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; font-weight: bold } 		H2.ctl { font-family: "Tahoma"; font-size: 14pt; font-style: italic; font-weight: bold } --></p>
<h2>Установка и настройка:</h2>
<p>Чем привлекает <a href="http://www.fastcgi.com/drupal/" target="_blank">FastCGI</a>? Он прост в настройке, принципы работы с ним хорошо известны и его внедрение не представляет никаких сложностей. Для нормальной работы django-приложения достаточно правильным образом сконфигурировать VirtualHost web-сервера Apache2 и написать простой сценарий запуска для FastCGI:</p>
<pre lang="Apache">  #user defined
  ServerAdmin admin@django-test.locum.ru
  ServerName django-test.locum.ru
  #end
  DocumentRoot "/home/versus/projects/django-test.locum.ru"
  SuexecUserGroup versus customers
  AddType fastcgi-script .fcgi
  Alias /media/ /home/versus/projects/django-test.locum.ru/media/
  ScriptAlias / /home/versus/projects/django-test.locum.ru/django.fcgi/ 

  CustomLog "/var/log/apache2/django-test.locum.ru.custom.log" combined
  ErrorLog "/var/log/apache2/django-test.locum.ru.error.log"</pre>
<p>При этом статические файлы (изображения, звуки и прочие) раздаются непосредственно web-сервером, что значительно повышает скорость работы приложения в целом.</p>
<pre lang="python">#!/usr/bin/python
import os
import sys
from flup.server.fcgi import WSGIServer
from django.core.handlers.wsgi import WSGIHandler 

sys.path.insert(0, '/home/versus/projects/django-test.locum.ru/app/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

WSGIServer(WSGIHandler()).run()</pre>
<p>Основным преимуществом FastCGI является, пожалуй, возможность устанавливать переменные Django прямо в файле конфигурации Apache. Теоретически это дает возможность иметь один на всех сценарий запуска проекта. Кроме того, изменения в любом файле проекта сразу же становятся видны: какое-либо кеширование отсутствует.<br />
Процедура запуска <a href="http://ru.wikipedia.org/wiki/WSGI" target="_blank">WSGI</a> во многом идентична FastCGI: в систему необходимо установить соответствующий пакет с <a href="http://code.google.com/p/modwsgi/" target="_blank">mod_wsgi</a> и так же, как и в предыдущем случае, создать необходимые конфигурационные файлы.</p>
<pre lang="Apache">  #user defined
  ServerAdmin admin@django-test.locum.ru
  ServerName django-test2.locum.ru
  #end 

  DocumentRoot "/home/versus/projects/django-test2.locum.ru"
  Alias /media/ /home/versus/projects/django-test2.locum.ru/media/ 

  WSGIDaemonProcess django-test2 user=versus group=customers threads=2
  WSGIProcessGroup django-test2 

  WSGIScriptAlias / /home/versus/projects/django-test2.locum.ru/django.wsgi 

  CustomLog "/var/log/apache2/django-test.locum.ru.custom.log" combined
  ErrorLog "/var/log/apache2/django-test.locum.ru.error.log"</pre>
<p>Каталог, содержащий статические документы, обрабатывается непосредственно web-сервером.</p>
<pre lang="Python">#!/usr/bin/python
import os
import sys 

sys.path.insert(0, '/home/versus/projects/django-test2.locum.ru/app/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

import django.core.handlers.wsgi 

application = django.core.handlers.wsgi.WSGIHandler()</pre>
<p>В этой ситуации все необходимые переменные необходимо устанавливать уже в файле сценария запуска, поэтому придется создавать отдельные файлы для каждого django-проекта. С одной стороны, это не очень хорошо — появляется дублирование и возможны проблемы с неправильной конфигурацией. С другой стороны, такой подход дает большую гибкость.<br />
WSGI кеширует модули python, поэтому изменения в проекте вступают в силу не сразу, а только либо после перезагрузки web-сервера (что недопустимо в коммерческой эксплуатации), либо при изменении timestamp конфигурационного файла.</p>
<h2 class="western">Тестируем производительность</h2>
<p class="первая-строка-с-отступом">Так какой же способ быстрее? Для ответа на этот вопрос <a title="Django хостинг" href="http://locum.ru">мы</a> взяли стандартное django-приложение, которое отображает всего одну страничку текста и картинку.</p>
<p><a href="http://django-test2.locum.ru/"><img class="alignleft size-full wp-image-31" style="border: 1px solid black;" title="Тестовый Django-проект" src="http://blog.locum.ru/wp-content/uploads/2009/07/project.png" alt="Тестовый Django-проект" width="600" height="389" /></a></p>
<p class="первая-строка-с-отступом">Методика тестирования была крайне проста: требовалось определить, какой способ затратит меньше времени на многократное повторение запросов. Для этого был написан специальный сценарий, который 1000 раз загружал главную страницу проекта.</p>
<pre lang="bash">#!/bin/bash 

for i in `seq 1 1000`; do
	wget -O /dev/null "http://django-test2.locum.ru/" &amp;gt; /dev/null 2&amp;gt; /dev/null
done</pre>
<p>В процессе выполнения при помощи системной утилиты time замерялось время, необходимое для загрузки всех 1000 запросов. Сценарий выполнялся на локальной машине, чтобы избежать возможных накладок сети. И вот какие результаты <a href="http://locum.ru" target="_self">мы</a> получили:<br />
<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } --></p>
<table border="1" cellspacing="0" cellpadding="4" width="100%" bordercolor="#000000">
<col width="85"></col>
<col width="85"></col>
<col width="85"></col>
<tbody>
<tr valign="top">
<td width="33%"></td>
<td width="33%" bgcolor="#e6e6e6">WSGI</td>
<td width="33%" bgcolor="#e6e6e6">FastCGI</td>
</tr>
<tr valign="top">
<td width="33%">Количество запросов</td>
<td width="33%">1000</td>
<td width="33%">1000</td>
</tr>
<tr valign="top">
<td width="33%">Время исполнения</td>
<td width="33%">00:06.648</td>
<td width="33%">02:55.243</td>
</tr>
<tr valign="top">
<td width="33%">Системное время</td>
<td width="33%">00:01.484</td>
<td width="33%">00:01.672</td>
</tr>
</tbody>
</table>
<p class="первая-строка-с-отступом"><img class="alignleft size-full wp-image-23" title="WSGI — Наш выбор!" src="http://blog.locum.ru/wp-content/uploads/2009/07/выбор.png" alt="WSGI — Наш выбор!" width="256" height="128" />Разница получилась больше, чем в 20 раз! После этого эксперимента <a title="Профессиональный хостинг" href="http://locum.ru" target="_self">мы</a> однозначно выбрали mod_wsgi в качестве сервера для django-проектов. Конечно, пришлось учесть особенности такого подхода: в любой момент прямо с панели управления хостингом можно отдать команду на перезапуск сервера (touch для сценария запуска) и восстановить содержимое индивидуального сценария по умолчанию на тот случай, если пользователь случайно что-то неправильно написал.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 325px; width: 1px; height: 1px;"><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } 		H2 { margin-bottom: 0.21cm; page-break-after: avoid } 		H2.western { font-family: "Arial", sans-serif; font-size: 14pt; font-style: italic; font-weight: bold } 		H2.cjk { font-family: "DejaVu Sans"; font-size: 14pt; font-style: italic; font-weight: bold } 		H2.ctl { font-family: "Tahoma"; font-size: 14pt; font-style: italic; font-weight: bold } --></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;VirtualHost 127.0.0.1&gt; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#user defined </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ServerAdmin admin@django-test.locum.ru </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ServerName django-test.locum.ru </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#end </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">DocumentRoot &#171;/home/versus/projects/django-test.locum.ru&#187; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">SuexecUserGroup versus customers </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">AddType fastcgi-script .fcgi </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">Alias /media/ /home/versus/projects/django-test.locum.ru/media/ </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ScriptAlias / /home/versus/projects/django-test.locum.ru/django.fcgi/ </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">CustomLog &#171;/var/log/apache2/django-test.locum.ru.custom.log&#187; combined </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ErrorLog &#171;/var/log/apache2/django-test.locum.ru.error.log&#187; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;/VirtualHost&gt; </span></span></p>
<p class="первая-строка-с-отступом">При этом статические файлы (изображения, звуки и прочие) раздаются непосредственно web-сервером, что значительно повышает скорость работы приложения в целом.</p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#!/usr/bin/python </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">import os </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">import sys </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">from flup.server.fcgi import WSGIServer </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">from django.core.handlers.wsgi import WSGIHandler </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">sys.path.insert(0, &#8216;/home/versus/projects/django-test.locum.ru/app/&#8217;) </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">os.environ[&#8216;DJANGO_SETTINGS_MODULE&#8217;] = &#8216;settings&#8217; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">WSGIServer(WSGIHandler()).run() </span></span></p>
<p class="первая-строка-с-отступом">Основным преимуществом FastCGI является, пожалуй, возможность устанавливать переменные Django прямо в файле конфигурации Apache, что, теоретически, дает возможность иметь один на всех сценарий запуска проекта. Кроме того, изменения в любом файле проекта сразу же становятся видны: какое-либо кеширование отсутствует.</p>
<p class="первая-строка-с-отступом">Процедура запуска WSGI во многом идентична FastCGI: в систему необходимо установить соответствующий пакет с mod_wsgi и также, как и в предыдущем случае создать необходимые конфигурационные файлы.</p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;VirtualHost 127.0.0.1&gt; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#user defined </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ServerAdmin admin@django-test.locum.ru </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ServerName django-test2.locum.ru </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#end </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">DocumentRoot &#171;/home/versus/projects/django-test2.locum.ru&#187; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">Alias /media/ /home/versus/projects/django-test2.locum.ru/media/ </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">WSGIDaemonProcess django-test2 user=versus group=customers threads=2 </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">WSGIProcessGroup django-test2 </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">WSGIScriptAlias / /home/versus/projects/django-test2.locum.ru/django.wsgi </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">CustomLog &#171;/var/log/apache2/django-test.locum.ru.custom.log&#187; combined </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">ErrorLog &#171;/var/log/apache2/django-test.locum.ru.error.log&#187; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">&lt;/VirtualHost&gt; </span></span></p>
<p class="первая-строка-с-отступом">Так же, как и в предыдущем случае, каталог, содержащий статические документы, обрабатывается непосредственно web-сервером.</p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">#!/usr/bin/python </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">import os </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">import sys </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">sys.path.insert(0, &#8216;/home/versus/projects/django-test2.locum.ru/app/&#8217;) </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">os.environ[&#8216;DJANGO_SETTINGS_MODULE&#8217;] = &#8216;settings&#8217; </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">import django.core.handlers.wsgi </span></span></p>
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<p style="border: 1px solid #999999; padding: 0.15cm; background: #e6e6ff none repeat scroll 0% 0%; margin-left: 1cm; margin-right: 1cm; margin-bottom: 0cm; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><span style="font-family: Courier New,monospace;"><span style="font-size: xx-small;">application = django.core.handlers.wsgi.WSGIHandler() </span></span></p>
<p class="первая-строка-с-отступом">В этом случае все необходимые переменные необходимо устанавливать уже в файле сценария запуска, поэтому придется создавать отдельные файлы для каждого django-проекта. С одной стороны это не очень хорошо — появляется дублирование и возможны проблемы с неправильной конфигурацией. С другой стороны, такой подход дает большую гибкость.</p>
<p class="первая-строка-с-отступом">WSGI кеширует модули python, поэтому изменения в проекте вступают в силу не сразу, а только либо после перезагрузке web-сервера (что недопустимо в коммерческой эксплуатации), либо при изменении timestamp конфигурационного файла.</p>
<h2 class="western">Тестируем производительность</h2>
<p class="первая-строка-с-отступом">Так какой же способ быстрее? Для ответа на этот вопрос мы взяли стандартное django-приложение, которое отображает всего одну страничку текста и картинку.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/lab/fastcgi_protiv_wsgi/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
