<?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/testirovanie/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>Сравнение производительности 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>
