<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Мастерская интернет-разработчика</title>
	
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Thu, 11 Mar 2010 10:53:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/adw0rd" /><feedburner:info uri="adw0rd" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>MySQL. Остановка выполнения sql-запроса через триггер</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/HiirrvLHmNc/</link>
		<comments>http://adw0rd.ru/2010/mysql-stop-trigger/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 12:43:43 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Триггеры]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5203</guid>
		<description><![CDATA[
Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер.
Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера.
Задача была такая, что у кастомеров есть [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/mysql-stop-trigger/"><img src="http://adw0rd.ru/wp-content/uploads/2009/05/mysql-logo.png"  alt="" title="mysql-logo" width="150" height="76" class="alignright size-full wp-image-2595" /></a></noindex></p>
<p>Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер.<br />
Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера.</p>
<p>Задача была такая, что у кастомеров есть статусы, но если новый статус (который устанавливается) меньше чем текущий, то надо приостановить такой запрос.<br />
Городить проверки на стороне скриптового языка не хотелось, ибо это поведение должно быть глобальным, да и переписывать чудо-код доставшийся мне по наследству совсем не хотелось.</p>
<p>Ну это все слова, а теперь покажу реализацию:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">delimiter <span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`customers_update_status`</span><span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #ff0000;">`customers_update_status`</span> BEFORE <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">FOR</span> EACH ROW BEGIN<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> new<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">&lt;</span> old<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> THEN<br />
&nbsp; &nbsp; &nbsp; &nbsp; BEGIN<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">SET</span> old<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;STOP_SQL_QUERY&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; END;<br />
&nbsp; &nbsp; END <span style="color: #993333; font-weight: bold;">IF</span>;<br />
END<span style="color: #66cc66;">//</span><br />
delimiter ;</div></div>
<p>Поле <strong>status</strong> имеет тип <strong>ENUM</strong> и у него нет значения <strong>STOP_SQL_QUERY</strong>, поэтому происходит ошибка и <strong>SQL</strong>-запрос идущий за триггером не выполняется. Это не корректное, но единственное найденное мной решение. Вообще, наверное еще лучше чтобы был не INSERT, а UPDATE. Тогда будет ошибка более корректна с виду.</p>
<p>зы. Кстати на <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html" >официальной страничке CREATE TRIGGER</a></noindex> в камментах приводится именно такой способ по остановке выполнения sql-запроса.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mysql-stop-trigger/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/mysql-stop-trigger/</feedburner:origLink></item>
		<item>
		<title>Ставим Ubuntu Netbook Remix на Sony Vaio VPCW12Z1R</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/_sQfEkquGbc/</link>
		<comments>http://adw0rd.ru/2010/unr-vaio/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 18:29:08 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Vaio]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5205</guid>
		<description><![CDATA[
В общем попросили меня описать процесс установки UNR на мой нетбук. Вообще тут все описано, но есть одна деталь, без знания которой я изрядно попарился. Дело в том, что при установке убунты, мой нетбук (да и мой лептоп тоже) впадали в черный экран и ничего не происходило. На лептопе дела были получше, там я хотя [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/unr-vaio/"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ubuntulogomini.png"  alt="" title="ubuntu-logo" width="225" height="59" class="alignright size-full wp-image-5249" style="padding:20px" /></a></noindex></p>
<p>В общем попросили меня описать процесс установки UNR на мой нетбук. Вообще <noindex><a rel="nofollow" href="https://help.ubuntu.com/community/Installation/FromUSBStick" >тут все описано</a></noindex>, но есть одна деталь, без знания которой я изрядно попарился. Дело в том, что при установке убунты, мой нетбук (да и мой лептоп тоже) <strong>впадали в черный экран</strong> и ничего не происходило. На лептопе дела были получше, там я хотя бы увидел на каком этапе зависло:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">... can not mount /dev/loop1 on /cow ...</div></div>
<p>Погуглив я наткнулся на тему <noindex><a rel="nofollow" href="http://ubuntuforums.org/showthread.php?t=1306277" >Install gives sorta blank screen on netbook</a></noindex> и конкретно 9-й пост мне помог решить проблему с черным экраном. Ну теперь я все расскажу по порядку...<br />
<span id="more-5205"></span></p>
<h3>Сборка usb-образа</h3>
<p>Так как в комплекте шла <strong>Windows 7 Starter</strong>, то создание загрузочного usb и прочие приготовления будут происходить под этой ОС. А после переместимся уже в <strong>UNR</strong> и доустановим убунту.</p>
<blockquote class="info">
<p>
Если вам надо забэкапиться или отредактировать разделы, то могу посетовать &laquo;Hiren&#39;s Boot CD&raquo;, но так как у нас не CD, а USB, то читаем как <noindex><a rel="nofollow" href="http://www.hiren.info/pages/bootcd-on-usb-disk" >сделать usb-версию</a></noindex>. А свеженький дистрибутив можете взять тут <noindex><a rel="nofollow" href="http://www.hirensbootcd.net/" >http://www.hirensbootcd.net/</a></noindex>.
</p>
</blockquote>
<p>Заходим на сайт <noindex><a rel="nofollow" href="http://www.ubuntu.com/GetUbuntu/download-netbook" >http://www.ubuntu.com/GetUbuntu/download-netbook</a></noindex> и качаем <strong>ubuntu-9.10-netbook-remix-i386.iso</strong>, после этого открываем любым архиватором iso-файл (я использовал 7zip) и распаковываем оттуда программку &laquo;usb-creator.exe&raquo;.</p>
<p>Размер флэшки должен быть не меньше 700 МБ и должна быть предварительно отформатирована.</p>
<p>Запускаем <strong>usb-creator</strong>, в первой плашке жмем на &laquo;Other&raquo; [1] и подгружаем наш iso-образ, во второй плашке выбираем носитель [2], далее выбираем &laquo;discarded on shutdown, unlessyou save them elsewhere&raquo; [3] и жмем &laquo;Make startup disk&raquo; [4].</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/usb-creator.jpg" alt="" title="usb-creator" width="376" height="426" class="alignnone size-full wp-image-5258" /></p>
<p>Все, образ создан, приступим к установке!</p>
<h3>Установка</h3>
<p>Вставляем нашу флешку в usb, перегружаем ноутбук, заходим в BIOS (при загрузке&nbsp;&mdash; F2) и выбираем &laquo;загрузка с flash drive&raquo;. Сохраняем настройки и выходим из BIOSа.</p>
<p>Теперь, если все хорошо вы увидите загрузочное меню убунты. Можете ее запустить с флешки, либо приступить к установке, либо еще несколько опций: проверка целостности дистрибутива, памяти компьютера и т.д.</p>
<p>Выбираете соответствующий пункт и переходим к установке. Там вам понадобится создать свой аккаунт. указать свое местоположение и локаль, думаю с этим справитесь. В конце установки вас попросят выделить место на жестком диске для вашей убунты (Prepare disk space), этот шаг тоже достаточно прост и убунта корректно выделит на жестком диске тот кусок памяти, который вы укажите. Я выделил 50 Гб.</p>
<blockquote class="info">
<p>Можно также воспользоваться утилитами с <strong>Hiren&#39;s Boot CD</strong> для разметки жесткого диска.</p>
</blockquote>
<p>На этом установка закончится. Кстати, после перезагрузки <strong>grub</strong> удачно подцепил раздел с Windows 7, что несомненно радует, такого от FreeBSD я не смог добиться.</p>
<h3>Запуск</h3>
<p>Себе я ставил чисто английскую версию, и только добавил раскладку русскую после установки, поэтому интерфейс у меня выглядит так:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/fav.jpg" alt="" title="my unr" width="683" height="384" class="alignnone size-full wp-image-5266" /></p>
<p>Вот еще один скриншот, Firefox:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ff.jpg" alt="" title="firefox" width="683" height="384" class="alignnone size-full wp-image-5277" /></p>
<p>После установки рекомендую обновить систему и ядро в частности, для этого запустите утилиту &laquo;System > Update Manager&raquo; (Когда зайдете во вкладку System прокрутите скрол вниз).</p>
<p>Вроде как и все. Особых проблем кроме записи usb-образа не было.</p>
<h3>Ощущения</h3>
<p>Вообще мне почти все понравилось! Все устройства заработали нормально. А интерфейс больше всего радует, как раз для нетбуков. Но мне не понравилось например как он переходит в спящий/ждущий режимы (hibernate/suspend), это как-то криво: просто все зависает и через какое-то время переходит в соответствующий режим. А до этого сидишь как дурак и вдупляешь что случилось. Могли бы хоть делать черный фон и писать что осуществляется переход, а еще лучше каждое состояние перехода.</p>
<p>И еще заметил баг: ноутбук заряжался, и зарядился полностью, после чего я его погрузил в спящий режим и вынул шнур питания. Позже я его включил без сети и поработал на нем 4 часа, но убунта мне все это время говорила что батарея полностью заряжена. Но я как-то ей не поверил... либо у меня супер-ноутбук питающийся биотоками ;)</p>
<p>зы. Ощущения от UNR Сергея Можайского&nbsp;&mdash; <noindex><a rel="nofollow" href="http://frenzytechnix.livejournal.com/22541.html" >Нетбук, Ubuntu Netbook Remix и мой линукс-экспириенс</a></noindex> (автор любимого мной freebsd-дистрибутива <noindex><a rel="nofollow" href="http://frenzy.org.ua/" >frenzy</a></noindex>)</p>
<p>upd: Если у вас глючит интерфейс скайпа, то есть у него в контексном меню один цвет как у фона, так и у текста. То вам надо зайти в &laquo;Skype > Options&raquo; и в &laquo;Choose style&raquo; выбрать &laquo;GTK+&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/unr-vaio/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/unr-vaio/</feedburner:origLink></item>
		<item>
		<title>Прикупил себе мини-ноутбук Vaio</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/5_KPKvXww5k/</link>
		<comments>http://adw0rd.ru/2010/mini-vaio/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:56:15 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>
		<category><![CDATA[Vaio]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5201</guid>
		<description><![CDATA[Купил себе Sony VAIO VPC-W12Z1R, заказывал &#171;белый&#187; (w), а продали &#171;белоснежный&#187; (wz). Но мне понравился больше белоснежный, поэтому я даже не спросил почему такая фигня. Покупал в смартшопе, на 6 тысяч дешевле ($200) чем в кее, проблем с покупкой не было&#160;&#8212; вообщем магазин рекомендую.
Что касается самого нетбука, то он по словам сони на самом деле [...]]]></description>
			<content:encoded><![CDATA[<p>Купил себе <noindex><a rel="nofollow" href="http://market.yandex.ru/model.xml?hid=91013&#038;modelid=5145816" >Sony VAIO VPC-W12Z1R</a></noindex>, заказывал &laquo;белый&raquo; (w), а продали &laquo;белоснежный&raquo; (wz). Но мне понравился больше белоснежный, поэтому я даже не спросил почему такая фигня. Покупал в <noindex><a rel="nofollow" href="http://www.smartshop.spb.ru/sony-vaio-vpcw12z1rw-n280-white-p-14733.html" >смартшопе</a></noindex>, <strong>на 6 тысяч дешевле</strong> ($200) чем в <noindex><a rel="nofollow" href="http://shop.key.ru/shop/goods/28964/" >кее</a></noindex>, проблем с покупкой не было&nbsp;&mdash; вообщем магазин рекомендую.</p>
<p>Что касается самого нетбука, то он по словам сони на самом деле не нетбук, а мини-ноутбук. Типа нет у них нетбуков и не будет. На самом деле это очень качественный, стильный и дорогой нетбук :)</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/17022010631_1.jpg" alt="" title="фронт" width="405" height="540" class="alignnone size-full wp-image-5211" /></p>
<p>Программировать на нем не особо удобно, но думаю привыкну.<br />
Зато писать в бложик, сидеть в консоле и читать интернеты&nbsp;&mdash; самое то.<br />
<span id="more-5201"></span><br />
<img src="http://adw0rd.ru/wp-content/uploads/2010/02/17022010636_1.jpg" alt="" title="бэк" width="614" height="500" class="alignnone size-full wp-image-5212" /></p>
<p>Еще в комплекте шли чехол и мышь от вайо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mini-vaio/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/mini-vaio/</feedburner:origLink></item>
		<item>
		<title>FreeBSD. Svnserve — запуск Subversion без Apache!</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/MC5oEm5J-bo/</link>
		<comments>http://adw0rd.ru/2010/svnserve/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 23:04:57 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[Svnserve]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5159</guid>
		<description><![CDATA[
В продолжении темы перехода с Apache, сегодня расскажу о простом запуске Subversion без Apache. Для этого мы используем svnserver. Настройка достаточно проста, и так перейдем к делу!
После установки Subversion, у вас должен появится svnserve, проверить можно так:
# svnserve --version
svnserve, version 1.6.4 &#40;r38063&#41;
&#160; &#160;compiled Aug 25 2009, 15:27:23
Если вы только что установили Subversion, то не забудьте [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/svnserve/"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/subversion-mini.png"  alt="" title="subversion-mini" width="278" height="39" style="padding:10px" class="alignright size-full wp-image-5197" /></a></noindex></p>
<p>В продолжении темы перехода с Apache, сегодня расскажу о простом запуске <strong>Subversion без Apache</strong>. Для этого мы используем <strong>svnserver</strong>. Настройка достаточно проста, и так перейдем к делу!</p>
<p>После установки Subversion, у вас должен появится <strong>svnserve</strong>, проверить можно так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># svnserve --version</span><br />
<span style="color: #c20cb9; font-weight: bold;">svnserve</span>, version 1.6.4 <span style="color: #7a0874; font-weight: bold;">&#40;</span>r38063<span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; &nbsp;compiled Aug <span style="color: #000000;">25</span> <span style="color: #000000;">2009</span>, <span style="color: #000000;">15</span>:<span style="color: #000000;">27</span>:<span style="color: #000000;">23</span></div></div>
<p>Если вы только что установили <strong>Subversion</strong>, то не забудьте выполнить &laquo;rehash&raquo;.<br />
<span id="more-5159"></span></p>
<h3>Настройка</h3>
<p><em>Во-первых</em>, теперь надо настройки производить для каждого репозитория свои, ибо у каждого репозитория свой svnserve.conf. Но у меня раньше были общие конфиги для всех реп, и я уже в правах разруливал какие группы имеют права на определенную репу, а какие нет. Поэтому писать одно и тоже для каждой репы мне не хотелось и я решил сделать один файл <strong>svnserve.conf</strong>, а в остальных репах <strong>сделать символическую ссылку</strong> на него, тем самым надо будет <strong>менять настройки только в одном месте</strong>.</p>
<blockquote>
<p>
/var/svn/repos/&nbsp;&mdash; каталог репозиториев<br />
/var/svn/repos/adw0rd/&nbsp;&mdash; один из репозиториев<br />
/var/svn/repos/example/&nbsp;&mdash; другой репозиторий<br />
/var/svn/repos/adw0rd/conf/svnserve.conf&nbsp;&mdash; конфиг конкретного репозитория
</p>
</blockquote>
<p>Перемещаем конфигурационный файл:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>adw0rd<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>svnserve.conf <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>Делаем ссылки:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>svnserve.conf <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>adw0rd<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>svnserve.conf<br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>svnserve.conf <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>example<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>svnserve.conf</div></div>
<p>И отредактируем файл <strong>/var/svn/svnserve.conf</strong>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[general]<br />
# анонимам доступа нет<br />
anon-access = none<br />
# нужна авторизация для просмотра/записи<br />
auth-access = write<br />
# путь до файла с паролями<br />
password-db = /var/svn/svn-passwd<br />
# путь до файла группы/права<br />
authz-db = /var/svn/svn-authz-access<br />
# realm = My First Repository</div></div>
<p><em>Во-вторых</em>, у меня было два файла:</p>
<ul>
<li>Файл с аккаунтами (логин/пароль), <a href="/2009/freebsd-subversion/">созданный с помощью htpasswd</a></li>
<li>Файл с <a href="/2009/svn-authz-access/">группами и правами</a> для аккаунтов</li>
</ul>
<p>Но теперь только можно использовать второй (группы/права), он остался корректен.<br />
А для первого файла поменялся формат, теперь там права хранятся в открытом виде и имеют формат:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[users]<br />
sally = sally_secret<br />
adw0rd = adw0rd_password</div></div>
<p>Отредактируйте <strong>/var/svn/svn-passwd</strong> и добавьте туда свои аккаунты.</p>
<p>С правами файл у нас расположен в <strong>/var/svn/svn-authz-access</strong> и имеет вид:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[groups]<br />
dev1 = adw0rd, vasac<br />
dev2 = sally<br />
<br />
[/]<br />
@dev1 = r<br />
@dev2 = r <br />
* =<br />
<br />
[adw0rd:/]<br />
@dev1 = rw<br />
* =<br />
<br />
[example:/]<br />
@dev1 = rw<br />
@dev2 = rw<br />
* =</div></div>
<h3>Запуск</h3>
<p>Отредактируйте файл <strong>/usr/local/etc/rc.d/svnserve</strong>, и укажите свои параметры если это необходимо. Также можете поменять пользователя/группу от кого будет работать svnserve. Если у вас нет это файла, то можете его взять <a href="/files/svnserve">здесь</a>.</p>
<p>Запускаем сервер:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/usr/local/etc/rc.d/svnserve start</div></div>
<p>И не забудьте добавить в /etc/rc.conf</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">svnserve_enable=&quot;YES&quot;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/svnserve/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/svnserve/</feedburner:origLink></item>
		<item>
		<title>Яндекс.Фотки 2.0.1 — багфикс</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/jsuUIC6u6Tg/</link>
		<comments>http://adw0rd.ru/2010/yandex-fotki-201/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 21:28:16 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Wordpress и плагины]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Яндекс]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5146</guid>
		<description><![CDATA[Все уже давным-давно просят поправить плагин. Ну вот, наконец это свершилось и теперь его поддерживает Wordpress 2.9.1. Также поменялось меню в админке, теперь единый раздел, а не два как было раньше.


Скачать плагин: Яндекс.Фотки 2.0.1


Возможно в скором времени добавлю кеширование.
И подскажите какой-нибудь кроссбраузерный лайтбокс скрипт?
]]></description>
			<content:encoded><![CDATA[<p>Все уже давным-давно <a href="/2009/yandex-fotki-2/#comments">просят поправить плагин</a>. Ну вот, наконец это свершилось и теперь его поддерживает <strong>Wordpress 2.9.1</strong>. Также поменялось меню в админке, теперь единый раздел, а не два как было раньше.</p>
<blockquote class="download">
<p>
Скачать плагин: <a href="http://adw0rd.ru/files/yandex-fotki-201.zip" >Яндекс.Фотки 2.0.1</a>
</p>
</blockquote>
<p>Возможно в скором времени добавлю кеширование.<br />
И подскажите какой-нибудь кроссбраузерный лайтбокс скрипт?</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/yandex-fotki-201/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/yandex-fotki-201/</feedburner:origLink></item>
		<item>
		<title>Перенос Trac на Nginx и tracd</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/2TnxkZF6mvU/</link>
		<comments>http://adw0rd.ru/2010/trac-nginx-and-tracd/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 12:38:59 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Trac]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5059</guid>
		<description><![CDATA[
Я когда-то написал статью Установка и настройка Trac на FreeBSD, теперь пришло время отказываться от Apache, в пользу Nginx+PHP/FastCGI и необходимо куда-то пересаживать Trac.
Есть несколько способов помимо mod_python, я выбрал использование tracd (веб-сервер самого трака). Но если в какой-то момент времени я пойму что этот способ мне не нравится, я обязательно напишу статью про связку [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/2010/trac-nginx-and-tracd/"><img src="/wp-content/uploads/2010/02/trac_nginx.jpg" alt="" title="trac_nginx" width="191" height="110" class="alignright size-full wp-image-5120" /></a></p>
<p>Я когда-то написал статью <a href="/2009/trac-freebsd/">Установка и настройка Trac на FreeBSD</a>, теперь пришло время отказываться от <strong>Apache</strong>, в пользу <strong>Nginx+PHP/FastCGI</strong> и необходимо куда-то пересаживать <strong>Trac</strong>.</p>
<p>Есть несколько способов помимо <strong>mod_python</strong>, я выбрал использование <strong>tracd</strong> (веб-сервер самого трака). Но если в какой-то момент времени я пойму что этот способ мне не нравится, я обязательно напишу статью про связку через <strong>FastCGI</strong>.</p>
<h3>Tracd</h3>
<p>Поднимаем tracd так:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">tracd --daemonize --pidfile=/var/run/trac/tracd.3050 --port=3050 --protocol=http --env-parent-dir=/var/trac \<br />
&nbsp; &nbsp; --basic-auth=project1,/var/svn/svn-auth-file,svn --basic-auth=project2,/var/svn/svn-auth-file,svn</div></div>
<p>Где,</p>
<ul>
<li>--daemonize&nbsp;&mdash; запуск tracd в фоне как демона;</li>
<li>--pidfile&nbsp;&mdash; путь до pid-файла;</li>
<li>--port&nbsp;&mdash; tcp-порт, который будет слушать;</li>
<li>--protocol&nbsp;&mdash; протокол (Варианты: http, scgi, ajp. В нашем случае http);</li>
<li>--env-parent-dir&nbsp;&mdash; мульти-проектовый режим, надо указать родительский каталог проектов (Еще есть &laquo;--single-env&raquo;, это сингл-режим и надо указывать полный путь до проекта);</li>
<li>--basic-auth&nbsp;&mdash; авторизация (Формат &laquo;projectdir,htpasswd_file,realm&raquo;, если юзаете --env-parent-dir, то можете только каталог проекта указывать в &laquo;projectdir&raquo;, а не полный путь).</li>
</ul>
<p>Наберите &laquo;--help&raquo; и почитайте справку по всем опциям.</p>
<h3>Nginx</h3>
<p>Теперь добавим в Nginx новый бекенд:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">upstream trac {<br />
&nbsp; &nbsp; server 127.0.0.1:3050;<br />
}</div></div>
<p>И перепишем конфиг хоста:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name trac.example.com;<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; #auth_basic &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;Password, please!&quot;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; #auth_basic_user_file &nbsp;/var/svn/svn-auth-file;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass &nbsp; &nbsp; &nbsp;http://trac;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Ну вот и все, осталось ребутнуть nginx</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/usr/local/etc.rc.d/nginx restart</div></div>
<p><span id="more-5059"></span></p>
<h3>Скрипт управления нашим траком</h3>
<p>Ну в довесок сделаем скрипт по управлению tracd:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/bin/sh<br />
TRACD=&quot;/usr/local/bin/tracd&quot;<br />
TRAC=&quot;/var/trac&quot;<br />
USER=&quot;www&quot;<br />
PIDFILE=&quot;/var/run/trac/tracd.3050&quot;<br />
PORT=&quot;3050&quot;<br />
PYTHON_EGG_CACHE=&quot;/tmp/egg_cache&quot;<br />
<br />
start()<br />
{<br />
&nbsp; &nbsp; export PYTHON_EGG_CACHE<br />
&nbsp; &nbsp; su $USER -c &quot;$TRACD --daemonize --pidfile=$PIDFILE --port=$PORT --protocol=http --env-parent-dir=$TRAC \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --basic-auth=project1,/var/svn/svn-auth-file,svn --basic-auth=project2,/var/svn/svn-auth-file,svn&quot;<br />
}<br />
<br />
stop()<br />
{<br />
&nbsp; &nbsp; kill `cat $PIDFILE`<br />
}<br />
<br />
restart()<br />
{<br />
&nbsp; &nbsp; stop<br />
&nbsp; &nbsp; sleep 1<br />
&nbsp; &nbsp; start<br />
}<br />
<br />
$1</div></div>
<p>Так как мы будем запускать от имени www, то нам надо для каталога /var/run/trac/ указать права на запись.<br />
Сохраним скрипт в файле &laquo;/usr/local/etc/rc.d/tracd&raquo; и запустим:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/usr/local/etc/rc.d/tracd start</div></div>
<blockquote class="info">
<p>
Если вы увидели ошибку &laquo;This account is currently not available.&raquo;, то вам надо для пользователя от которого вы запускаете tracd установить шелл. Делается через</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chsh</span> имя_пользователя</div></div>
</blockquote>
<h4>Можете почитать еще</h4>
<ul>
<li><noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracNginxRecipe" >http://trac.edgewall.org/wiki/TracNginxRecipe</a></noindex></li>
<li><a href="/2010/nginx-and-php-fpm/">Nginx. Использование PHP в режиме FastCGI с помощью php-fpm</a></li>
<li><a href="/2009/nginx-and-apache-install/">Nginx и Apache2. Установка и быстрая настройка!</a></li>
<li><a href="/2009/trac-freebsd/">Установка и настройка Trac на FreeBSD</a></li>
<li><a href="/2009/freebsd-subversion/">FreeBSD. Установка и настройка Subversion</a></li>
<li><a href="/2009/subversion-hooks/">Subversion. Автоматическое обновление проекта при помощи хуков</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/trac-nginx-and-tracd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/trac-nginx-and-tracd/</feedburner:origLink></item>
		<item>
		<title>Установка node.js на FreeBSD и использование под Nginx</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/RVXZlJM-eZ4/</link>
		<comments>http://adw0rd.ru/2010/nodejs-freebsd/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 14:55:17 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4980</guid>
		<description><![CDATA[
Случайно нашел сайт nodejs.ru, полистал и добавил в ридер. Давно хотел попробовать node.js, но именно этот сайт стал той самой последней каплей в чаше желания и я решил незамедлительно попробовать node.js в действии.
Установка
Заходим на оф. сайт node.js и копируем ссылку на архив с сорцами.
# cd /tmp
# fetch http://s3.amazonaws.com/four.livejournal/20100120/node-v0.1.26.tar.gz
# tar -xzvf node-v0.1.26.tar.gz
# cd node-v0.1.26 
# ./configure [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2010/nodejs-freebsd/nodejs/"  rel="attachment wp-att-4988"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/nodejs.jpg" alt="" title="nodejs" width="239" height="81" class="alignright size-full wp-image-4988" /></a></p>
<p>Случайно нашел сайт <noindex><a rel="nofollow" href="http://nodejs.ru" >nodejs.ru</a></noindex>, полистал и добавил в ридер. Давно хотел попробовать node.js, но именно этот сайт стал той самой последней каплей в чаше желания и я решил незамедлительно попробовать node.js в действии.</p>
<h3>Установка</h3>
<p>Заходим на оф. сайт <noindex><a rel="nofollow" href="http://nodejs.org/" >node.js</a></noindex> и копируем ссылку на архив с сорцами.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /tmp</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://s3.amazonaws.com/four.livejournal/20100120/node-v0.1.26.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzvf node-v0.1.26.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># cd node-v0.1.26 </span><br />
<span style="color: #666666; font-style: italic;"># ./configure --prefix=/usr/local</span><br />
<span style="color: #666666; font-style: italic;"># make &amp;&amp; make install</span><br />
<span style="color: #666666; font-style: italic;"># rehash</span></div></div>
<p>Если у вас не установлен <strong>libexecinfo</strong>, то:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/devel/libexecinfo</span><br />
<span style="color: #666666; font-style: italic;"># make install</span></div></div>
<h3>Использование</h3>
<p>Потестим для начала сам node, для этого создайте файлик example.js со следующим содержимым:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> sys <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'sys'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
sys.<span style="color: #660066;">puts</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello, people!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>И запустите этот файлик:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># node example.js</span></div></div>
<p>Если нет ошибок, то можете продолжить и завязать node с nginx. А если есть ошибки&nbsp;&mdash; пишите в комментарии, помогу.<br />
<span id="more-4980"></span></p>
<h3>Использование с Nginx</h3>
<p>Думаю у вас уже стоит Nginx, поэтому привожу сразу конфиг для нашего node.js хоста.<br />
А если Nginx у вас НЕ установлен/настроен, то <a href="/tag/nginx/">вам сюда</a>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
location /nodejs/ {<br />
&nbsp; &nbsp; proxy_pass http://127.0.0.1:8081/;<br />
&nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
}<br />
...</div></div>
<p>Далее, создадим скрипт server.js со следующим содержимым:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var sys = require('sys');<br />
var http = require('http');<br />
<br />
http.createServer(function (req, res) {<br />
&nbsp; &nbsp; res.sendHeader(200, {'Content-Type': 'text/plain'});<br />
&nbsp; &nbsp; res.sendBody('Hello, people!', 'utf8');<br />
&nbsp; &nbsp; res.finish();<br />
}).listen(8081);<br />
<br />
sys.puts('Server running at port 8081');</div></div>
<p>Ну а теперь запустим сам бекенд и рестартанем nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># node server.js</span><br />
<span style="color: #666666; font-style: italic;"># /usr/local/etc/rc.d/nginx restart</span></div></div>
<p>Если вы запустите с ключом --debug, то вам станет доступен дебагер на tcp-порту 5858</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#node --debug server.js</span></div></div>
<p>Заходим на http://localhost:8081/ и наблюдаем за результатом!</p>
<h3>Резюме</h3>
<p>Это вступительная статья, в ней ничего нет сложного. но чтобы опробовать node.js тут достаточно информации.<br />
То, с чем я советую ознакомиться:</p>
<ul>
<li>Посмотрите реализацию серверного компонента <noindex><a rel="nofollow" href="http://chat.nodejs.org/" >чата</a></noindex> на node.js <noindex><a rel="nofollow" href="http://github.com/ry/node_chat/blob/master/server.js" >http://github.com/ry/node_chat/blob/master/server.js</a></noindex></li>
<li>Можно еще посмотреть бенчмарки <noindex><a rel="nofollow" href="http://four.livejournal.com/1019177.html" >http://four.livejournal.com/1019177.html</a></noindex></li>
<li>И почитать интересную статью <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/82511/" >Nginx + серверный Javascript</a></noindex></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/nodejs-freebsd/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/nodejs-freebsd/</feedburner:origLink></item>
		<item>
		<title>Nginx. Использование PHP в режиме FastCGI с помощью php-fpm</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/x6pdvoYDCuE/</link>
		<comments>http://adw0rd.ru/2010/nginx-and-php-fpm/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 12:30:27 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php-fpm]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3378</guid>
		<description><![CDATA[
У меня стоял Apache 2.2 и mod_php, так как Apache жрет не мало ресурсов, я решил постепенно переводить проекты на сервере на связку Nginx + PHP-FastCGI, а в качестве спаунера php-fpm.
Вкратце, что такое FastCGI и почему он лучше чем mod_php?


FastCGI это высокопроизводительный и масштабируемый интерфейс для взаимодействия web-сервера и приложений, дальнейшее развитие технологии CGI. Ознакомиться [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/nginx-and-php-fpm/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/php-fastcgi.png" alt="php-fastcgi" title="php-fastcgi" width="150" height="80" class="alignright size-full wp-image-4631" /></a></p>
<p>У меня стоял <strong>Apache 2.2 и mod_php</strong>, так как <strong>Apache</strong> жрет не мало ресурсов, я решил постепенно переводить проекты на сервере на связку <strong>Nginx + PHP-FastCGI</strong>, а в качестве спаунера <strong>php-fpm</strong>.</p>
<h4>Вкратце, что такое FastCGI и почему он лучше чем mod_php?</h4>
<blockquote>
<p>
<strong>FastCGI</strong> это высокопроизводительный и масштабируемый интерфейс для взаимодействия web-сервера и приложений, дальнейшее развитие технологии <strong>CGI</strong>. Ознакомиться с более подробной информацией о FastCGI вы можете на <noindex><a rel="nofollow" href="http://www.fastcgi.com/" >официальном сайте</a></noindex> или в <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/FastCGI" >Википедии</a></noindex>.</p>
<p>Основное преимущество <strong>FastCGI</strong> в изолировании динамического языка от web-сервера. Например, запуск <strong>FastCGI</strong> процесса под пользователем, отличным от пользователя web-сервера, а также процесс может находиться в chroot&#39;е, отличном от chroot&#39;а web-сервера. Помимо всего прочего, эта технология позволяет запускать web-сервера и <strong>CGI</strong> процессы (теже php скрипты) на различных хостах, что улучшает масштабируемость и также способствует безопасности без существенной потери в производительности.
</p>
</blockquote>
<h4>Ну а зачем нам php-fpm, если PHP и так поддерживает работу в режиме FastCGI?</h4>
<blockquote>
<p>
<strong>php-fpm</strong>&nbsp;&mdash; это патч для PHP, для использования PHP как FastCGI процесса в высоконагруженных системах. Устраняет ряд проблем мешающих использовать PHP в режиме FastCGI. Андрей Нигматулин представил набор патчей php-fpm к PHP 4/5, устраняющих ряд проблем, которые мешают использовать PHP в режиме FastCGI на высоконагруженных системах.</p>
<p><strong>Возможности php-fpm:</strong></p>
<p>    * Управление процессами. Возможность &laquo;плавно&raquo; останавливать и перезапускать php воркеры без потери запросов. Возможность плавно обновлять конфигурацию и binary без потери запросов;<br />
    * Ограничение ip адресов, с которых могут приходить запросы от web сервера;<br />
    * Динамическое количество процессов, в зависимости от нагрузки (TODO);<br />
    * Запуск воркеров с разными uid/gid/chroot/environment и разными php.ini опциями;<br />
    * Логирование stdout &#038; stderr рабочих процессов;<br />
    * Аварийный перезапуск всех процессов при случайном разрушении shared memory opcode cache, если используется акселератор;<br />
    * Принудительное завершение подвисших процессов, если set_time_limit () не срабатывает (TODO); </p>
<p><noindex><a rel="nofollow" href="http://php-fpm.org/wiki/What_is_PHP-FPM" >http://php-fpm.org/wiki/What_is_PHP-FPM</a></noindex></p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6443121&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=6443121&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><noindex><a rel="nofollow" href="http://vimeo.com/6443121" >Андрей Нигматулин / php-fpm / PHPConf 08</a></noindex> from <noindex><a rel="nofollow" href="http://vimeo.com/user2260956" >Mihail Andreev</a></noindex> on <noindex><a rel="nofollow" href="http://vimeo.com" >Vimeo</a></noindex>.</p>
<p>Кстати, в видео я тоже поучаствовал, на 5-ой минуте и 20-ой секунде я там прохожу перед камерой в костюме и красной футболке... :D</p>
</blockquote>
<p><span id="more-3378"></span><br />
Итак, приступим!</p>
<h3>Установка Nginx</h3>
<p>На самом деле <strong>Nginx</strong> у меня был уже установлен, но для полноты статьи я расскажу как и его установить. В зависимости от необходимого функционала, либо от стабильности версии, вам надо выбрать подходящую версию <strong>Nginx</strong>. Стабильная находится в каталоге &laquo;/usr/ports/www/nginx/&raquo;, а более новая в &laquo;/usr/ports/www/nginx-devel/&raquo;, у меня стоит именно вторая.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/www/nginx-devel/</span><br />
<span style="color: #666666; font-style: italic;"># make install clean</span></div></div>
<p>Всё, <strong>Nginx</strong> установлен, добавьте его в автозагрузку:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># echo 'nginx_enable=&quot;YES&quot;' &gt;&gt; /etc/rc.conf</span></div></div>
<h3>Установка php-fpm</h3>
<p>Процесс заключается в пропатчивании и переустановки PHP интерпретатора с поддержкой FastCGI и php-fpm.</p>
<p><strong>Установка из сорцов</strong></p>
<p>Заходим на оф. сайт PHP и качаем необходимую версию PHP интерпретатора со страницы <noindex><a rel="nofollow" href="http://www.php.net/downloads.php" >http://www.php.net/downloads.php</a></noindex>, у меня это PHP 5.2.10.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /tmp</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://ru2.php.net/get/php-5.2.10.tar.gz/from/ru.php.net/mirror</span></div></div>
<p>Заходим на оф. сайт проекта php-fpm, в раздел загрузок <noindex><a rel="nofollow" href="http://php-fpm.org/download" >http://php-fpm.org/download</a></noindex> и выбираем подходящую для вашего PHP интерпретатора версию патча. У меня это PHP 5.2.10, поэтому я буду ставить именно его.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /tmp</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://php-fpm.org/downloads/php-5.2.10-fpm-0.5.13.diff.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzf php-5.2.10.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># gzip -cd php-5.2.10-fpm-0.5.13.diff.gz | patch -d php-5.2.10 -p1</span><br />
<span style="color: #666666; font-style: italic;"># cd php-5.2.10</span><br />
<span style="color: #666666; font-style: italic;"># ./configure --enable-fastcgi --enable-fpm</span><br />
<span style="color: #666666; font-style: italic;"># make all install</span></div></div>
<p>Теперь, скопируем скрипт инициализации php-fpm в каталог &laquo;/usr/local/etc/rc.d&raquo; и назначим ему права на запуск:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cp /tmp/php-5.2.10/sapi/cgi/fpm/php-fpm /usr/local/etc/rc.d/</span><br />
<span style="color: #666666; font-style: italic;"># chmod +x /usr/local/etc/rc.d/php-fpm</span></div></div>
<p><strong>Установка из портов</strong></p>
<p>Тут все намного проще... :)</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/lang/</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://php-fpm.org/downloads/freebsd-port/php-5.2.10-fpm-0.5.13.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzvf php-5.2.10-fpm-0.5.13.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># rm php-5.2.10-fpm-0.5.13.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># cd php5-fpm</span><br />
<span style="color: #666666; font-style: italic;"># make install</span></div></div>
<p><strong>Завершение установки</strong></p>
<p>После установки, проверьте версию php:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># php -v</span><br />
PHP 5.2.10 <span style="color: #7a0874; font-weight: bold;">&#40;</span>cli<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>built: Sep &nbsp;<span style="color: #000000;">2</span> <span style="color: #000000;">2009</span> <span style="color: #000000;">12</span>:<span style="color: #000000;">46</span>:<span style="color: #000000;">58</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">1997</span>-<span style="color: #000000;">2009</span> The PHP Group<br />
Zend Engine v2.2.0, Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">1998</span>-<span style="color: #000000;">2009</span> Zend Technologies</div></div>
<p>Если &laquo;built&raquo; сегодняшний, то всё оки, если нет&nbsp;&mdash; отпишите в комментарии, помогу разобраться.<br />
Я ставил и из сорцов и из портов, так что все проверено на себе! :)</p>
<p>Добавим в автозагрузку:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># echo 'php_fpm_enable=&quot;YES&quot;' &gt;&gt; /etc/rc.conf</span></div></div>
<h3>Настройка Nginx</h3>
<p>Теперь настраиваем <strong>Nginx</strong>, отредактируйте конфиг &laquo;/usr/local/etc/nginx/nginx.conf&raquo; или свой &laquo;vhost&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name demo.adw0rd.ru;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location ~* \.(jpg|jpeg|gif|png|ico|css|zip|js|swf)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root /home/adw0rd/adw0rd.ru/demo;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass &nbsp; 82.146.63.195:9000;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_index &nbsp;index.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param &nbsp;SCRIPT_FILENAME &nbsp;/home/adw0rd/adw0rd.ru/demo$fastcgi_script_name;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; include &nbsp; &nbsp; &nbsp; &nbsp;fastcgi_params;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}</div></div>
<p>Чуть более подробно о конфигурации <strong>nginx</strong> <a href="http://adw0rd.ru/2009/nginx-and-apache-install/" >тут</a> и <a href="http://adw0rd.ru/2009/nginx-gzip/" >тут</a>.</p>
<h3>Настройка php-fpm</h3>
<p>Я покажу части конфига, которые только отличаются от &laquo;php-fpm.conf.default&raquo;, весь конфиг можно взять <a href="/files/php-fpm.conf">тут</a>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;value name=&quot;listen_options&quot;&gt;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Set listen(2) backlog<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;backlog&quot;&gt;-1&lt;/value&gt;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Set permissions for unix socket, if one used.<br />
&nbsp; &nbsp; &nbsp; &nbsp; In Linux read/write permissions must be set in order to allow connections from web server.<br />
&nbsp; &nbsp; &nbsp; &nbsp; Many BSD-derrived systems allow connections regardless of permissions.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;owner&quot;&gt;www&lt;/value&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;group&quot;&gt;www&lt;/value&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;mode&quot;&gt;0666&lt;/value&gt;<br />
&lt;/value&gt;<br />
...<br />
Unix user of processes<br />
&lt;value name=&quot;user&quot;&gt;www&lt;/value&gt;<br />
<br />
Unix group of processes<br />
&lt;value name=&quot;group&quot;&gt;www&lt;/value&gt;<br />
...<br />
Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.<br />
Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)<br />
Makes sense only with AF_INET listening socket.<br />
&lt;value name=&quot;allowed_clients&quot;&gt;127.0.0.1,82.146.63.195&lt;/value&gt;</div></div>
<p>&laquo;82.146.63.195&raquo;&nbsp;&mdash; это ип моего сервера, на котором крутится nginx. Ему то мы и разрешим доступ.</p>
<h3>Запуск</h3>
<p>Теперь осталось только запустить nginx и php-fpm:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart<br />
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>php-fpm restart</div></div>
<p>Если не запустилось, то смотрите &laquo;/var/log/php-fpm.log&raquo;. Если нету файла лога вообще, то создайте его и права на запись выставите.<br />
Вот и все, в следующей статье расскажу о spawn-fcgi (раньше входил в lighttpd).</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/nginx-and-php-fpm/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/nginx-and-php-fpm/</feedburner:origLink></item>
		<item>
		<title>Помогите с переводом мануала по IMagick</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/ENZJ6-rV_eo/</link>
		<comments>http://adw0rd.ru/2009/imagick-translate/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 16:15:49 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>
		<category><![CDATA[ImageMagick]]></category>
		<category><![CDATA[PECL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pyha]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3376</guid>
		<description><![CDATA[
Всем привет, прошу вашей помощи с переводом мануала по PHP модулю IMagick. Не так давно я хотел своими усилиями перевести мануал по IMagick, но из-за нехватки времени никак не могу заставить себя перевести его до конца. 
Мне помогало сообщество Pyha.ru, но у них тоже как видно не так много времени, возможно у моих читателей найдется [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/imagick-translate/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/imagemagick1.jpg" alt="imagick" title="imagick" width="143" height="148" class="alignright size-full wp-image-4818" /></a></p>
<p>Всем привет, прошу вашей помощи с переводом мануала по <strong>PHP</strong> модулю <strong>IMagick</strong>. Не так давно я хотел своими усилиями перевести мануал по <strong>IMagick</strong>, но из-за нехватки времени никак не могу заставить себя перевести его до конца. </p>
<p>Мне помогало сообщество <a href="http://pyha.ru" >Pyha.ru</a>, но у них тоже как видно не так много времени, возможно у моих читателей найдется больше желание и главное&nbsp;&mdash; время для этой цели.</p>
<p>Переводить можно тут <noindex><a rel="nofollow" href="http://wiki.adw0rd.ru/index.php/IMagick" >http://wiki.adw0rd.ru/index.php/IMagick</a></noindex>, для этого необходимо всего лишь зарегистрироваться в вики и приступить к переводу.</p>
<p>Далее этот документ планируется перенести на страницы сообщества <strong>Pyha.ru</strong>, или вы можете посоветовать куда более подходящее место (например php.net), либо оставить все там же на моем wiki.</p>
<p>Заранее спасибо, по вопросам и предложениям&nbsp;&mdash; пишите в камменты!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/imagick-translate/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2009/imagick-translate/</feedburner:origLink></item>
		<item>
		<title>Использование Nginx+Tornado для приложений на Django</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/53VvCcARnzk/</link>
		<comments>http://adw0rd.ru/2009/nginx-tornado-django/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 16:08:26 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tornado]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4780</guid>
		<description><![CDATA[
Не так давно был анонсирован новый веб-сервер Tornado, написанный на Python, отличительной чертой которого являлась скорость работы и то что это не просто веб-сервер, а целый фреймворк.
Впервые я с ним познакомился на хабре, а вскоре после этого прочел заметку Django + Tornado и решил попробовать торнадо в действии!
На самом деле конфигурация &#171;Nginx+Tornado+Django&#187; позаимствована у заметки, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/nginx-tornado-django/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/11/tornado.png" alt="tornado" title="tornado" width="286" height="72" class="alignright size-full wp-image-4785" /></a></p>
<p>Не так давно был анонсирован новый веб-сервер <strong>Tornado</strong>, написанный на <strong>Python</strong>, отличительной чертой которого являлась скорость работы и то что это не просто веб-сервер, а целый фреймворк.</p>
<p>Впервые я с ним познакомился на <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/python/69346/" >хабре</a></noindex>, а вскоре после этого прочел заметку <noindex><a rel="nofollow" href="http://imbolc.name/2009/09/django-tornado.html" >Django + Tornado</a></noindex> и решил попробовать торнадо в действии!</p>
<p>На самом деле конфигурация &laquo;Nginx+Tornado+Django&raquo; позаимствована у заметки, ссылку на которую я привел выше, однако у меня та конфигурация не заработала, поэтому я выкладываю для себя и друзей свой конфиг.</p>
<h3>Установка</h3>
<p>Устанавливаем <strong>Tornado</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>py-tornado<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>Устанавливаем <strong>Nginx</strong>, если он у вас не установлен:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>nginx-devel<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p><span id="more-4780"></span></p>
<h3>Настройка</h3>
<p>Теперь настроим Nginx для проксирования на Tornado:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; server_name liburg.ru;<br />
<br />
&nbsp; &nbsp; location ^~ <span style="color: #000000; font-weight: bold;">/</span>admin-media <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>python2.6<span style="color: #000000; font-weight: bold;">/</span>site-packages<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span>media;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location = <span style="color: #000000; font-weight: bold;">/</span>robots.txt <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; root <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span>static<span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location ~<span style="color: #000000; font-weight: bold;">*</span> \.<span style="color: #7a0874; font-weight: bold;">&#40;</span>jpg<span style="color: #000000; font-weight: bold;">|</span>jpeg<span style="color: #000000; font-weight: bold;">|</span>gif<span style="color: #000000; font-weight: bold;">|</span>png<span style="color: #000000; font-weight: bold;">|</span>ico<span style="color: #000000; font-weight: bold;">|</span>css<span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">zip</span><span style="color: #000000; font-weight: bold;">|</span>js<span style="color: #000000; font-weight: bold;">|</span>swf<span style="color: #7a0874; font-weight: bold;">&#41;</span>$ <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; root <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span>static<span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 7d;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; location <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http:<span style="color: #000000; font-weight: bold;">//</span>127.0.0.1:8001<span style="color: #000000; font-weight: bold;">/</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host <span style="color: #007800;">$host</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP <span style="color: #007800;">$remote_addr</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For <span style="color: #007800;">$proxy_add_x_forwarded_for</span>;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></div>
<p>В корень проекта (рядом с manage.py, settings.py и т.д.) кладем файл &laquo;tornading.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">signal</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fcntl</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">subprocess</span> <span style="color: #ff7700;font-weight:bold;">import</span> Popen<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>.<span style="color: black;">handlers</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">httpserver</span> <br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">ioloop</span> <br />
<span style="color: #ff7700;font-weight:bold;">import</span> tornado.<span style="color: black;">wsgi</span> <br />
<br />
PORT = <span style="color: #ff4500;">8001</span><br />
HOST = <span style="color: #483d8b;">'liburg.ru'</span> &nbsp;<span style="color: #808080; font-style: italic;"># видно в top, htop, ps, etc</span><br />
LOG_FILE = <span style="color: #483d8b;">'/var/log/tornado.log'</span> &nbsp;<span style="color: #808080; font-style: italic;"># '' for not write log</span><br />
LOG_LEVEL = <span style="color: #483d8b;">'INFO'</span> &nbsp;<span style="color: #808080; font-style: italic;"># INFO (все статусы), WARNING (&gt;=404), ERROR (&gt;=500)</span><br />
<br />
<span style="color: #808080; font-style: italic;"># настраиваем Джанго</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">insert</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #483d8b;">'/'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>:-1<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'settings'</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span><br />
application = django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># если сайт не на Джанго, просто импортируем wsgi-объект как aplication</span><br />
<span style="color: #808080; font-style: italic;">#~ from wsgi_app import application</span><br />
<br />
<span style="color: #808080; font-style: italic;"># настраиваем логирование в файл</span><br />
<span style="color: #dc143c;">os</span>.<span style="color: black;">chdir</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">if</span> LOG_FILE:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">makedirs</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span>LOG_FILE<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">OSError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
&nbsp; &nbsp; file_handler = <span style="color: #dc143c;">logging</span>.<span style="color: black;">handlers</span>.<span style="color: black;">RotatingFileHandler</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; filename = LOG_FILE, mode=<span style="color: #483d8b;">'a+'</span>, &nbsp;<span style="color: #808080; font-style: italic;"># имя файла</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; maxBytes = <span style="color: #ff4500;">1000000</span>, &nbsp;<span style="color: #808080; font-style: italic;"># максимально байт в файле</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; backupCount = <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># максимум файлов</span><br />
&nbsp; &nbsp; file_handler.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>, LOG_LEVEL<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; file_handler.<span style="color: black;">setFormatter</span><span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">Formatter</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%(asctime)s<span style="color: #000099; font-weight: bold;">\t</span>%(levelname)-8s %(message)s'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datefmt = <span style="color: #483d8b;">'%d-%m-%Y %H:%M:%S'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLogger</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>.<span style="color: black;">setLevel</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">NOTSET</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLogger</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>.<span style="color: black;">addHandler</span><span style="color: black;">&#40;</span>file_handler<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># блокируемый файл для проверки активности сервера</span><br />
PID_FNAME = <span style="color: #483d8b;">'/tmp/'</span> + <span style="color: #483d8b;">'_'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">'.pid'</span><br />
COMMANDS = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'start'</span>, <span style="color: #483d8b;">'stop'</span>, <span style="color: #483d8b;">'restart'</span><span style="color: black;">&#93;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> daemon<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">critical</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'--- SERVER (RE)STARTED'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">flock</span><span style="color: black;">&#40;</span>f.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_EX</span> | <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_NB</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%-12i'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; f.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; container = tornado.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIContainer</span><span style="color: black;">&#40;</span>application<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; http_server = tornado.<span style="color: black;">httpserver</span>.<span style="color: black;">HTTPServer</span><span style="color: black;">&#40;</span>container<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; http_server.<span style="color: black;">listen</span><span style="color: black;">&#40;</span>PORT<span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; tornado.<span style="color: black;">ioloop</span>.<span style="color: black;">IOLoop</span>.<span style="color: black;">instance</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; started = alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> started:<br />
&nbsp; &nbsp; &nbsp; &nbsp; pid = Popen<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>HOST, <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'daemon'</span><span style="color: black;">&#93;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; executable=<span style="color: #483d8b;">'python'</span><span style="color: black;">&#41;</span>.<span style="color: black;">pid</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server started at port %s (pid: %i)...'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>PORT, pid<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server alegry started (pid: %i)'</span> <span style="color: #66cc66;">%</span> started<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; started = alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> started:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">kill</span><span style="color: black;">&#40;</span>started, <span style="color: #dc143c;">signal</span>.<span style="color: black;">SIGKILL</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server stoped (pid %i)'</span> <span style="color: #66cc66;">%</span> started<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Server not started'</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> restart<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; stop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span>1<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; start<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> alegry_started<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
&nbsp; &nbsp; Если сервер запущен, возвращает pid, иначе 0<br />
&nbsp; &nbsp; '</span><span style="color: #483d8b;">''</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>PID_FNAME<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'0'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>PID_FNAME, <span style="color: #483d8b;">'r+'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">flock</span><span style="color: black;">&#40;</span>f.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_EX</span> | <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">LOCK_NB</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IOError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; started = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; started = 0<br />
&nbsp; &nbsp; f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> started<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> == 2 <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span>1<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span>COMMANDS + <span style="color: black;">&#91;</span><span style="color: #483d8b;">'daemon'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">cmd</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span>1<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">cmd</span><span style="color: black;">&#93;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Error: invalid command'</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Usage: python tornading.py {%s}.'</span> <span style="color: #66cc66;">%</span> <span style="color: #483d8b;">'|'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>COMMANDS<span style="color: black;">&#41;</span></div></div>
<p>Стартуем Nginx и Tornado:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx start<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> python tornading.py start</div></div>
<p>На случай падения Tornado&nbsp;&mdash; добавьте в крон задание на запуск сервера:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>liburg<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>python tornading.py start</div></div>
<p>PS. Проект <noindex><a rel="nofollow" href="http://liburg.ru/" >Либург.ру</a></noindex> работает на Tornado+Django</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/nginx-tornado-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2009/nginx-tornado-django/</feedburner:origLink></item>
	</channel>
</rss>
