<?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</title>
	<atom:link href="http://locum.ru/blog/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/dc-relocate</link>
		<comments>http://locum.ru/blog/news/dc-relocate#comments</comments>
		<pubDate>Thu, 26 Mar 2015 11:43:37 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=393</guid>
		<description><![CDATA[Друзья, сегодня у нас важные и хорошие новости. В ночь с пятницы, третьего на субботу, четвертого апреля наше оборудование на основной площадке в Москве будет перемещено в новый, более современный, дата-центр с более широкими каналами связи и лучшей схемой электропитания. Во многом это вынужденная мера, связанная с грядущим капитальным ремонтом здания, в котором сейчас располагается [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Друзья, сегодня у нас важные и хорошие новости. В ночь с пятницы, третьего на субботу, четвертого апреля наше оборудование на основной площадке в Москве будет перемещено в новый, более современный, дата-центр с более широкими каналами связи и лучшей схемой электропитания. Во многом это вынужденная мера, связанная с грядущим капитальным ремонтом здания, в котором сейчас располагается наше оборудование.</p>
<p>Мы будем вынуждены остановить практически всё оборудование для переезда около <strong>23 часов 3 апреля</strong>. По нашим расчетам переезд не займет больше пяти-шести часов, и к <strong>утру субботы 4 апреля</strong> все ваши проекты будут в строю и работать на новом месте. Никакие IP-адреса не поменяются.</p>
<p>О процессе переезда мы будем сообщать в нашем <a href="https://twitter.com/LocumRu">Twitter-аккаунте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/dc-relocate/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Несколько библиотек ruby для работы с терминалом</title>
		<link>http://locum.ru/blog/lab/terminal-gems</link>
		<comments>http://locum.ru/blog/lab/terminal-gems#comments</comments>
		<pubDate>Thu, 29 Jan 2015 13:55:47 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Лаборатория]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=388</guid>
		<description><![CDATA[С разрешения перепечатываем заметку из блога нашего ведущего технического специалиста. Короткий список ruby gems для работы с терминалом или Rails консолью. На все случаи жизни, если потребуется что-то напечатать или спросить у пользователя. У нас очень активно используются все четыре в различных внутренних консольных инструментах. Highline для проектирования интерактивных интерфейсов. Ввод-вывод на терминал, множественный выбор, цвета, все [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>С разрешения перепечатываем <a href="http://slf.su/index.php/archives/54">заметку</a> из блога нашего ведущего технического специалиста.</p>
<p><img class="aligncenter wp-image-389" src="http://locum.ru/blog/wp-content/uploads/2015/01/1__ruby.png" alt="1__ruby" width="580" height="350" /></p>
<p>Короткий список ruby gems для работы с терминалом или Rails консолью. На все случаи жизни, если потребуется что-то напечатать или спросить у пользователя. У нас очень активно используются все четыре в различных внутренних консольных инструментах.</p>
<ul>
<li><a href="https://github.com/JEG2/highline" target="_blank">Highline</a> для проектирования интерактивных интерфейсов. Ввод-вывод на терминал, множественный выбор, цвета, все дела. Очень сильно облегчает задачу спросить что-нибудь из консоли или дать выбрать.</li>
<li><a href="https://github.com/erikhuda/thor" target="_blank">Thor</a> для проектирования консольных приложений. Самые разные опции с кучей синтаксического сахара для парсинга аргументов командной строки. Сравнивая с далекими девяностыми, понимаешь, насколько стало проще получать желаемое.</li>
<li><a href="https://github.com/fazibear/colorize" target="_blank">Colorize</a> для вывода цветных букв на терминал. Простой gem, который удобно использовать для выделения сервисных сообщений в Rails консоли. Как и положено хорошему инструменту, очень прост в использовании.</li>
<li><a href="https://github.com/tj/terminal-table" target="_blank">Terminal table</a> для рисования ASCII табличек. Достаточно передать массив, а табличку он нарисует сам. Задача, для которой раньше нужно было написать кучу кода, теперь решается в пару строк.</li>
</ul>
<p>И в качестве послесловия: в <em><span class="theme:github lang:ruby decode:true crayon-inline">Gemfile</span></em> есть группа <em><span class="theme:github lang:ruby decode:true crayon-inline  ">:console</span></em>, которая подключается только из консоли.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/lab/terminal-gems/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изменения в настройках проектов Ruby on Rails, Python uWSGI и Rack</title>
		<link>http://locum.ru/blog/hosting/new-pidfile-path</link>
		<comments>http://locum.ru/blog/hosting/new-pidfile-path#comments</comments>
		<pubDate>Thu, 10 Jul 2014 22:14:14 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=378</guid>
		<description><![CDATA[Мы исправили уязвимость в инфраструктуре нашей хостинг-панели, которая могла приводить к невозможности перезапуска проектов на базе Ruby on Rails, Python uWSGI и Rack. К сожалению, в результате устранения уязвимости вам необходимо самостоятельно перегенерировать файлы деплоймента для проектов Ruby on Rails и Rack. Мы не можем изменить эти файлы, так как они являются частью данных проектов и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Мы исправили уязвимость в инфраструктуре нашей хостинг-панели, которая могла приводить к невозможности перезапуска проектов на базе Ruby on Rails, Python uWSGI и Rack. К сожалению, в результате устранения уязвимости вам необходимо самостоятельно перегенерировать файлы деплоймента для проектов <strong>Ruby on Rails</strong> и <strong>Rack</strong>. Мы не можем изменить эти файлы, так как они являются частью данных проектов и в общем случае не генерируются автоматически или загружаются на сервера хостинга из системы контроля версий.</p>
<p>Изменения коснулись пути доступа к PID-файлам проектов. Новое значение пути выглядит так:</p>
<pre>/var/run/unicorn/#{user}/#{application}.#{login}.pid</pre>
<p>То есть, к пути необходимо добавить еще один каталог, название которого совпадает с названием системного пользователя хостинга. Если вы используете автоматически сгенерированный deploy.rb, вам нужно заменить строку</p>
<pre>set :unicorn_pid, "/var/run/unicorn/#{application}.#{login}.pid"</pre>
<p>на строку</p>
<pre>set :unicorn_pid, "/var/run/unicorn/#{user}/#{application}.#{login}.pid"</pre>
<p>Указанные изменения путей не касаются работоспособности уже запущенных проектов, но без внесения этих изменений перезапустить остановленный проект невозможно.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/new-pidfile-path/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разбор технических проблем 27-28 февраля 2013 года.</title>
		<link>http://locum.ru/blog/news/issues-27-28-2013</link>
		<comments>http://locum.ru/blog/news/issues-27-28-2013#comments</comments>
		<pubDate>Fri, 01 Mar 2013 07:02:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=372</guid>
		<description><![CDATA[Позавчера и вчера нам поступило очень большое количество жалоб на нестабильную либо медленную работу проектов. Общее время простоя за два дня составило около двух часов для части проектов, размещенных на всех серверах хостинга. Основную часть проблем составила нестабильная работа серверов баз данных mysql0 и postgresql0, причем, второй пострадал в значительно меньшей степени. Причины же отказов [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Позавчера и вчера нам поступило очень большое количество жалоб на нестабильную либо медленную работу проектов. Общее время простоя за два дня составило около двух часов для части проектов, размещенных на всех серверах хостинга.</p>
<p>Основную часть проблем составила нестабильная работа серверов баз данных mysql0 и postgresql0, причем, второй пострадал в значительно меньшей степени.</p>
<p>Причины же отказов были разными. 27 февраля мы получили сообщение от мониторинга о резком всплеске нагрузки на сервере Neon. Выяснение причин всплеска заняло некоторое время, в течение которого пул подключений к СУБД оказался занят полностью и сервер mysql0 перестал принимать новые подключения.</p>
<p><span id="more-372"></span></p>
<p>Проекты Rails, которые используют базы на этом сервере оказались не в состоянии выполнять запросы и их воркеры ушли в бесконечный цикл попыток переподключения либо получения данных, что вызвало еще больший рост нагрузки на этот раз уже на всех серверах хостинга. Мы знаем об этой особенности работы Rails и временно остановили проблемные проекты, что в целом стабилизировало ситуацию.</p>
<p>Тем временем наши специалисты обнаружили источник проблемы: сразу несколько проектов, на которых запущены популярные форумные движки вроде SMF подверглись атаке ботнета: с большой скоростью в 20-30 потоков в них размещались автоматически спам-записи. Форумы оказались с необязательной регистрацией и без проверки капчи. Они честно записывали любой поступивший POST-запрос в базу, открывая столько подключений, сколько пришло запросов.</p>
<p>Автоматическая система предодвращения флуда не среагировала на эту атаку, т.к. количество запросов в момент времени с одного IP-адреса было сравнительно невелико для принятия решения о блокировке этого адреса.</p>
<p>Мы заблокировали проблемные проекты до выяснения обстоятельств, перезапустили СУБД mysql0 и все проекты, которые его используют. На этом инцидент был исчерпан и сервис продолжил нормальную работу до утра 28 февраля.</p>
<p>28 февраля мы получили сообщение о резком росте нагрузки на сервер mysql0, при этом наблюдалась очень высокая дисковая активность. При этом в таблице активных запросов не было ничего необычного или странного. Дальнейшее разбирательство показало, что проблема кроется в части нашей панели управления: модуль исполнения задач, запущенный на сервере mysql0 начал активно увеличивать потребление памяти и занял ее всю, что и привело к активному использованию дисков для сохранения страниц памяти в swap.</p>
<p>Перезагрузка этого модуля и перезапуск MySQL помогли — ситуация моментально стабилизировалась.</p>
<p>Такое поведение наших компонент происходит впервые и нашим разработчикам пришлось поломать голову, в чем же причина? Выяснилось, что наложились три фактора: ошибка в коде компонента, нетипичное задание в работу от клиента и ошибка в интерпретаторе ruby, которая в других ситуациях не проявляется.</p>
<p>Ошибку в интепретаторе обошли при помощи патча в коде обработчика и добавили дополнительный мониторинг на потребление памяти разными компонентами системы, чтобы иметь возможность держать руку на пульсе.</p>
<p>Мы приносим извинения за доставленные вам неудобства. Мы обеспечиваем высокое качество сервиса и скорость работы ваших проектов. К сожалению, иногда возникают внештатные ситуации, которые требуют глубокого разбора. В таких случаях мы всегда совершенствуем нашу систему раннего оповещения об отказах и систему предотвращения отказов, которые работают на всех наших серверах, чтобы подобное не могло повториться.</p>
<p>Компенсации за неработу проектов будут начислены в течение этой недели всем клиентам, чьи проекты используют СУБД сервера mysql0.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/issues-27-28-2013/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Очередная уязвимость найдена в Ruby on Rails веток 2.3 и 3.0</title>
		<link>http://locum.ru/blog/news/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d0%bd%d0%b0%d0%b9%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b2-ruby-on-rails-%d0%b2%d0%b5%d1%82</link>
		<comments>http://locum.ru/blog/news/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d0%bd%d0%b0%d0%b9%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b2-ruby-on-rails-%d0%b2%d0%b5%d1%82#comments</comments>
		<pubDate>Tue, 29 Jan 2013 18:56:39 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=367</guid>
		<description><![CDATA[Немного времени прошло с публикации критической уязвимости в RoR, связанной с использованием YAML вставок в XML POST запросах. Сегодня опубликована аналогичная уязвимость, на этот раз в JSON POST запросах. К сожалению, это означает, что мы не можем отфильтровать запросы так, чтобы не сломать работу проектов — JSON, в отличие от XML, используется в вебе очень [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Немного времени прошло с публикации критической уязвимости в RoR, связанной с использованием YAML вставок в XML POST запросах. Сегодня опубликована аналогичная уязвимость, на этот раз в JSON POST запросах.</p>
<p>К сожалению, это означает, что мы не можем отфильтровать запросы так, чтобы не сломать работу проектов — JSON, в отличие от XML, используется в вебе очень широко.</p>
<p><strong>Если ваш проект использует RoR версий 2.3.15, 3.0.19 или младше, ваш проект находится под угрозой, и вам незамедлительно необходимо обновиться. </strong>К счастью, обновления уже доступны.</p>
<p>Для обновления Rails ветки 2.3 вам необходимо отредактировать файл <strong>config/environment.rb</strong>, заменив строку:</p>
<blockquote>
<pre><code>RAILS_GEM_VERSION = '2.3.16' unless defined? RAILS_GEM_VERSION</code></pre>
</blockquote>
<p>Для обновления Rails ветки 3.0 пропишите нужную версию Rails в ваш <strong>Gemfile</strong></p>
<blockquote>
<pre><code>gem "rails", "~&gt; 3.0.20"</code></pre>
</blockquote>
<p>Будьте внимательны.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/%d0%be%d1%87%d0%b5%d1%80%d0%b5%d0%b4%d0%bd%d0%b0%d1%8f-%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c-%d0%bd%d0%b0%d0%b9%d0%b4%d0%b5%d0%bd%d0%b0-%d0%b2-ruby-on-rails-%d0%b2%d0%b5%d1%82/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разворачиваем приложение Ruby On Rails на примере Redmine</title>
		<link>http://locum.ru/blog/hosting/locum-ror-redmine</link>
		<comments>http://locum.ru/blog/hosting/locum-ror-redmine#comments</comments>
		<pubDate>Sun, 26 Aug 2012 13:18:01 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=341</guid>
		<description><![CDATA[Rvm, Bundler, Capistrano — все эти инструменты сильно облегчают жизнь разработчику и администратору проекта, но могут изрядно запутать. В этой статье мы наглядно покажем процесс деплоя распространенной системы управления проектами Redmine. Создаем новый Ruby On Rails проект Выбираем тип проекта &#171;Ruby on Rails&#187; Задаем имя будущему проекту Создаем. Панели нужно две-три минуты, чтобы создать всё [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-361" title="image" src="http://locum.ru/blog/wp-content/uploads/2012/08/image.png" alt="" width="600" height="373" /></p>
<p>Rvm, Bundler, Capistrano — все эти инструменты сильно облегчают жизнь разработчику и администратору проекта, но могут изрядно запутать. В этой статье мы наглядно покажем процесс деплоя распространенной системы управления проектами <a href="http://www.redmine.org/" target="_blank">Redmine</a>.</p>
<p><span id="more-341"></span></p>
<h1>Создаем новый Ruby On Rails проект</h1>
<p><img class=" wp-image-352 alignnone" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг.png" alt="" width="600" /></p>
<p><img class=" wp-image-348 alignnone" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-1" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-1.png" alt="" width="600" /></p>
<ol>
<li>Выбираем тип проекта &#171;Ruby on Rails&#187;</li>
<li>Задаем имя будущему проекту</li>
<li>Создаем. Панели нужно две-три минуты, чтобы создать всё необходимое для работы проекта, после чего можно продолжать. Около 15 минут необходимо, чтобы проект начал отзываться по присвоенному ему DNS-имени.</li>
</ol>
<p><img class="alignnone  wp-image-349" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-3" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-3.png" alt="" width="600" /></p>
<p>Обратите внимание на созданную базу данных, она нам еще пригодится.</p>
<h1>Загружаем дистрибутив</h1>
<p>Новые версии Redmine замечательно работают с Ruby 1.9.3, поэтому, настройки проекта по умолчанию нам подойдут. Мы будем ставить последнюю на момент написания статьи стабильную версию Redmine 2.0.3.</p>
<p>Узнаём параметры входа на сервер по ssh</p>
<p><img class="alignnone  wp-image-350" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-4" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-4.png" alt="" width="600" /></p>
<p>Начинаем работать с терминалом. Заходим на сервер</p>
<p><img class="alignnone  wp-image-345" title="1. hosting_redmine5@neon_ ~ (ssh)" src="http://locum.ru/blog/wp-content/uploads/2012/08/1.-hosting_redmine5@neon_-ssh.png" alt="" width="600" /></p>
<p>Переходим с свежесозданный каталог проекта</p>
<blockquote>
<pre>$ cd projects/redmine</pre>
</blockquote>
<p>Удаляем автоматически созданные файлы</p>
<blockquote>
<pre>$ rm -rf ./current/*</pre>
</blockquote>
<p>Загружаем <a href="http://rubyforge.org/frs/?group_id=1850" target="_blank">архив с исходниками</a> Redmine</p>
<blockquote>
<pre>$ wget http://rubyforge.org/frs/download.php/76259/redmine-2.0.3.tar.gz</pre>
</blockquote>
<p>Распаковываем архив</p>
<blockquote>
<pre>$ tar xvf redmine-2.0.3.tar.gz</pre>
</blockquote>
<p>Переписываем симлинк current на распакованный Redmine</p>
<blockquote>
<pre>$ rm current
$ ln -s redmine-2.0.3 current</pre>
</blockquote>
<h1>Подготавливаем окружение</h1>
<p>На этом этапе можно открыть в соседней вкладке <a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall" target="_blank">руководство по установке</a> Redmine и сверяться с ним, если что-то пойдет не так. Также рекомендуем прочитать нашу статью об <a title="Locum — новая сила с RVM" href="http://locum.ru/blog/hosting/rvm-new-force">особенностях работы с rvm</a>.</p>
<p>Переходим в каталог с исходниками</p>
<blockquote>
<pre>$ cd current</pre>
</blockquote>
<p>Подготавливаем бандл. Хотя Gemfile уже идет в поставке Redmine, хостинг Locum использует сервер приложений Unicorn для запуска проектов, поэтому в Gemfile необходимо внести изменения</p>
<blockquote>
<pre>$ echo 'gem "unicorn"' &gt;&gt; Gemfile</pre>
</blockquote>
<p>Теперь можно создать бандл</p>
<blockquote>
<pre>$ rvm use 1.9.3 do bundle install --path=~/projects/redmine/shared/gems --without development test</pre>
</blockquote>
<p>Этот процесс обычно занимает около пяти минут. Теперь нужно поправить конфигурацию базы данных для проекта. Узнаем параметры подключения к БД в панели управления хостингом. Заходим в «Услуги — Проекты», нажимаем «Подробнее» на проекте redmine, далее в графе «Ресурсы» нажимаем на ссылку с базой данных.</p>
<p><img class="alignnone  wp-image-351" title="Locum - hosting house | Профессиональный хостинг, регистрация дщение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-5" src="http://locum.ru/blog/wp-content/uploads/2012/08/Locum-hosting-house-Профессиональный-хостинг-регистрация-дщение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-5.png" alt="" width="600" /></p>
<p>Возвращаемся в терминал. Копируем файл конфигурации БД из поставки Redmine</p>
<blockquote>
<pre>$ cp config/database.yml.example config/database.yml</pre>
</blockquote>
<p>Редактируем файл с настройками, вписываем параметры подключения нашей базы</p>
<p><img class="alignnone  wp-image-346" title="1. hosting_redmine5@neon_ ~_projects_redmine_current (ssh)" src="http://locum.ru/blog/wp-content/uploads/2012/08/1.-hosting_redmine5@neon_-_projects_redmine_current-ssh.png" alt="" width="600" /></p>
<p>Обратите внимание на адаптер базы, для Ruby 1.9 это должен быть mysql2. Вторая частая ошибка — имя хоста. Обязательно внесите хост со страницы с параметрами подключения БД.</p>
<p>Сохраняем изменения: Ctrl+O, Ctrl+X.</p>
<h1>Выполняем настройку проекта</h1>
<p>Следуем инструкции по установке, выполняем таски, необходимые для запуска проекта. Особенность хостинга — все команды нужно оборачивать в rvm и bundle.</p>
<blockquote>
<pre>$ rvm use 1.9.3 do bundle exec rake generate_secret_token
$ RAILS_ENV=production rvm use 1.9.3 do bundle exec rake db:migrate</pre>
</blockquote>
<p>В нашем примере мы загрузим тестовые данные в проект</p>
<blockquote>
<pre>$ RAILS_ENV=production rvm use 1.9.3 do bundle exec rake redmine:load_default_data</pre>
</blockquote>
<p>Правим права доступа к каталогам</p>
<blockquote>
<pre>$ chmod -R 755 files log tmp</pre>
</blockquote>
<h1>Перезапускаем сервер приложений</h1>
<p>Установка практически завершена. Все, что осталось сделать, это перезапустить сервер приложений, обслуживающий наш проект. Из терминала выполняем команды:</p>
<blockquote>
<pre>$ kill -QUIT `cat /var/run/unicorn/hosting_redmine/redmine.redmine5.pid`
$ rvm use 1.9.3 do bundle exec unicorn_rails -Dc /etc/unicorn/redmine.redmine5.rb</pre>
</blockquote>
<p>Проверяем, что сервер приложений запустился и проект работает. В панели управления идем в «Услуги — Проекты», напротив проекта redmine нажимаем на ссылку с его доменом. Авторизуемся учетной записью по умолчанию admin/admin.</p>
<p><img class="alignnone  wp-image-347" title="Administration - Redmine" src="http://locum.ru/blog/wp-content/uploads/2012/08/Administration-Redmine.png" alt="" width="600" /></p>
<p>Можно приступать к настройке непосредственно самого Redmine.</p>
<p>Если что-то пошло не так, полезную информацию можно найти в логах в каталоге проекта ~/projects/current/log</p>
<ul>
<li><strong>production.log</strong> — основной журнал Redmine. Ошибки уровня приложения пишутся сюда.</li>
<li><strong>unicorn.stderr.log</strong> — журнал ошибок запуска Unicorn. Недостающие библиотеки и проблемы запуска сервера приложений запишутся сюда.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/locum-ror-redmine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Внеплановые профилактические работы на сервере hydrogen</title>
		<link>http://locum.ru/blog/news/%d0%b2%d0%bd%d0%b5%d0%bf%d0%bb%d0%b0%d0%bd%d0%be%d0%b2%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b0%d0%ba%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b</link>
		<comments>http://locum.ru/blog/news/%d0%b2%d0%bd%d0%b5%d0%bf%d0%bb%d0%b0%d0%bd%d0%be%d0%b2%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b0%d0%ba%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b#comments</comments>
		<pubDate>Fri, 18 May 2012 06:34:27 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=336</guid>
		<description><![CDATA[Сегодня, 18 мая с 10:40 до 13:30 по московскому времени на сервере hydrogen будут проводиться внеплановые профилактические работы по восстановлению системы после непредвиденного сбоя в работе. Причины сбоя будут установлены и ликвидированы в процессе выполнения работ, об окончании сообщим дополнительно. Во время проведения работ возможно временное прекращение доступа к вашим проектам.]]></description>
				<content:encoded><![CDATA[<p>Сегодня, 18 мая с 10:40 до 13:30 по московскому времени на сервере <strong>hydrogen</strong> будут проводиться <strong>внеплановые</strong> профилактические работы по восстановлению системы после непредвиденного сбоя в работе.</p>
<p>Причины сбоя будут установлены и ликвидированы в процессе выполнения работ, об окончании сообщим дополнительно.</p>
<p>Во время проведения работ возможно временное прекращение доступа к вашим проектам.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/%d0%b2%d0%bd%d0%b5%d0%bf%d0%bb%d0%b0%d0%bd%d0%be%d0%b2%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b0%d0%ba%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Регламентные работы на сервере lithium 25 марта</title>
		<link>http://locum.ru/blog/news/maint-lithium-25-mar</link>
		<comments>http://locum.ru/blog/news/maint-lithium-25-mar#comments</comments>
		<pubDate>Thu, 22 Mar 2012 20:18:37 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=334</guid>
		<description><![CDATA[Уважаемые клиенты. 25 марта 2012 года в 2:00 по московскому времени на сервере lithium будут проводится регламентные работы по обновлению программного обеспечения. Во время проведения работ возможны перебои с доступом к проектам, размещенным на этом сервере. Благодарим за понимание.]]></description>
				<content:encoded><![CDATA[<p>Уважаемые клиенты. 25 марта 2012 года в 2:00 по московскому времени на сервере lithium будут проводится регламентные работы по обновлению программного обеспечения. Во время проведения работ возможны перебои с доступом к проектам, размещенным на этом сервере.</p>
<p>Благодарим за понимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/maint-lithium-25-mar/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мы изменили правила отправки почты</title>
		<link>http://locum.ru/blog/news/new-email-rules</link>
		<comments>http://locum.ru/blog/news/new-email-rules#comments</comments>
		<pubDate>Tue, 06 Mar 2012 20:55:02 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=327</guid>
		<description><![CDATA[В связи с участившимися случаями массовой рассылки нежелательных писем, или, попросту, спама, с наших серверов, с 7 марта мы вводим ограничения на отправку писем как при помощи почтовых служб серверов, так и по протоколу SMTP. запрещена отпрака почты и создание почтовых аккаунтов на тестовом периоде; введено ограничение на 25 получателей одного письма в поле «To»; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-328" style="margin-right: 20px;" title="spam" src="http://locum.ru/blog/wp-content/uploads/2012/03/1559606_340_1116081430036-spam.jpeg" alt="" width="335" height="335" />В связи с участившимися случаями массовой рассылки нежелательных писем, или, попросту, спама, с наших серверов, с 7 марта мы вводим ограничения на отправку писем как при помощи почтовых служб серверов, так и по протоколу SMTP.</p>
<ul>
<li>запрещена отпрака почты и создание почтовых аккаунтов на тестовом периоде;</li>
<li>введено ограничение на 25 получателей одного письма в поле «To»;</li>
<li>установлено ограничение на скорость отпраки писем — пять в минуту.</li>
</ul>
<p>Мы надеемся на понимание, и что эти ограничения никак не затронут вас.</p>
<p>Если вашим проектам необходимо отправлять большее количество писем, оставьте заявку в службе технической поддержки и мы, как всегда, пойдем вам навстречу.</p>
<p>Пожалуйста, помните, что мы оставляем за собой право блокировать аккаунты и VDS, с которых рассылается спам, а также предпринимать другие меры для предотвращения его рассылки.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/new-email-rules/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Locum &#8212; новая сила с RVM</title>
		<link>http://locum.ru/blog/hosting/rvm-new-force</link>
		<comments>http://locum.ru/blog/hosting/rvm-new-force#comments</comments>
		<pubDate>Thu, 17 Nov 2011 13:58:36 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=295</guid>
		<description><![CDATA[Что случилось? Мы долго шли к этому, и все-таки это состоялось. Теперь по умолчанию используется rvm и bundler на всех новых проектах. Старые проекты не будут затронуты до тех пор, пока вы сами не начнете переключать версию ruby в настройках. Подумайте &#8212; стоит ли делать это, если все работает. Зачем? Хотя бы потому что мы [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2><img class="aligncenter size-full wp-image-320" title="rvm" src="http://locum.ru/blog/wp-content/uploads/2011/11/rvm.png" alt="" width="600" height="401" /></h2>
<h2></h2>
<h2>Что случилось?</h2>
<p>Мы долго шли к этому, и все-таки это состоялось. Теперь по умолчанию используется rvm и bundler на всех новых проектах. Старые проекты не будут затронуты до тех пор, пока вы сами не начнете переключать версию ruby в настройках. Подумайте &#8212; стоит ли делать это, если все работает.</p>
<p><span id="more-295"></span></p>
<h2>Зачем?</h2>
<p>Хотя бы потому что мы всегда стараемся предоставлять новые технологии, как только они становятся достаточно стабильны и удобны. К тому же поступило много просьб от наших пользователей о переходе на новую версию. Конечно, полный переход мы навязывать не стали, ведь есть много проектов, которые давно уже работают на 1.8.7, разработка не ведется и всех все устраивает, так зачем же ломать? Поэтому пришлось делать поддержку нескольких версий, ну а за одно и переключение между ними.</p>
<p>Ruby 1.8.7 уже устарел, тем более в новых версиях Ruby On Rails его поддержка со временем прекратится. Сейчас все наши пользователи могут использовать самые последние версии ruby, да и к тому же переключаться между ними. Переведите свой проект на 1.9.3 и наслаждайтесь производительностью. Конечно, перед этим необходимо установить нужные gem для этой версии ruby. Об этом читайте далее.</p>
<h2>Как теперь все работает?</h2>
<p>В качестве сервера приложений все так же используется unicorn &#8212; он довольно хорошо себя проявил за последнее время по сравнению со своими конкурентами. По крайней мере в разделяемой среде, где много проектов, мы пока не видим ему альтернативы.</p>
<p>Теперь для запуска процессов нужно будет указывать какая версия ruby вам нужна. Для этого используется <a href="http://beginrescueend.com/" target="_blank">Ruby Version Manager</a> или сокращенно &#8212; RVM. Наверняка многие из вас уже знакомы с этим средством переключения между различными версиями ruby. Если нет &#8212; обратитесь к официальной документации, она довольно проста и понятна.</p>
<h3>Как же теперь запускается unicorn?</h3>
<p>Для этого нужно выполнить следующую команду:</p>
<pre>rvm use &lt;версия&gt; do bundle exec unicorn_rails -Dc /etc/unicorn/&lt;имя_проекта&gt;.&lt;логин_в_панель_управления&gt;.rb</pre>
<p>Вместо &lt;версия&gt; нужно подставить одно из следующих значений, что и будет определять версию ruby, которая используется на данный момент:</p>
<ul>
<li>1.9.3</li>
<li>1.9.2</li>
<li>ree-1.8.7 (это <a href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition</a>)</li>
<li>1.8.7</li>
</ul>
<h3>Перезагрузка кода</h3>
<p>Тут ничего не поменялось, так как нам нужно всего лишь отправить сигнал USR2 мастер-процессу, это делается и без rvm:</p>
<pre>kill -USR2 `cat /var/run/unicorn/&lt;имя пользователя на сервере&gt;/<span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">&lt;имя_проекта&gt;.&lt;логин_в_панель_управления&gt;.pid`</span></pre>
<p>Как всегда логи находятся в logs/unicorn.*.log, и если вдруг после отправки сигнала ничего не поменялось &#8212; это хороший повод заглянуть в них. Полная остановка unicorn делается аналогично, но сигнал будет QUIT, вместо USR2.</p>
<h2>Почему bundler а не rvm gemsets?</h2>
<p>Этот вопрос может возникнуть у знакомых с работой rvm пользователей. Ответ довольно просто &#8212; gemsets не предназначены для работы в разделяемой среде между несколькими пользователям &#8212; будут проблемы прав доступа. Тем более bundler стал стандартным средством ограничение области видимости gem а так же их установки и обновления, независимо от того используется вообще rvm или нет. Большинство проектов у нас используют bundler уже сейчас, а уж все новые так и тем более должны это делать.</p>
<h3>Куда ставить bundle?</h3>
<p>Мы рекомендуем ставить в ../../shared/gems, сделать это можно указав нужный параметр при выполнении команды (предполагается, что команда выполняется в RAILS_ROOT):</p>
<pre>bundle install --path ../../shared/gems</pre>
<p>Shared &#8212; чтобы не переустанавливать все gem после каждого деплоя, а просто вызывать bundle update.</p>
<h2>Как переключать версии?</h2>
<p>Войдите в раздел <a title="Мои проекты" href="https://locum.ru/projects" target="_blank">&#171;Услуги&#187;-&gt;&#187;Проекты&#187;</a>, далее нажмите на ссылку &#171;подробнее&#187; напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите поле с версией ruby, выберите интересующую вас версию и нажмите кнопку сохранения параметров.</p>
<h3>Что при этом произойдет?</h3>
<p>Важно понимать что действительно происходит при такой смене версии, чтобы избежать ошибок или хотя бы быстро суметь их исправить.</p>
<p>Итак, по умолчанию у нас запущен проект с ruby 1.9.3, если мы сменили версию, то вначале будет удалена директория ../../shared/gems, так как система предполагает, что ваши gem стоят там. Удалять директорию приходится потому, что bundler не может понять иногда, что <strong>native extension</strong> того или иного gem собран был для другой версии ruby и попытается использовать его не пересобирая, что приведет к ошибке и падению unicorn. Конкретно такая проблема наблюдается при смене версии с 1.9.3 до 1.9.2, если не удалить все gem и не поставить снова.</p>
<p>После этого в RAILS_ROOT (projectname/current) будет выполнена команда bundle install &#8212;path ../../shared/gems, а затем &#8212; полная остановка unicorn и запуск его с указанием новой версии ruby для rvm.</p>
<p>Чтобы в процессе этого не возникало никаких ошибок убедитесь что ваш Gemfile валиден и код проекта сможет работать с выбранной вами версией, потому что иногда синтаксис все-таки не полностью совместим. Об отличиях между разными версиями ruby вы всегда сможете прочесть в официальных документах и описаниях каждого из релизов.</p>
<h3>Почему не rvmrc?</h3>
<p>rvmrc &#8212; это всего лишь шелл-скрипт, использование которого рассчитано на определенные настройки пользовательской оболочки. Мы не можем гарантировать что у всех эти настройки соблюдаются, а уж тем более не хотим это навязывать. К тому же в нескольких уровнях rvmrc легко запутаться. Мы никак не ограничиваем вас в использовании rvmrc, но изначально не навязываем его. Вы всегда можете самостоятельно настроить и пользоваться им как вам будет удобно. Подробно о работе rvmrc читайте в <a href="http://beginrescueend.com/workflow/rvmrc/" target="_blank">документации по rvm</a>.</p>
<h3>Что по умолчанию?</h3>
<p>По умолчанию создается &#171;пустой&#187; rails-проект (по сути то, что получаем после rails new) с ruby 1.9.3 и rails 3.1.1</p>
<p>Кстати, не удивляйтесь, что ссылка &#171;About your application’s environment&#187; не работает &#8212; по идеологии Ruby On Rails она должна работать только в development-окружении, а на хостинге все запускается в production.</p>
<h2><strong>Что станет с Capistrano?</strong></h2>
<p>Как всегда мы предполагаем, что для размещения кода на сервере будет использоваться <a href="https://github.com/capistrano/capistrano/wiki/Documentation-v2.x" target="_blank">Capistrano</a>. RVM этому никак не помешает, просто мы теперь генерируем deploy.rb c учетом использования rvm.</p>
<p>Получить deploy.rb для каждого конкретного проекта можно в вашей панели управления услугами <a href="http://locum.ru" target="_blank">Locum.ru</a>. Войдите в раздел <a title="Мои проекты" href="https://locum.ru/projects" target="_blank">&#171;Услуги&#187;-&gt;&#187;Проекты&#187;</a>, далее нажмите на ссылку &#171;подробнее&#187; напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите кнопку для генерации deploy.rb, нажмите ее и получите содержание файла с учетом rvm.</p>
<p>Обычно для того, чтобы начать пользоваться Capistrano достаточно просто добавить в deploy.rb ссылку на вашу систему контроля версий, настроить авторизацию по ключам на наш сервер. а так же с нашего сервера к вашей системе контроля версий (git, svn, mercurial). Если вы нигде еще не разместили свой проект в контроле версий, то можете создать гит репозиторий на нашем сервере, об этом у нас есть <a href="http://locum.ru/blog/hosting/git-on-locum" target="_blank">соответствующая заметка в блоге</a>.</p>
<p>Имейте ввиду, что если вы измените версию ruby для проекта, вам необходимо будет поменять ее и в вашем deploy.rb.</p>
<h2>Что делать с моими старыми проектами?</h2>
<p>Решение остается полностью за вами. Если вы знаете что такое rvm и понимаете зачем вам нужно перейти на новую версию, или даже если понимаете, что это не имеет смысла но хочется (бывает такое, не правда ли?), вы всегда можете это сделать. А так &#8212; просто не трогайте их, с ними ничего не произошло.</p>
<h2>На что еще важно обратить внимание?</h2>
<p>Всегда помните, что все команды ваши теперь следует запускать в rvm и bundle, т.е. вместо</p>
<pre>rails c</pre>
<p>мы используем</p>
<pre>rvm use &lt;версия&gt; do bundle exec rails c</pre>
<p>И только так входим в консоль. Мы всегда рекомендуем вызывать команду явно, а не полагаться на rvmrc, фазу луны или еще что-нибудь. Так меньше вероятность совершить ошибку, потому что довольно легко забыть изменить версию в rvmrc и потом долго думать от чего не работает.</p>
<h2>Заключение</h2>
<p>На этом у нас все. Ждем ваших комментариев и отзывов, спасибо, что выбираете <a href="http://locum.ru">Locum.ru</a>. Мы же и впредь будем стараться радовать вас внедрением новых технологий.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/rvm-new-force/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Создаем Git-репозиторий на Locum.ru</title>
		<link>http://locum.ru/blog/hosting/git-on-locum</link>
		<comments>http://locum.ru/blog/hosting/git-on-locum#comments</comments>
		<pubDate>Mon, 29 Aug 2011 12:12:45 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://locum.ru/blog/?p=230</guid>
		<description><![CDATA[Использование системы контроля версий для управления кодом собственного проекта — прекрасное и рациональное решение, успешно применяемое тысячами команд разработчиков по всему миру. Главный вопрос, возникающий после выбора системы контроля версий: где же хранить репозиторий, в котором будет лежать полная история развития вашего проекта? В случае использования распределённой системы контроля версий Git и виртуального хостинга Locum, этот вопрос [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Использование системы контроля версий для управления кодом собственного проекта — прекрасное и рациональное решение, успешно применяемое тысячами команд разработчиков по всему миру.</p>
<p>Главный вопрос, возникающий после выбора системы контроля версий: где же хранить репозиторий, в котором будет лежать полная история развития вашего проекта?</p>
<p>В случае использования распределённой системы контроля версий <a href="http://git-scm.com/">Git</a> и виртуального хостинга <a href="http://locum.ru/">Locum</a>, этот вопрос можно решить буквально одним движением руки, не прибегая к использованию дорогостоящих тарифных планов GitHub или Assembla.<span id="more-230"></span></p>
<p>Итак, допустим, что у нас есть некоторый проект, репозиторий которого можно сохранить на хостинге Locum, и пусть он находится в каталоге <code>meet.git</code>.</p>
<p>Для начала узнаем название вашего сервера виртуального хостинга. Эту информацию вы можете посмотреть в нашей клиентской панели: вкладка «Услуги» → раздел «FTP и SSH».</p>
<p><a href="http://locum.ru/blog/wp-content/uploads/2011/08/account1.png"><img class="size-full wp-image-283 alignnone" title="account" src="http://locum.ru/blog/wp-content/uploads/2011/08/account1.png" alt="" width="714" height="298" /></a></p>
<p>Зайдём на сервер виртуального хостинга через SSH и подготовим окружение для работы Git.</p>
<pre><code>% ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru</code></pre>
<pre>% mkdir -p ~/git/meet.git</pre>
<pre>% cd ~/git/meet.git</pre>
<pre>% git init --bare</pre>
<p>Команда <code>git init</code> с ключом <code>--bare</code> создаст репозиторий в текущем каталоге, обеспечивая хранение исключительно служебной информации и блоков данных. При этом напрямую работать с сохранёнными файлами и каталогами будет невозможно: все данные проекта хранятся во внутреннем представлении Git.</p>
<p>Работа с репозиторием будет проводиться поверх протокола SSH, поэтому лучше избавиться от постоянного требования ввода пароля, добавив свой публичный SSH-ключ в список авторизованных ключей на сервере: достаточно просто скопировать ваш публичный SSH-ключ в конец файла <code>~/.ssh/authorized_keys</code>, а если такого файла не существует, то достаточно будет просто создать его.</p>
<p>На самом деле, всё это можно легко автоматизировать. Выполните данную команду на вашем <em>локальном</em> компьютере:</p>
<pre><code>% cat ~/.ssh/id_rsa.pub | ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru 'cat &gt;&gt; ~/.ssh/authorized_keys' </code></pre>
<p>На всякий случай, стоит удостовериться, что директория <code>.ssh</code> и список авторизованных ключей закрыты для чтения остальными пользователями. Это требование продиктовано реализацией OpenSSH и здравым смыслом. Для этого достаточно выполнить команду на <em>нашем</em> сервере:</p>
<pre><code>% ssh hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru 'chmod 0700 ~/.ssh' </code></pre>
<p>Отлично, теперь работа с нашими серверами при помощи SSH станет гораздо проще и комфортнее, без какого-либо ущерба безопасности. Главное — мы выполнили все приготовления для функционирования Git.</p>
<p>Создадим в директории вашего проекта на <em>локальном</em> компьютере Git-репозиторий:</p>
<pre><code>% cd meet.git</code></pre>
<pre><code>% git init </code></pre>
<p>Добавим в учёт все файлы вашего проекта:</p>
<pre><code>% git add . </code></pre>
<p>Пока не поздно, можно сделать ревизию состояния всех файлов:</p>
<pre><code>% git status </code></pre>
<p>Необходимо принять изменения (выполнить commit). Каждое множество изменений обязано сопровождаться хотя бы кратким описанием. Поскольку это наш первый коммит, то описание будет соответствующим:</p>
<pre><code>% git commit -m 'initial commit' </code></pre>
<p>Отлично, теперь на вашем локальном компьютере выполняется полноценный контроль версий. С этого момента вы сможете отслеживать любые изменения в коде вашего проекта, что позволяет значительно облегчить процесс разработки и, в особенности, отладки.</p>
<p>Для того, чтобы Git обеспечил согласование вашего локального репозитория с его братом-близнецом на сервере Locum, нужно определить точку синхронизации. Это не является обязательным пунктом, ведь оба репозитория являются полноценными, и возможность согласования — всего лишь приятная возможность. В системе Git точки синхронизации называются <code>remotes</code> и являются именованными. Как правило, единственная точка синхронизации носит гордое имя <code>origin</code>.</p>
<pre><code>% git remote add origin ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git </code></pre>
<p>Теперь попробуем впервые отправить наши данные на сервер. В терминологии Git это зовётся <code>push</code>. При этом необходимо указать целевую точку синхронизации и название ветке, в которую публикуются изменения. По-умолчанию все данные в Git лежат в ветке <code>master</code>.</p>
<pre><code>% git push -u origin master</code></pre>
<pre><code>Counting objects: 3, done.</code></pre>
<pre><code>Writing objects: 100% (3/3), 211 bytes, done.</code></pre>
<pre><code>Total 3 (delta 0), reused 0 (delta 0)</code></pre>
<pre><code>To ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git</code></pre>
<pre><code>* [new branch] master -&gt; master</code></pre>
<pre><code>Branch master set up to track remote branch master from origin. </code></pre>
<p>Команда <code>push</code> вызвана с ключом <code>-u</code>, который заставляет Git запомнить, что вы предпочитаете делать <code>push</code> и обратный ему процесс <code>pull</code> в ветке <code>master</code> точки синхронизации <code>origin</code>. С этого момента никаких дополнительных параметров для команд <code>git push</code> и <code>git pull</code> вам не понадобится.</p>
<p>Кстати, если после выполнения последней команды вы увидели аналогичный результат в вашем терминале, то Git функционирует корректно. Для того, чтобы это проверить, попробуем выполнить клонирование (скачивание) новоиспечённого репозитария. Попробуйте выполнить эту команду, находясь в какой-либо директории, не содержащей каталог <code>meet-git</code>:</p>
<pre><code>% git clone 'ssh://hosting_ПОЛЬЗОВАТЕЛЬ@ВАШ_СЕРВЕР.locum.ru/home/hosting_ПОЛЬЗОВАТЕЛЬ/git/meet.git'</code></pre>
<pre><code>Cloning into meet-git...</code></pre>
<pre><code>remote: Counting objects: 3, done.</code></pre>
<pre><code>remote: Total 3 (delta 0), reused 0 (delta 0)</code></pre>
<pre><code>Receiving objects: 100% (3/3), done. </code></pre>
<p>Удалось? Поздравляем, у вас теперь есть собственный приватный Git-репозиторий, в котором вы можете самостоятельно заниматься разработкой вашего проекта, не беспокоясь о сохранности исходного кода. Удачи!</p>
<p>Для дальнейшего чтения мы можем посоветовать <a href="http://progit.org/book/ru/">русскоязычный перевод книги Pro Git</a>.</p>
<p>P.S. Кстати, если вам нужно подключить к репозиторию своих сотрудников, то просто пропишите их публичные SSH-ключи в конец списка авторизованных ключей (см. выше) и попросите выполнить git clone с известным вам адресом.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/git-on-locum/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Используем bundler на locum.ru</title>
		<link>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru</link>
		<comments>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru#comments</comments>
		<pubDate>Mon, 25 Jul 2011 08:51:47 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=212</guid>
		<description><![CDATA[Странные сообщения об ошибках Если вы читаете эту статью, то вполне вероятно вы видели такую ошибку, несмотря на то, что gem  с нужной версией ruby on rails у вас установлен. Missing the Rails 2.3.8 gem. Please `gem install -v=2.3.8 rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2><a href="http://locum.ru/blog/?p=212"><br />
<img class="size-full wp-image-247 aligncenter" title="Используем bundler на locum.ru" src="http://locum.ru/blog/wp-content/uploads/2011/07/gemfile1.png" alt="" width="585" height="194" /></a></h2>
<h2>Странные сообщения об ошибках</h2>
<p>Если вы читаете эту статью, то вполне вероятно вы видели такую ошибку, несмотря на то, что gem  с нужной версией ruby on rails у вас установлен.</p>
<blockquote><p>Missing the Rails 2.3.8 gem. Please `gem install -v=2.3.8 rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.</p></blockquote>
<p>Или может быть такую?</p>
<blockquote><p>You have already activated ** rack** 1.1.0, but your Gemfile requires rack 1.0.1. Consider using bundle exec. (Gem::LoadError)</p></blockquote>
<p>Версии, указанные в примерах могут, конечно, отличаться, но сути это не меняет.  В этой статье я объясню от чего такое возникает и как этого избежать.</p>
<p><span id="more-212"></span></p>
<h2>Rack и проблемы, связанные с ним</h2>
<p>Всему виной rack, точнее несоответствие его версии тому, что хочет видеть rails. Причем первое сообщение об ошибке очень странное, никаким образом не упоминает rack и даже никак не намекает на него, но давайте посмотрим в код, который выводит это сообщение. Открывает config/boot.rb, и видим:</p>
<pre>class GemBoot &lt; Boot
   def load_initializer
       self.class.load_rubygems
       load_rails_gem
       require 'initializer'
   end
   def load_rails_gem
       if version = self.class.gem_version
          gem 'rails', version
      else
          gem 'rails'
      end
      rescue Gem::LoadError =&gt; load_error
          $stderr.puts %(Missing the Rails #{version} gem.</pre>
<pre>          Please `gem install -v=#{version} rails`,</pre>
<pre>          update your RAILS_GEM_VERSION setting in config/environment.rb</pre>
<pre>          for the Rails version you do have installed,</pre>
<pre>          or comment out RAILS_GEM_VERSION</pre>
<pre>          to use the latest version installed.)</pre>
<pre>          exit 1
      end</pre>
<p><span style="font-style: normal;">Тут-то и становится понятно, что это сообщение выводится не только когда не удается загрузить именно rails, но и в любом другом случае, когда возбуждается исключение <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">Gem::LoadError. </span>Стоит отметить, что в последующих версиях rails (где-то после 2.3.10), сообщение об ошибке стало более информативно, и пользователи перестали предпринимать отчаянные попытки установить нужный gem несколько раз подряд, до этого видимо авторы rails не подозревали, что такое исключение может возникнуть в иной ситуации.</span></p>
<p><span style="font-style: normal;">Вторая ошибка уже более информативна и подсказывает нам, что дело тут в rack, как это на самом деле обстоит и в первом случае. Суть в том, что отличный сервер для rails &#8212; unicorn, использует rack для своей работы. Современные версии Ruby On Rails так же используют rack для своей работы, и необходимо, чтобы они использовали одну и ту же версию. Иначе будем получать такие вот ошибки, потому что вызов activate! у rack во время загрузки rails не пройдет.</span></p>
<p><span style="font-style: normal;">Очевидным решением было бы добавить в config/environment.rb строку следующего вида:</span></p>
<pre><span style="font-style: normal;">config.gem 'rack', '=1.0.1'</span></pre>
<p>Однако, попробовавшие это решение будут разочарованы &#8212; ничего не поменяется. Проблема в том, что unicorn вначале запускается сам, загружает свой код и активирует rack. Причем написан он довольно грамотно и активировать будет самую новую версию, которая есть, работает он с ней нормально. И уже только после этого unicorn будет пытаться загрузить Ruby On Rails, только тогда считается environment.rb и эта строка, но более новый rack уже будет активирован.</p>
<p>Еще одним простым решением будет просто удалить локальную инсталляцию более нового rack, оставив только нужную нашему rails-проекту версию, но такое решение подходит лишь для тех, у кого один проект, или на всех проектах нужен один и тот же rack. Если у вас есть проекты, например на rails 2.3.8, 2.3.11 и 3.0.2 &#8212; вам потребуется для каждого из них своя версия rack и вариант с удалением не подойдет.</p>
<p>Тут на выручку приходит bundler.</p>
<h2>Решаем проблему с помощью bundle</h2>
<p>Bundler &#8212; это средство управления различными окружениями gem. Он легко позволяет создать изолированную инсталляцию gem для конкретного проекта, чтобы остальные, установленные на локальной машине gem не мешали работать. Так же при помощи bundler удобно устанавливать большие пачки gem в системные или иные директории. На всех серверах <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a> bundler уже установлен. Если при попытке выполнить команду bundle вы получаете ошибку:</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; white-space: pre;">bash: bundle: команда не найдена</span></p>
<p>То убедитесь, что у вас правильно настроена переменная окружения PATH. Мы рекомендуем устанавливать следующее значение PATH=&#187;/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/$HOME/.gem/ruby/1.8/bin:/var/lib/gems/1.8/bin&#187;.</p>
<p>Подробнее о том, как работать с bundler и что он позволяет вы всегда сможете узнать в официальной документации, тут же мы кратко рассмотрим только ограничение версий нужных нам gem. Итак, для начала создаем Gemfile. Gemfile &#8212; это такой список используемых в проекте gem, с указанием нужных версий. Если версию не указать &#8212; будет доступна самая последняя из установленных. Важно перечислить все gem, необходимые для работы проекта, так как то, что не указано в Gemfile, не будет доступно из кода ни rails, ни unicorn. Ровно по этой же причине необходимо добавить сам unicorn в список. Gemfile должен находиться в той директории, откуда запускается unicorn, т.е. в нашем случае это current в каталоге capistrano, RAILS_ROOT. Если вы используете систему контроля версий, рекомендуем поместить Gemfile  в нее, так как он будет нужен для каждого деплоя.</p>
<p>Вот пример Gemfile для запуска redmine из trunk:</p>
<pre>source "http://rubygems.org"
gem "unicorn"
gem "rack", "1.1.0"
gem "rails", "2.3.11"
gem "rake", "0.8.7"
gem "i18n", "0.4.2"
gem "rubytree", "0.5.2", :require =&gt; "tree"
gem "RedCloth", "~&gt;4.2.3", :require =&gt; "redcloth" # for CodeRay
gem "mysql"
gem "coderay", "~&gt;0.9.7"</pre>
<p>Сохранив такое содержимое рекомендуем выполняем следующие команды (все запускается из директории current):</p>
<pre>bundle install --path ../../shared/gems</pre>
<pre>kill -QUIT `cat /var/run/unicorn/имя_пользователя_на_сервере/имя_проекта.логин_в_панели_управления.pid`</pre>
<pre>bundle exec unicorn_rails -Dc /etc/unicorn/имя_проекта.логин_в_панели_управления.rb</pre>
<p>Первая команда должна установить все gem с нужными версиями (просто так, на всякий случай), важно не забывать про ключ &#8212;path, потому что иначе bundler будет пытаться установить все в системную директорию и требовать с вас пароль на sudo. Вторая — остановить уже запущенный экземпляр unicorn для проекта. Если он упал ранее по причине ошибки &#8212; ничего страшного, PID-file просто будет отсутствовать. Последняя команда стартует unicorn в созданном нами окружении bundle. После этого все должно работать, перезагрузка кода так же выполняется отправлением сигнала USR2. Так же для этого есть специальная кнопка в панели управления хостингом <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a>.</p>
<p>Если вы используете capistrano, как мы всем рекомендуем, то нужно добавить вызов bundle exec перед командой запуска unicorn в ваш deploy.rb.</p>
<p>Иногда при работе со старыми версиями Rails возникает ошибка, примерно следующего вида:</p>
<blockquote><p>uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)</p></blockquote>
<p>Эта проблема не связана с bundle и rack, но возникает не редко, связанно это с изменениями в новых версиях rubygems, на которые не рассчитаны старые версии rails. Решается проблема добавлением вызова <strong>require &#8216;thread&#8217; </strong>в config/environment.rb или config/boot.rb. Спорный вопрос в какой из этих файлов идеологически правильнее добавить вызов, но сработают оба варианта. Кто имеет четкое мнение по этому вопросу &#8212; напишите, пожалуйста, в комментариях. Что до меня, так идеологически правильным я вижу только одно решение &#8212; обновить версию rails до такой, где ошибки не возникает, а все остальное примерно одинаково костыль, но костыль абсолютно рабочий.</p>
<h2>Подведем итог</h2>
<p>Bundler &#8212; действительно удобное средство для решения таких проблем. Любая система установки дополнительных пакетов, вроде rubygems, которая позволяет держать много версий одной и той же библиотеки, в итоге должна столкнуться с проблемами конфликтов версий и как-то их решать. Недостатком является только то, что саму версию rubygems выбрать при помощи bundler никак не получится, но это нужно уже совсем редко, в таких ситуациях придется скорее всего решать проблему при помощи RVM. Процесс деплоя с bundler не сильно усложнился, тем более все это так же легко автоматизируется с Capistrano.  Ограничивать версию разных gem для rails можно было и раньше, используя вызовы config.gem в environment.rb и хорошим тоном всегда считалось перечислять там нужные gem. Сейчас просто ограничивается набор gem не только для rails, но и для сервера приложений, а вызов bundle install просто заменяет нам старое rake gems:install.</p>
<p>На этом прощаемся с вами, всем удачи в развитии своих проектов и их размещении на <a title="Locum hosting house" href="http://locum.ru" target="_blank">Locum.ru</a>. Кстати, кто-нибудь сталкивался в своей практике с необходимостью ограничить версию чего-то еще не только для самого rails-приложения, но и для сервера, кроме Rack? Если да &#8212; напишите, пожалуйста, об этом в комментариях. Пока по общению с нашими клиентами и собственной практике разработки и деплоя мы не встречались с другими примерами.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d1%83%d0%b5%d0%bc-bundler-%d0%bd%d0%b0-locum-ru/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Новая система биллинга</title>
		<link>http://locum.ru/blog/news/new_billing</link>
		<comments>http://locum.ru/blog/news/new_billing#comments</comments>
		<pubDate>Tue, 15 Feb 2011 13:24:44 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Компания]]></category>
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=194</guid>
		<description><![CDATA[Дорогие друзья! Последнее время мы усердно работали над новой системой биллинга и тарификации, сегодня мы  готовы к ее внедрению. Многие из вас уже привыкли к старой системе, а некоторые даже нашли несколько неудобных моментов в работе, которые мы постарались исправить в новой версии. В основном упор был сделан на большую гибкость покупки ресурсов и тарификации, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Дорогие друзья! Последнее время мы усердно работали над новой системой биллинга и тарификации, сегодня мы  готовы к ее внедрению.<span id="more-194"></span><img class="alignright size-full wp-image-217" style="margin-top: 1em;" src="http://blog.locum.ru/wp-content/uploads/2011/02/image.gif" alt="" width="320" height="240" /></p>
<p>Многие из вас уже привыкли к старой системе, а некоторые даже нашли несколько неудобных моментов в работе, которые мы постарались исправить в новой версии. В основном упор был сделан на большую гибкость покупки ресурсов и тарификации, в этой статье я постараюсь изложить основные особенность новой системы.</p>
<h2>Базовый тариф и типы сервиса</h2>
<p>Для многих из вас не секрет, что в предыдущей версии хостинг и виртуальные серверы были разными типами сервиса, не совместимыми на одном аккаунте. Тем из наших клиентов, кто пользовался виртуальным сервером и хостингом одновременно, необходимо было иметь разные учетные записи. Сейчас эти ограничения исчезли. На одном аккаунте можно приобретать как виртуальный хостинг, так и виртуальные серверы, а так же, ряд дополнительных услуг. Если у вас есть несколько аккаунтов, и вы хотите объединить их в один &#8212; создайте соответствующий запрос в техническую поддержку, и наши специалисты помогут вам. Объединение двух тарифов аккаунтов с хостингом пока не предусмотрено, но такая возможность должна появиться в будущем, в том или ином виде. Ресурсы и средства всех этих аккаунтов будут объединены.  Теперь, количество виртуальных серверов на одном аккаунте  не ограничено .</p>
<p>В новой системе существует базовый тариф, на котором можно приобретать виртуальные серверы и домены, а так же некоторые другие дополнительные услуги. Базовый тариф бесплатный, так как все эти ресурсы оплачиваются отдельно.  Для того, чтобы воспользоваться хостингом, нужно будет сменить тариф на один из предложенных, на выбор. При смене, все возможности базового тарифа сохраняются.</p>
<p>Выбрать, какие услуги отображать, а какие скрывать, вы можете в разделе &#171;Аккаунт&#187; во вкладке &#171;настройки&#187;.</p>
<h2>Почасовая тарификация</h2>
<p>В предыдущей версии вам были доступны 2 периода оплаты, и стоимость тарифа зависела от срока, на который пользователь его оплачивал . Сейчас, все ресурсы тарифицируются по часам. Исключение составляют домены, так как, по правилам регистрации, их необходимо оплачивать на 1 год или больший срок. Каждый час наша система биллинга проводит списание средств, если средств на балансе на момент списания недостаточно для оплаты следующего часа обслуживания, то аккаунт будет заблокирован. Пополнив баланс, пользователь сможет разблокировать аккаунт. Для удобства клиентов сохранена информация о стоимости ресурсов в день и месяц.</p>
<h2>Ресурсы: тарифные и дополнительные</h2>
<p>Новая версия системы дает возможность приобретать дополнительные ресурсы, помимо тех, которые доступны по действующему тарифу. На пример, если тариф предусматривает возможность размещения только двух проектов, а вы желаете добавить еще один, то нет необходимости менять тариф на более дорогой, который может быть избыточен для ваших задач. Теперь, вы можете просто приобрести дополнительный проект или базу данных. Этот ресурс будет оплачиваться отдельно и  увеличивать суммарную часовую стоимость обслуживания вашего аккаунта с учетом его цены.</p>
<h2>Бесплатные домены и иные бонусы</h2>
<p>Как и раньше, при единовременном платеже в 1500р, вы получаете на баланс бонусные 390р. Именно об этом идет речь, когда в описании тарифа говорится о бесплатном домене, при оплате за год. Эти средства могут быть потрачены как на покупку или продление доменов, так и на любые другие, предоставляемые нами услуги, на ваше усмотрение. Бонус начисляется за каждые 1500р, то есть, при единовременном платеже в 3000р вы получите 780р бонусных средств.</p>
<h2>Переход от старой системы к новой и перерасчет</h2>
<p>При запуске новой системы всем действующим пользователям на баланс будут зачислены денежные средства, в количестве,  достаточном для обслуживания, с сохраниением индивидуальных параметров аккаунта каждого пользователя,  до конца оплаченного срока, по старым правилам. В новой системе нет оплаченного периода, аккаунт просто остается активным до тех пор, пока на балансе достаточно средств для его оплаты.</p>
<p>Надеемся, что наша новая система будет более удобной и гибкой в использовании, что позволит вам рациональнее использовать ваши средства и ресурсы хостинга.</p>
<h2>В скором будущем: партнерская программа</h2>
<p>Так же хотелось упомянуть, что в скором времени готовится релиз партнерской программы для клиентов locum.ru. Она позволит получать реальные денежные  средства за привлеченных клиентов и отлично подойдет всем, кто так или иначе связан с разработкой web ресурсов. Более подробно о партнерской программе мы сообщим после ее запуска. Следите за новостями!</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/new_billing/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Разворачиваем rails-приложение правильным и удобным методом</title>
		<link>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b</link>
		<comments>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b#comments</comments>
		<pubDate>Fri, 28 Jan 2011 14:38:27 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[unicorn]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=187</guid>
		<description><![CDATA[В этой статье я расскажу как проще и удобнее всего разворачивать приложения на ruby on rails на нашем хостинге. Используя эту инструкцию вы сэкономите время и легко обнаружите ошибки, которые могут возникать при развертывании Rails-приложений. Так же будет информация о самых частых проблемах и о том, как их избежать. Описанный метод так же подходит и [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a rel="attachment wp-att-201" href="http://blog.locum.ru/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b/attachment/rails"><img class="aligncenter size-full wp-image-201" title="rails" src="http://blog.locum.ru/wp-content/uploads/2011/01/rails.png" alt="" width="600" height="401" /></a></p>
<p>В этой статье я расскажу как проще и удобнее всего разворачивать приложения на ruby on rails на нашем хостинге. Используя эту инструкцию вы сэкономите время и легко обнаружите ошибки, которые могут возникать при развертывании Rails-приложений. Так же будет информация о самых частых проблемах и о том, как их избежать. Описанный метод так же подходит и для Rack-приложений, с некоторыми оговорками и незначительными изменениями в конфигурационных файлах.<span id="more-187"></span></p>
<h2>Сервер приложений.</h2>
<p>На серверах locum.ru для Rails-приложений по умолчанию используется <a href="http://unicorn.bogomips.org" target="_blank">unicorn</a>. По запросу можно создать проект, который будет использовать <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a>, но обычно это не требуется. Unicorn зарекомендовал себя как быстрый и очень гибкий в использовании сервер для rails и rack.</p>
<h2>Определяем нужную версию Rails.</h2>
<p>Итак, мы решили разместить приложение на ruby on rails на сервере locum.ru. Первое что нам нужно знать &#8212; версию Ruby On Rails, которую использует наше приложение. Если это Rails ветки 2.3 и версия выше 2.3.5 &#8212; дополнительные действия не нужны. Можно сразу переходить к следующему шагу. Приложение на Rails 2.3.5 и старше скорее всего не получится запустить на Unicorn, из-за несовместимости этих версий с нужной версией <a href="http://rack.rubyforge.org/" target="_blank">Rack</a>. Стоит отметить, что для большинства приложений будет достаточно просто поменять версию фреймворка на 2.3.6 в config/environment.rb, чтобы все заработало на unicorn, например с популярным issue-трекером <a href="http://redmine.org" target="_blank">Redmine</a> это легко решает проблему запуска.</p>
<p>Если наше приложение использует rails 3.X, первым делом следует войти по ssh на сервер и установить соответствующий gem. Для этого нужно выполнить команду:</p>
<pre>gem install rails --user-install --no-rdoc --no-ri</pre>
<p>Если хочется использовать <a href="http://gembundler.com/" target="_blank">Bundler</a> и устанавливать gem вне стандартного пути &#171;~/.gem&#187;,  то нужно установить хотя бы rack версии 1.2 в стандартный путь для gem аналогичной командой:</p>
<pre>gem install raсk --user-install --no-rdoc --no-ri</pre>
<p>Дело в том, что unicorn при старте запускается вне bundle, поэтому он будет использовать rack 1.1, и не сможет запустить приложение, требующее более новую версию rack, так же как и не сможет заменить в процесс работы уже активированную версию rack на более новую. Это является особенностью работы rack и часто приводит к ошибкам, если не помнить о ней.</p>
<h2>Создание проекта из панели управления.</h2>
<p>Теперь нужно зайти в панель управления и создать проект для нашего приложения. Заходим в раздел &#171;проекты&#187;, создаем новый проект с типом Ruby On Rails. Если планируется использовать отличную от MySQL базу данных, то отключаем пункт &#171;создать базу данных&#187;, так как по умолчанию создается база именно этого типа.</p>
<h2>Размещение кода на сервере.</h2>
<p>Создание проекта занимает некоторое время, но после этого у вас на сервер в директории projects появится директория с именем проекта, а в ней стандартная структура каталогов для <a href="http://capify.org/" target="_blank">Сapistrano</a>.  Удобнее всего использовать именно capistrano для загрузки кода на сервер. Это стандартное средство, которое позволяет легко обновлять версию кода, перезапускать сервер приложений, а так же многое другое. Пример конфигурационного файла, адаптированного для использования с нашим хостингом и unicorn можно скачать по следующей ссылке: <a href="http://locum.ru/examples/deploy.rb">http://locum.ru/examples/deploy.rb</a></p>
<p>Заменив в примере нужные значения вы сможете легко загрузить ваш проект на сервер и перезапустить unicorn командой &#171;cap deploy&#187;.</p>
<p>Если не хочется использовать capistrano &#8212; это не проблема, можно обойтись и без  нее. Структура директорий такова:</p>
<pre>имя проекта/
   current -&gt; текущий каталог для unicorn, является символической ссылкой на одну из версий в релизах
   releases/ -&gt; директория с версиям приложения
       initial_release/ -&gt; созданное по умолчанию приложение</pre>
<p>Вам нужно разместить код вашего приложения в директории внутри releases, имя выберите произвольно, а затем изменить ссылку current, чтобы она указывала на директорию с вашим приложением, вместо initial_release, сделать это можно командой ln -sf по ssh.</p>
<p>Типичной ошибкой является удаление директории initial_release или всех файлов в ней.  Дело в том, что у нас unicorn использует очень удобный метод перезапуска. Когда приходит команда на перезагрузку сервера, запускается новый экземпляр unicorn, загружается код и затем, если все в порядке &#8212; новый экземпляр замещает предыдущий, а старый завершается. Сам процесс немного сложнее, но полное описание работы unicorn выходит за рамки этой статьи. Так как старый процесс был запущен в то время, когда ссылка current указывала на каталог initial_release, то и лог пишется там. Если новый экземпляр unicorn не сможет запуститься, то информацию об ошибке следует искать в файле log/unicorn.stderr.log именно по старому пути. Если эти файлы удалить, unicorn будет все еще пытаться писать по открытому заранее дескриптору, но прочитать мы эти данные уже не сможем. Если директория initial_release вам чем-то мешает, то вы всегда сможете удалить ее позже, после того как эти файлы уже перестанут использоваться.</p>
<p>После того, как файлы размещены и ссылка current изменена следует зайти в подробности проекта в панели управления хостингом и нажать кнопку &#171;перезагрузить сервер&#187;.  В случае использования capistrano, сервер будет перезапущен автоматически. Через минуту вы можете зайти на URL вашего проекта и увидеть свое приложение в работе.</p>
<h2>Распространенные ошибки, где их искать и как избежать.</h2>
<p>Опыт показывает, что самой распространенной проблемой при размещении rails-приложений на нашем хостинге является  нехватка того или иного gem или же нужной его версии. Этого можно избежать, если описывать все, необходимые для работы кода gem в environment.rb и выполнять rake gems:install перед перезагрузкой unicorn с новым кодом. Так же можно использовать bundler и выполнять bundle install. Имейте ввиду, что команда bundle по умолчанию будет пытаться установить gem в системные директории, что конечно же не удастся сделать без root-доступа. Поэтому не забывайте всегда использовать ключ &#8212;path с указанием пути, куда вы хотите устанавливать локальные gem. Можно делать это, например, в директорию &#171;~/.gem&#187;.</p>
<p>Так же, некоторые пользователи банально забывают внести нужные настройки для базы данных в database.yml. Не забывайте, что на нашем хостинге все проекты запускаются в режиме &#8216;production&#8217;, а значит и настройки нужно вносить в соответствующей секции database.yml</p>
<p>Что делать, если после перезагрузки кода unicorn на сайте проекта ничего не поменялось? Это значит, что новый экземпляр unicorn не смог запуститься по какой-то причине. Для выяснения причины нужно посмотреть последние строки файла log/unicorn.stderr.log в той директории, где запущена версия unicorn, которая осталась работать. При загрузке нового приложения это будет releases/initial_release.</p>
<p>Еще одна частая ошибка, это попытка зайти на домен, созданный для проекта сразу после появления его в панели управления. Дело в том, что для перезагрузки конфигурации DNS-сервера требуется некоторое время, потому лучше подождать несколько минут. В противном случае можно оказаться в неприятной ситуации. DNS сервер вашего провайдера может кэшировать ответы на запросы, если вы зайдете слишком рано и получите ответ, что такого домена нет, и это попадет в кэш, может получиться, что после того, как наш DNS сервер уже начнет сообщать IP-адрес этого домена, вы  все еще будете получать ошибочный ответ из кэша.</p>
<p>Коллектив Locum.ru желает успеха всем нашим пользователям в разработке и размещении проектов.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/%d1%80%d0%b0%d0%b7%d0%b2%d0%be%d1%80%d0%b0%d1%87%d0%b8%d0%b2%d0%b0%d0%b5%d0%bc-rails-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d1%8b/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Способ перехода с Passenger на Unicorn.</title>
		<link>http://locum.ru/blog/news/%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d1%81-passenger-%d0%bd%d0%b0-unicorn</link>
		<comments>http://locum.ru/blog/news/%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d1%81-passenger-%d0%bd%d0%b0-unicorn#comments</comments>
		<pubDate>Wed, 01 Dec 2010 12:58:20 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=177</guid>
		<description><![CDATA[Долгое время наши специалисты изучали пути повышения производительности Rails-проектов и в результате мы решили изменить способ запуска Rails на наших серверах. Начиная с 11 ноября 2010 года абсолютно все новые проекты Rails создаются и запускаются при помощи сервера Rack/Rails приложений Unicorn. Уже созданные проекты, тем не менее, продолжают работать под управлением Phusion Passenger, и, если [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Долгое время наши специалисты изучали пути повышения производительности Rails-проектов и в результате мы решили изменить способ запуска Rails на наших серверах. Начиная с 11 ноября 2010 года абсолютно все новые проекты Rails создаются и запускаются при помощи сервера Rack/Rails приложений Unicorn.</p>
<p>Уже созданные проекты, тем не менее, продолжают работать под управлением Phusion Passenger, и, если вас не устраивает производительность, то из этой статьи вы узнаете, как правильно и с минимальными усилиями изменить способ запуска вашего проекта.</p>
<p><span id="more-177"></span>Если ваш проект использует базу данных, ее нужно отвязать, чтобы не потерять данные. Для этого в панели управления откройте свойства нужного вам проекта.</p>
<p style="text-align: center;"><img class="size-full wp-image-178 aligncenter" title="Рабочее место 1_001" src="http://blog.locum.ru/wp-content/uploads/2010/12/Рабочее-место-1_001.png" alt="" width="1141" height="96" /></p>
<p>В окне свойств перейдите к базе данных вашего проекта.</p>
<p><img class="alignnone size-full wp-image-179" title="Рабочее место 1_002" src="http://blog.locum.ru/wp-content/uploads/2010/12/Рабочее-место-1_002.png" alt="" width="803" height="408" /></p>
<p>В свойствах базы данных нажмите кнопку «Отвязать» напротив названия проекта.</p>
<p><img class="alignnone size-full wp-image-180" title="Locum - hosting house | Профессиональный хостинг, регистрация доменов, размещение сайтов, linux хостинг, ruby on rails хостинг, django хостинг-Mozilla Firefox_003" src="http://blog.locum.ru/wp-content/uploads/2010/12/Locum-hosting-house-Профессиональный-хостинг-регистрация-доменов-размещение-сайтов-linux-хостинг-ruby-on-rails-хостинг-django-хостинг-Mozilla-Firefox_003.png" alt="" width="749" height="378" /></p>
<p>Аналогичным образом отвяжите от проекта все домены, кроме технических.</p>
<p>Используя логин и пароль в разделе «FTP и SSH», подключитесь к серверу, зайдите в каталог projects и переименуйте директорю с вашим проектом.</p>
<p><img class="alignnone size-full wp-image-181" title="Рабочее место 1_005" src="http://blog.locum.ru/wp-content/uploads/2010/12/Рабочее-место-1_005.png" alt="" width="506" height="375" /></p>
<p>Удалите проект через панель управления хостингом.</p>
<p><img class="alignnone size-full wp-image-182" title="Рабочее место 1_007" src="http://blog.locum.ru/wp-content/uploads/2010/12/Рабочее-место-1_007.png" alt="" width="810" height="221" /></p>
<p>После того, как проект исчезнет из списка (на это может уйти некоторое время), создайте новый Rails-проект с точно таким же именем. При этом базу данных создавать не нужно.</p>
<p><img class="alignnone size-full wp-image-183" title="Рабочее место 1_008" src="http://blog.locum.ru/wp-content/uploads/2010/12/Рабочее-место-1_008.png" alt="" width="876" height="470" /></p>
<p>Дождитесь, пока проект перейдет в состояние «Готово», после чего вернитесь к менеджеру файлов по FTP.</p>
<p>В каталоге projects вы увидете две директории: архивная с вашим проектом и новая с именем вашего проекта, которая была создана только что. Удалите только что созданную директорию, после чего переименуйте архивный каталог обратно.</p>
<p><img class="alignnone size-full wp-image-184" title="projects_009" src="http://blog.locum.ru/wp-content/uploads/2010/12/projects_009.png" alt="" width="506" height="373" /></p>
<p>В панели управления в свойствах проекта нажмите кнопку «Перезагрузить сервер», после чего ваш проект начнет работу с Unicorn.</p>
<p>Привяжите к проекту все нужные вам домены.</p>
<h1>Несколько важных моментов</h1>
<p>Перезагрузку кода приложения можно осуществить не только из панели управления, но и из консоли. Для этого нужно выполнить команду</p>
<p>kill -USR2 `cat /var/run/unicorn/project.hosting_user.pid`</p>
<p>В случае удаления проекта без привязанной базы данных, база данных не будет удалена вместе с проектом и при необходимости это нужно сделать вручную.</p>
<p>Если вы используете Capistrano для автоматизации развертывания проекта, то вы можете посмотреть <a href="http://locum.ru/examples/deploy.rb" target="_blank">пример файла конфигурации</a> для работы с Unicorn на наших серверах.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/%d1%81%d0%bf%d0%be%d1%81%d0%be%d0%b1-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4%d0%b0-%d1%81-passenger-%d0%bd%d0%b0-unicorn/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rails 3. Production ready?</title>
		<link>http://locum.ru/blog/news/rails-3-production-ready</link>
		<comments>http://locum.ru/blog/news/rails-3-production-ready#comments</comments>
		<pubDate>Wed, 14 Jul 2010 17:03:32 +0000</pubDate>
		<dc:creator><![CDATA[madbox]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=145</guid>
		<description><![CDATA[Все говорят о Rails 3, некоторые его уже пробуют, а некоторые даже используют в production. Некоторые наши клиенты интересуются, работает ли бета этого фреймворка у нас. Не смотря на то, что нужный gem не установлен в системе, его можно поставить локально для пользователя. Зависимости также ставятся без каких-либо нареканий. Весь процесс занял всего несколько минут [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.locum.ru/news/rails-3-production-ready"><img class="size-full wp-image-150 aligncenter" title="rails3" src="http://blog.locum.ru/wp-content/uploads/2010/07/rails3.png" alt="Locum.ru: запуск Rails 3" width="600" height="300" /></a></p>
<p>Все говорят о <a href="http://weblog.rubyonrails.org/2010/6/8/rails-3-0-beta-4-now-rc-in-days">Rails 3</a>, некоторые его уже пробуют, а некоторые даже используют в production. Некоторые наши клиенты интересуются, работает ли бета этого фреймворка у нас. Не смотря на то, что нужный gem не установлен в системе, его можно поставить локально для пользователя. Зависимости также ставятся без каких-либо нареканий.</p>
<p>Весь процесс занял всего несколько минут ( большую часть времени ждал пока gem подумает <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> ). Дабы не быть голословным, опишу весь процесс по шагам:<br />
<span id="more-145"></span><br />
1. Создаем проект с типом &#171;Ruby on rails&#187;, например с именем &#171;rails3&#8243;.</p>
<p>2. Устанавливаем gem. Тут есть небольшая хирость: надо использовать ключ &#8212;install-dir с указанием директории установки гема. Чтобы не потерять уже установленные локально, укажем стандартный путь.</p>
<pre lang="BASH">>gem install rails --pre --install-dir /home/hosting_<имя_пользователя>/.gem/ruby/1.8</pre>
<p>3. После некоторого ожидания можно проверить, какая версия rails установлена.</p>
<pre lang="bash">>rails -v
Rails 3.0.0.beta4</pre>
<p>4. Теперь попробуем создать простейшее рабочее приложение:</p>
<pre lang="bash">>cd ~/projects/rails3/releases
>rails new thefirst
>cd thefirst
>rails generate scaffold book name:string price:float
>RAILS_ENV=production rake db:migrate
>rm public/index.html
>nano config/routes.rb # Тут пропишем путь root :to =>; "books#index"
>cd .. ; rm current ; ln -s releases/thefirst current
>touch releases/thefirst/tmp/restart.txt # говорим passenger'у перечитать код приложения</pre>
<p style="text-align: left;">5. Идем по ссылке http://rails3.<имя_пользователя>.locum.ru и видим знакомый всем интерфейс скаффолда.<br />
<a href="http://rails3.madbox.locum.ru/"><img class="size-medium wp-image-155 aligncenter" title="Locum.ru: стандартное Rails-приложение" src="http://blog.locum.ru/wp-content/uploads/2010/07/browser-1-1754252746-1-300x206.png" alt="Locum.ru: стандартное Rails-приложение" width="300" height="206" /></a></p>
<p>Как видно, никаких особенных хитростей не понадобилось, все компоненты просто ставятся и работают. В четвертом шаге я описал стандартный способ разворачивания простого rails приложения на locum.ru и способ перезагрузки кода из консоли, так что, если кто-то еще не знал — знайте. <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Update:<br />
Обнаружился небольшой нюанс: <a href="http://github.com/carlhuda/bundler">bundler</a> версии 1.0.0.beta.5 не работает (пытается использовать sudo, что, конечно, запрещено). Нужно использовать стабильную версию, сейчас это 0.9.26.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/rails-3-production-ready/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Выбор сервера приложений для rails</title>
		<link>http://locum.ru/blog/hosting/app_server</link>
		<comments>http://locum.ru/blog/hosting/app_server#comments</comments>
		<pubDate>Mon, 25 Jan 2010 15:51:36 +0000</pubDate>
		<dc:creator><![CDATA[freeman]]></dc:creator>
				<category><![CDATA[Хостинг]]></category>
		<category><![CDATA[application server]]></category>
		<category><![CDATA[mongrel]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[thin]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=116</guid>
		<description><![CDATA[У веб-разработчиков часто возникает вопрос: какой же метод запуска rails приложений выбрать? Попробуем рассмотреть плюсы и минусы каждого из них. Сразу оговоримся, что вариант jruby (запуск ruby кода в jvm) оставим без внимания, как специфический и для нашего проекта не очень интересный. Mongrel Первый метод, что приходит в голову, &#8212; Mongrel cluster. В основном, именно [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.locum.ru/hosting/app_server"><img class="size-full wp-image-132 aligncenter" title="Locum: Выбор сервера приложений для Rails" src="http://blog.locum.ru/wp-content/uploads/2010/01/Fotolia_2796388_M.png" alt="Locum: Выбор сервера приложений для Rails" width="600" height="395" /></a></p>
<p style="text-align: left;">У веб-разработчиков часто возникает вопрос: какой же метод запуска rails приложений выбрать? Попробуем рассмотреть плюсы и минусы каждого из них. Сразу оговоримся, что вариант <a href="http://jruby.org/">jruby</a> (запуск ruby кода в jvm) оставим без внимания, как специфический и для нашего проекта не очень интересный.<br />
<span id="more-116"></span></p>
<h3>Mongrel</h3>
<p style="text-align: left;">Первый метод, что приходит в голову, &#8212; <a href="http://mongrel.rubyforge.org/">Mongrel cluster</a>. В основном, именно он описан в литературе по ruby on rails, он же используется для запуска rails-кода в режиме разработки (development environment). Все, что необходимо для запуска rails с mongrel cluster уже разработано и идет в стандартной поставке, также готовы и методы для <a href="http://www.capify.org/">capistrano</a>. Казалось бы: бери, да пользуйся! Но, как говорится, без ложки дегтя тут не обходится.<br />
Как же работает rails-приложение, запущенное при помощи mongrel cluster? Слово cluster в данном случае использовано не случайно. Дело в том, что сервер mongrel умеет обрабатывать одновременно только один запрос, поэтому запускается некоторое количество серверов на разных портах. Чтобы скрыть эти нюансы от посетителей сайта, используется прокси-сервер. Он распределяет между серверами mongrel запросы для своевременной их обработки. Каждый mongrel — это процесс, который выполняется независимо от своих «собратьев». Поскольку все они работают с одной базой данных и одной версией кода, запросы могут приходить на любой из них. Никаких проблем это не вызывает. Если ваш сервер перестал справляться с нагрузкой, вы легко можете добавить к нему еще один, запустив на нем еще некоторое количество серверов mongrel. Изменений в коде приложения для такой кластеризации делать не придется, ведь ruby on rails изначально рассчитан на данный подход. Единственное, придется обеспечить всем серверам доступ к хранилищу сессионных данных. Это могут быть и СУБД, и <a href="http://www.danga.com/memcached/">memcached</a>, и примонтированная сетевая файловая система (NFS). Такое действие необходимо для того, чтобы при случайном распределении запросов по серверам сессия пользователя не терялась, т.к. первый его запрос может обрабатывать один mongrel, второй — уже другой и т.д.<br />
А вот теперь пора поговорить о минусах. Самый очевидный из них заключается в том, что каждый из серверов mongrel в силу своей автономности будет загружать в память собственную копию кода rails, кода приложения и всех необходимых библиотек. Вот вам и обратная сторона простого кода сервера и легкой возможности кластеризации. При среднем проекте каждый mongrel запросто потребляет около 100М памяти. И если запускать на сайт по три сервера mongrel (т.к. одного явно недостаточно), то память будет потребляться в очень больших количествах. Да, сегодня 300-500 мегабайт памяти – цифра не слишком серьезная. Однако не стоит забывать, что речь идет о разделяемом хостинге, а значит число таких сайтов будет измеряться сотнями. В такой ситуации потребление памяти действительно становится проблемой.</p>
<p style="text-align: left;">
<h3>Thin</h3>
<p style="text-align: left;">Еще одной слабой стороной сервера приложений mongrel является то, что он обязательно занимает один порт. Это создает возможность для различных коллизий и трудно отслеживаемых ошибок. Например, пользователю A выделены порты 3001, 3002 и 3003. Он остановил на время свой mongrel-кластер, а пользователь B в это время взял и запустил на 3001-м порту собственный. При старте один из серверов mongrel пользователя A обязательно упадет, так как порт, который он собирается прослушивать, уже занят другим процессом. Пользователь A ничего не сможет с этим сделать, ведь он никак не может остановить процесс пользователя B. А тем временем один из трех запросов на сайт пользователя A будет попадать на чужой mongrel, так как фронтенд настроен именно на эти порты. Конечно, обратившись к администрации сервера, пользователь A решит свои проблемы, но осадочек останется&#8230; Есть ли выход? Дать определенному пользователю возможность прослушивать только конкретный список портов средствами современных операционных систем не так-то просто, все это лишь еще раз усложнит общую систему. Хорошим решением было бы слушать не порт, а unix сокет, но mongrel не обладает такой возможностью.Еще один известный метод запуска rails приложений – <a href="http://code.macournoyer.com/thin/">thin</a>. Он разработан с использованием <a href="http://rubyeventmachine.com/">EventMachine</a> и <a href="http://rack.rubyforge.org/">Rack</a>, достаточно хорошо оптимизирован. Это делает его более производительным сервером, чем mongrel. Thin обладает теми же что и mongrel особенностями в вопросах одновременной обработки запросов и кластеризации. В сравнении с mongrel он потребляет меньше памяти, но по-прежнему загружает всю копию rails для каждого экземпляра. Большим и важным для хостеров плюсом thin является то, что он умеет «слушать» unix-сокеты вместо стандартных tcp портов. Это позволяет избежать неприятной проблемы, что была описана в примере для сервера mongrel. Ограничивать права на сокет, по сути являющийся файлом с атрибутами чтения и записи, гораздо проще и удобнее. К тому же работа через unix-сокеты ведется быстрее из-за отсутствия накладных расходов на tcp/ip стэк. Мы по возможности рекомендуем использовать unix-сокеты вместо tcp портов. Это действительно положительно сказывается на скорости работы приложения. В качестве подтверждения &#8212; <a href="http://macournoyer.wordpress.com/2008/01/26/get-intimate-with-your-load-balancer-tonight/">ссылка</a> на некоторые результаты сравнения серверов thin и mongrel с точки зрения производительности.<br />
Настройка и запуск thin не сложнее чем у сервера mongrel, конфигурационный файл по-прежнему представляет из себя YML. Для capistrano так же легко добавить нужный код в deploy.rb, чтобы перезапуск серверов thin происходил автоматически при выкладывании новой версии кода. С thin вместо mongrel хостеру (а значит и пользователям) живется действительно легче. Однако проблема большого потребления памяти все еще остается. Ведь получается, что для каждого проекта независимо от текущего количества запросов будет запущено несколько серверов thin, а каждый из них поместит в память весь код rails и самого приложения.</p>
<h3>Passenger</h3>
<p style="text-align: left;">Попробуем решить проблему с памятью при помощи <a href="http://www.modrails.com/">Phusion Passenger</a>, известного также как mod_rails или mod_rack. Passenger — это модуль для популярных сегодня веб-серверов Apache и Nginx. Он изначально создан для запуска большого количества rails приложений. Passenger грамотно распределяет ресурсы и потребляет память по мере необходимости. Проблем с прослушиванием большого количества портов разными процессами тоже, по понятным причинам, нет. При этом в конфигурационном файле можно указать интерпретатор ruby, который будет использоваться для запуска rails. Это при желании позволит использовать <a href="http://www.rubyenterpriseedition.com/">ruby enterprise edition</a> и выиграть в потреблении памяти еще до 30%. Для пользователя все опять же остается достаточно прозрачно. Для перезагрузки кода приложения теперь нужно просто создать файл tmp/restart.txt или изменить его время последнего доступа. Это легко автоматизируется средствами capistrano. Каждый проект до сих пор имеет возможность использовать свою версию rails, достаточно лишь установить необходимый gem. Passenger устанавливается при помощи rubygems, затем вам нужно будет скомпилировать модуль для вашего веб-сервера и включить его в сборку. По умолчанию код rails будет запускаться с правами пользователя, который владеет файлом environment.rb. Это поведение вполне удобно для хостера, но при желании его можно изменить соответствующими настройками, описанными в документации. Возможность кластеризации при этом остается, просто уже не диктуется необходимостью: ведь никто не мешает поставить несколько веб-серверов, на которых работает passenger за балансирующим прокси.<br />
Phusion Passenger умеет работать не только с rails, но и с любым приложением, которое следует rack-интерфейсу. Это позволяет запускать код, разработанный с использованием фреймворков <a href="http://merbivore.com/">Merb</a>, <a href="http://www.sinatrarb.com/">Sinatra</a> и других rack-приложений. Мы выбрали для себя связку Nginx + Passenger как самую выгодную по производительности и удобству для нас и наших пользователей. Использование модуля Nginx вместо Apache обусловлено нежеланием поддерживать лишнее звено в цепи запуска rails приложений без явной необходимости. Ведь чем проще система, тем удобнее ее поддерживать, а значит и работа будет стабильнее.</p>
<h3>Смотрите также:</h3>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/19drAMpDnxg&amp;hl=ru_RU&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/19drAMpDnxg&amp;hl=ru_RU&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div id="__ss_2337409" style="width: 510px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Антон Веснин - &quot;Обзорное сравнение серверов приложений ruby-on-rails&quot;" href="http://www.slideshare.net/railsclub.russian/rubyonrails-2337409">Презентация &#8212; &#171;Обзорное сравнение серверов приложений ruby-on-rails&#187;</a></div>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/hosting/app_server/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Новогоднее обращение</title>
		<link>http://locum.ru/blog/news/new_year</link>
		<comments>http://locum.ru/blog/news/new_year#comments</comments>
		<pubDate>Mon, 28 Dec 2009 14:20:41 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Компания]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=121</guid>
		<description><![CDATA[Дорогие друзья! Дружная команда Locum поздравляет вас с Новым годом! Уходящий 2009-й год ознаменовался запуском нашего проекта в широкую эксплуатацию. Сегодня, в предновогоднюю пору, уже можно подвести некоторые итоги работы Locum и поделиться планами на будущее. Итак, приступим. За десять месяцев, прошедших со старта проекта, мы исправили более 200 ошибок и учли около 500  пожеланий [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;"><!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 		P.первая-строка-с-отступом { text-indent: 0.5cm } --><span lang="ru-RU"><a href="http://blog.locum.ru/news/new_year"><img class="aligncenter size-full wp-image-126" title="123" src="http://blog.locum.ru/wp-content/uploads/2009/12/123.png" alt="123" width="600" height="300" /></a><br />
</span></p>
<p style="text-align: left;"><span lang="ru-RU">Дорогие друзья!</span> Дружная команда Locum поздравляет вас с Новым годом!<span lang="ru-RU"> </span></p>
<p style="text-align: left;">Уходящий 2009-й год ознаменовался запуском нашего проекта в широкую эксплуатацию. Сегодня, в предновогоднюю пору, уже можно подвести некоторые итоги работы Locum и поделиться планами на будущее. Итак, приступим. <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>За десять месяцев, прошедших со старта проекта, мы исправили более 200 ошибок и учли около 500  пожеланий клиентов.  Мы <span lang="ru-RU">постоянно</span> стремимся обеспечивать  самые высокие скорости работы ваших проектов. Среднее время непрерывной работы наших серверов составило около 50 дней, а их доступность &#8212; 99,56%.</p>
<p>Для вашего удобства мы запланировали и внедрили такие замечательные вещи как возможность размещения Django-проектов, Passenger для обработки Ruby on rails проектов, а также  услугу виртуального <a href="http://locum.ru/public/virtual_servers" target="_blank">выделенного сервера</a> на базе технологии <span lang="en-US">Xen</span>. Кардинальные изменения претерпел дизайн нашего сайта и панели управления, в итоге став более современным и удобным.<br />
<span id="more-121"></span></p>
<p>В новом году мы не собираемся останавливаться на достигнутом и будем радовать вас новыми услугами и специальными предложениями (в планах уже значатся более 150 различных усовершенствований!). В их числе:</p>
<ul>
<li>долгожданная 	поддержка Java-проектов на тарифах 	виртуального хостинга;</li>
<li>легкая 	и быстрая установка популярных 	web-приложений — всего пара минут и вы 	сможете получить работающий блог или 	информационный сайт;</li>
<li>
<p lang="en-US">SMS-<span lang="ru-RU">уведомления пользователей;</span></p>
</li>
<li>
<p lang="ru-RU">работы по улучшению панели инструментов<span lang="en-US">;</span></p>
</li>
<li>специально 	от отдела по работе с клиентами — новая 	партнерская программа.</li>
</ul>
<p style="text-indent: 0cm;">Конечно же, это далеко не все, что мы собираемся внедрить в наступающем году. Ведь политика Locum идти навстречу пожеланиям клиентов, предоставляя сервис самого высокого качества по доступным ценам, остается неизменной. Каждая наша услуга основана прежде всего на стабильных и хорошо оттестированных системных компонентах, что позволяет вам всегда быть уверенными в полной стабильности и качестве предлагаемого продукта.</p>
<p>Накануне праздничных дней хочется сказать теплые слова и пожелания в адрес абсолютно всех наших клиентов! Особенно хочется поблагодарить самых активных посетителей, которые оставляют свои идеи и предложения в системе <a href="http://locum.reformal.ru/">Reformal</a>. Ни одна из этих здравых мыслей не осталась без внимания, а многие из них будут реализованы уже в самом ближайшем будущем. <a href="http://twitter.com/LocumRu" target="_blank">Следите</a> за нашими анонсами <img src="http://locum.ru/blog/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /><br />
Отдельное спасибо также тем, кто публикует о нас <a href="http://hosting101.ru/locum.ru" target="_blank">такие </a><a href="http://hostingsaitov.ru/locum" target="_blank">положительные</a> отзывы. Поверьте, нам очень приятно, что вы так высоко оцениваете нашу работу.</p>
<p style="text-indent: 0cm;">Еще раз с праздником! Здоровья и счастья вам и вашим близким! Пусть сбудутся все самые сокровенные и светлые мечты!</p>
<h3>Locum — лучший дом для ваших интернет-проектов.</h3>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/new_year/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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/news/novosti-razrabotki</link>
		<comments>http://locum.ru/blog/news/novosti-razrabotki#comments</comments>
		<pubDate>Mon, 12 Oct 2009 10:23:11 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=107</guid>
		<description><![CDATA[Кэширование страниц веб-интерфейса Введенное нами частичное кэширование позволило почти на порядок сократить время рендеринга большинства страниц. Теперь навигация по панели управления стала гораздо более плавной. Сейчас кэшируются все меню и статичные элементы, в обозримых планах &#8212; кэширование частых запросов к базе данных. Запуск memcached Для удобства наших пользователей мы запустили memcached на стандартном порту 11211. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong><a href="http://blog.locum.ru/news/107"><img class="alignleft size-full wp-image-109" title="Fotolia_6109351_S" src="http://blog.locum.ru/wp-content/uploads/2009/10/Fotolia_6109351_S.png" alt="Fotolia_6109351_S" width="600" height="301" /></a><br />
Кэширование страниц веб-интерфейса</strong></p>
<p>Введенное нами частичное кэширование позволило почти на порядок сократить время рендеринга большинства страниц. Теперь навигация по панели управления стала гораздо более плавной. Сейчас кэшируются все меню и статичные элементы, в обозримых планах &#8212; кэширование частых запросов к базе данных.</p>
<p><strong>Запуск memcached</strong></p>
<p>Для удобства наших пользователей мы запустили <a title="memcached" href="http://ru.wikipedia.org/wiki/Memcached">memcached</a> на стандартном порту 11211. К сожалению, формат шаред-хостинга не позволяет обеспечить раздельное использование этого сервиса, а сам memcached не обладает средствами аутентификации. Поэтому напоминаем, что все данные, помещенные нашими клиентами в memcaced, могут быть потенциально доступны и другим клиентам, чьи проекты размещены на том же сервере. Также, во избежание проблем с конфликтами имен ключей, необходимо использовать имена вида: &#171;логин-пользователя_имя-ключа&#187;. Конечно, безопасность такого решения невелика, но при осторожном использовании можно добиваться хорошей оптимизации производительности.</p>
<p><strong>Обновление интерфейса привязки и регистрации домена</strong></p>
<p>Теперь каждый клиент решает сам: создавать ли DNS зону в нашем домене для привязываемого или регистрируемого домена. Такая мера значительно упрощает определение правильной конфигурации DNS для не принадлежащих доменов.</p>
<p><strong>Оптимизация проверки электронных платежей</strong></p>
<p>Мы внедрили новый способ проверки статуса электронных платежей. В результате время поступления информации об оплате сократилось до 2-3 минут.</p>
<p><strong>Новый интерфейс заказа доменов</strong></p>
<p>Обновленный интерфейс заказа доменов теперь позволяет системе самой проверять доступность доменного имени во всех обслуживаемых нами зонах.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/novosti-razrabotki/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>Изменения в настройках PHP</title>
		<link>http://locum.ru/blog/news/izmeniya-v-nastrojkax-php</link>
		<comments>http://locum.ru/blog/news/izmeniya-v-nastrojkax-php#comments</comments>
		<pubDate>Fri, 14 Aug 2009 06:10:40 +0000</pubDate>
		<dc:creator><![CDATA[Смирнов Роман]]></dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://blog.locum.ru/?p=68</guid>
		<description><![CDATA[Уважаемые клиенты! С 17 августа на всех наших серверах изменится  глобальная настройка PHP: опция magic_quotes_gpc будет установлена в значении off, как это рекомендовано разработчиками PHP (начиная с версии 6 эта настройка не будет поддерживаться).  Если ваши проекты используют эту настройку, пожалуйста, экранируйте специальные символы вручную, как это рекомендуют разработчики.]]></description>
				<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-70" title="Superблог Locum: magic_quotes_gps is off" src="http://blog.locum.ru/wp-content/uploads/2009/08/off.png" alt="Superблог Locum: magic_quotes_gps is off" width="589" height="154" /></p>
<p><strong>Уважаемые клиенты!</strong></p>
<p>С 17 августа на всех <a href="http://locum.ru" target="_self">наших серверах</a> изменится  глобальная настройка PHP: опция <em>magic_quotes_gpc</em> будет установлена в значении <strong>off</strong>, как это рекомендовано разработчиками PHP (начиная с версии 6 эта настройка не будет поддерживаться).  Если ваши проекты используют эту настройку, пожалуйста, экранируйте специальные символы вручную, как это рекомендуют разработчики.</p>
]]></content:encoded>
			<wfw:commentRss>http://locum.ru/blog/news/izmeniya-v-nastrojkax-php/feed</wfw:commentRss>
		<slash:comments>0</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>
