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

<channel>
	<title>Мастерская интернет-разработчика &#187; Операционные системы</title>
	<atom:link href="http://adw0rd.ru/category/operation-systems/feed/" rel="self" type="application/rss+xml" />
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Wed, 18 Jan 2012 13:52:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>FreeBSD. Обновление таймзоны по повелению президента</title>
		<link>http://adw0rd.ru/2011/freebsd-msk-timezone/</link>
		<comments>http://adw0rd.ru/2011/freebsd-msk-timezone/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 20:49:02 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6477</guid>
		<description><![CDATA[8 февраля 2011 года президент России Дмитрий Медведев дал поручение правительству об отмене перевода стрелок: после перехода на летнее время 27 марта 2011 года Россия должна жить только по летнему времени, которое опережает поясное (принятое декретом 1919 года) на 1 или 2 часа в зависимости от региона. В соответствии с этим поручением был подготовлен «Закон [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2011/freebsd-localtime-timezone/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/01/250px-freebsd_logo.png" alt="" title="freebsd" width="250" height="90" class="alignright size-full wp-image-491" /></a></p>
<blockquote>
<p>
8 февраля 2011 года президент России Дмитрий Медведев дал поручение правительству об отмене перевода стрелок: после перехода на летнее время 27 марта 2011 года Россия должна жить только по летнему времени, которое опережает поясное (принятое декретом 1919 года) на 1 или 2 часа в зависимости от региона. В соответствии с этим поручением был подготовлен «Закон об исчислении времени», который Государственная дума приняла 20 мая. 3 июня 2011 года президент подписал Закон, и он вступил в силу с 5 августа 2011 года</p>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D1%82%D0%BD%D0%B5%D0%B5_%D0%B2%D1%80%D0%B5%D0%BC%D1%8F" >Летнее время</a></noindex>
</p>
</blockquote>
<p>FreeBSD 8.1 как и многий другой софт не подчинился новому закону Дмитрия Анатольевича, так что будем исправлять ситуацию.</p>
<p>Поставим zoneinfo, оттуда будем брать новую таймзону</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<br />
$ portsnap fetch update<br />
$ <span style="color: #7a0874; font-weight: bold;">cd</span> misc<span style="color: #000000; font-weight: bold;">/</span>zoneinfo<br />
$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</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;">zdump</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>zoneinfo<span style="color: #000000; font-weight: bold;">/</span>Europe<span style="color: #000000; font-weight: bold;">/</span>Moscow <br />
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>zoneinfo<span style="color: #000000; font-weight: bold;">/</span>Europe<span style="color: #000000; font-weight: bold;">/</span>Moscow &nbsp;Wed Nov &nbsp;<span style="color: #000000;">9</span> 00:<span style="color: #000000;">16</span>:<span style="color: #000000;">29</span> <span style="color: #000000;">2011</span> MSK<br />
$ <span style="color: #c20cb9; font-weight: bold;">date</span><br />
Wed Nov &nbsp;<span style="color: #000000;">8</span> <span style="color: #000000;">23</span>:<span style="color: #000000;">16</span>:<span style="color: #000000;">40</span> MSK <span style="color: #000000;">2011</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;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>zoneinfo<span style="color: #000000; font-weight: bold;">/</span>Europe<span style="color: #000000; font-weight: bold;">/</span>Moscow <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>localtime <br />
$ <span style="color: #c20cb9; font-weight: bold;">date</span><br />
Wed Nov &nbsp;<span style="color: #000000;">9</span> 00:<span style="color: #000000;">16</span>:<span style="color: #000000;">56</span> MSK <span style="color: #000000;">2011</span></div></div>
<p><span id="more-6477"></span><br />
Не забудьте перезагрузить &laquo;mysqld&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: #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>mysql-server restart</div></div>
<h3>Не взлетел PHP?</h3>
<p>Если PHP не взлетел, то используйте pecl-timezonedb:</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>misc<span style="color: #000000; font-weight: bold;">/</span>pecl-timezonedb<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>и убедитесь что &laquo;timezonedb.so&raquo; добавился в &laquo;/usr/local/etc/php/extensions.ini&raquo;:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
<span style="color: #000099;">extension</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">timezonedb.so</span></div></div>
<h3>Синхронизация</h3>
<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">ntpdate <span style="color: #660033;">-v</span> <span style="color: #660033;">-b</span> europe.pool.ntp.org</div></div>
<p>Можете настроить &laquo;rc.conf&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: #007800;">ntpdate_enable</span>=<span style="color: #ff0000;">&quot;YES&quot;</span><br />
<span style="color: #007800;">ntpdate_hosts</span>=<span style="color: #ff0000;">&quot;europe.pool.ntp.org&quot;</span></div></div>
<p>Так же можете почитать <noindex><a rel="nofollow" href="http://www.manpagez.com/man/8/ntpdate/" >man page ntpdate</a></noindex> и посмотреть какие ещё есть параметры конфигурации для &laquo;rc.conf&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: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-r</span> ntpdate <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>defaults<span style="color: #000000; font-weight: bold;">/</span>rc.conf <br />
<span style="color: #007800;">ntpdate_enable</span>=<span style="color: #ff0000;">&quot;NO&quot;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Run ntpdate to sync time on boot (or NO).</span><br />
<span style="color: #007800;">ntpdate_program</span>=<span style="color: #ff0000;">&quot;/usr/sbin/ntpdate&quot;</span> &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># path to ntpdate, if you want a different one.</span><br />
<span style="color: #007800;">ntpdate_flags</span>=<span style="color: #ff0000;">&quot;-b&quot;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;"># Flags to ntpdate (if enabled).</span><br />
<span style="color: #007800;">ntpdate_config</span>=<span style="color: #ff0000;">&quot;/etc/ntp.conf&quot;</span> &nbsp;<span style="color: #666666; font-style: italic;"># ntpdate(8) configuration file</span><br />
<span style="color: #007800;">ntpdate_hosts</span>=<span style="color: #ff0000;">&quot;&quot;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;"># Whitespace-separated list of ntpdate(8) servers.</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/freebsd-msk-timezone/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Xubuntu. Проблемы с авторизацией после апгрейда с 11.04 на 11.10</title>
		<link>http://adw0rd.ru/2011/xubuntu-1104-1110/</link>
		<comments>http://adw0rd.ru/2011/xubuntu-1104-1110/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 18:11:55 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[xubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6461</guid>
		<description><![CDATA[Обновил я на той неделе свою Xubuntu с 11.04 на 11.10, как и опасался оно не взлетело с первого раза. Симптомы были следующие: gdm стартовал успешно, но авторизоваться под своим пользователем не получалось, вылетало на авторизацию вновь (gdm), при этом новые учетные записи авторизовывало успешно. Посравнивал свои конфигурационные файлы с другой учетной записью, ничего криминального [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/wp-content/uploads/2011/10/f28838f7915a239766214d95f67-e1319541232350.png" ><img src="http://adw0rd.ru/wp-content/uploads/2011/10/f28838f7915a239766214d95f67-e1319541281528.png" alt="" title="xubuntu" width="99" height="149" class="alignright size-full wp-image-6464" /></a></p>
<p>Обновил я на той неделе свою Xubuntu с 11.04 на 11.10, как и опасался оно не взлетело с первого раза.<br />
Симптомы были следующие: gdm стартовал успешно, но авторизоваться под своим пользователем не получалось, вылетало на авторизацию вновь (gdm), при этом новые учетные записи авторизовывало успешно.<br />
Посравнивал свои конфигурационные файлы с другой учетной записью, ничего криминального не нашёл, кроме того что в моём домашнем каталоге были файлы не от моего пользователя.</p>
<h3>Решение проблемы</h3>
<p>Переключаемся в один из терминалов (например tty1) с помощью Ctrl+Alt+F1 и вводим следующее:</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;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;</span>:<span style="color: #000000; font-weight: bold;">&lt;</span>usergroup<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;</span><br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> shutdown <span style="color: #660033;">-r</span> now</div></div>
<p>Это решило мои проблемы.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/xubuntu-1104-1110/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH. Авторизация через ключ</title>
		<link>http://adw0rd.ru/2011/ssh-auth-key/</link>
		<comments>http://adw0rd.ru/2011/ssh-auth-key/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 17:26:59 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6386</guid>
		<description><![CDATA[Если вам надоело вводить логин и пароль при подключении по SSH, либо ваше приложение не поддерживает ввод логина и пароля для SSH, а соединиться всётаки надо, то вам просто необходимо использовать авторизацию по ключам! Для этого надо настроить на стороне клиента и сервера ключи, для клиента будет приватный, а на сервере будет храниться публичный ключ. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/2011/ssh-auth-key/"><img src="/wp-content/uploads/2011/08/ssh-auth-key2.jpg" alt="" title="ssh-auth-key2" width="103" height="151" class="alignright size-full wp-image-6403" /></a></p>
<p>Если вам надоело вводить логин и пароль при подключении по <strong>SSH</strong>, либо ваше приложение не поддерживает ввод логина и пароля для <strong>SSH</strong>, а соединиться всётаки надо, то вам просто необходимо использовать авторизацию по ключам!</p>
<p>Для этого надо настроить на стороне клиента и сервера ключи, для клиента будет приватный, а на сервере будет храниться публичный ключ.</p>
<h3>Настройка на стороне клиента</h3>
<p>Создайте и/или отредактируйте файл &laquo;~/.ssh/config&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">Host example<br />
&nbsp; &nbsp; User username<br />
&nbsp; &nbsp; Hostname example.com<br />
&nbsp; &nbsp; Port <span style="color: #000000;">22</span><br />
&nbsp; &nbsp; IdentityFile ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>username_example</div></div>
<p><strong>Где,</strong></p>
<ul>
<li>&laquo;Host <strong>example&raquo;</strong>&nbsp;&mdash; название хоста, которое вы будете указывать при подключении по SSH (Пример: &laquo;ssh example&raquo;);</li>
<li>&laquo;User <strong>username&raquo;</strong>&nbsp;&mdash; имя вашего пользователя на сервере;</li>
<li>&laquo;Hostname <strong>example.com&raquo;</strong>&nbsp;&mdash; имя хоста вашего сервера (в отличии от <strong>Host</strong> это действительно имя сервера, а не просто имя для соединения);</li>
<li>&laquo;Port <strong>22&raquo;</strong>&nbsp;&mdash; SSH порт;</li>
<li>&laquo;IdentityFile <strong>~/.ssh/username_example&raquo;</strong>&nbsp;&mdash; файл с публичным ключом.</li>
</ul>
<p><span id="more-6386"></span></p>
<h3>Генерация ключей и передача их на сервер</h3>
<p>Далее, сгенерируем ключи.<br />
После чего сразу же перешлём публичный ключ на сервер, а приватный переименуем в &laquo;~/.ssh/username_example&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: #c20cb9; font-weight: bold;">ssh-keygen</span><br />
<span style="color: #c20cb9; font-weight: bold;">scp</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>id_rsa.pub username<span style="color: #000000; font-weight: bold;">@</span>example.com:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>authorized_keys<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>id_rsa ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>username_example<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">600</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">700</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh</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;">ssh</span> example</div></div>
<p>Если нет, то пишите камменты :)</p>
<h3>Утилита ssh-copy-id</h3>
<p>Также есть более быстрый (меньше телодвижений) и правильный (он добавляет ключ в &laquo;~/.ssh/authorized_keys&raquo; на сервере, а не замещает как &laquo;scp&raquo;) способ передавать публичный ключ на сервер, это утилита <strong>ssh-copy-id</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: #c20cb9; font-weight: bold;">ssh-keygen</span><br />
<span style="color: #c20cb9; font-weight: bold;">scp</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>id_rsa.pub username<span style="color: #000000; font-weight: bold;">@</span>example.com:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>authorized_keys</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;">ssh-keygen</span><br />
ssh-copy-id <span style="color: #660033;">-i</span> username<span style="color: #000000; font-weight: bold;">@</span>example.com</div></div>
<p>Ну вот и всё, смотрите также:<br />
<a href="/2011/wordpress-update-ssh/">WordPress. Обновление движка и плагинов через ssh</a><br />
<a href="/2010/first-measures-security-freebsd/">Первые меры безопасности во FreeBSD</a><br />
<a href="/2009/ssh-auth-keys/">FreeBSD. Без парольный доступ по SSH с использованием шифрованных ключей</a><br />
<a href="/2009/denyhosts/">FreeBSD. DenyHosts защитит вас от брутфорса SSH</a></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/ssh-auth-key/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Андрей Аксенов: “Как готовить Sphinx” / мастер-класс, Киев, 18-ое июня</title>
		<link>http://adw0rd.ru/2011/sphinx-master-class/</link>
		<comments>http://adw0rd.ru/2011/sphinx-master-class/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 19:28:24 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Sphinx]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6322</guid>
		<description><![CDATA[В субботу, 18-го июня в Киеве пройдет мастер-класс создателя движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”. Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких нагрузках. Sphinx используют такие монстры, как CraigsList, DailyMotion, Meetup, HupPages, HabraHabr и еще десятки высоконагруженных сайтов такие как Кинсбург. Андрей Аксенов выступал [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2011/sphinx-master-class/" ><img src="http://adw0rd.ru/wp-content/uploads/2011/06/axenov.jpg" alt="" title="axenov" width="100" height="112" class="alignright size-full wp-image-6323" /></a><br />
<strong>В субботу, 18-го июня в Киеве</strong> пройдет мастер-класс создателя движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”.</p>
<p>Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких нагрузках.</p>
<p>Sphinx используют такие монстры, как <strong>CraigsList</strong>, <strong>DailyMotion</strong>, <strong>Meetup</strong>, <strong>HupPages</strong>, <strong>HabraHabr</strong> и еще десятки высоконагруженных сайтов такие как <noindex><a rel="nofollow" href="http://kinsburg.ru/" >Кинсбург</a></noindex>. Андрей Аксенов  выступал на многочисленных конференциях в России: <strong>“DevPoint 1-2″, “РИТ”, “DevConf 2011″, “HighLoad ++”</strong>. Организатор конференции пользователей Sphinx в Москве. Автор нашумевшего доклада “Как прекратить писать”.</p>
<p>Дополнительная информация и подробный план мастер-класса можно посмотреть на сайте <noindex><a rel="nofollow" href=" http://www.smartme.com.ua/sphinx-workshop/" >http://www.smartme.com.ua/sphinx-workshop/</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/sphinx-master-class/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>FreeBSD. Установка MySQL 5.5.9 и SphinxSE</title>
		<link>http://adw0rd.ru/2011/mysql55-sphinxse/</link>
		<comments>http://adw0rd.ru/2011/mysql55-sphinxse/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 21:31:41 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Sphinx]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6290</guid>
		<description><![CDATA[Захотелось поставить на новый сервер MySQL 5.5, но в документации по установке SphinxSE этой версии MySQL нету. Погуглив и попробовав разные варианты я составил небольшую статью... Сборка плагина Тут все просто, сливаем из портов сорцы MySQL, сливаем патч, сливаем sphinx из транка и собираем все вместе. cd /usr/ports/database/mysql55-server make fetch cp /usr/ports/distfiles/mysql-5.5.9.tgz /tmp cd /tmp [...]]]></description>
			<content:encoded><![CDATA[<p>Захотелось поставить на новый сервер MySQL 5.5, но в <noindex><a rel="nofollow" href="http://sphinxsearch.com/docs/manual-1.10.html#sphinxse-mysql51" >документации по установке SphinxSE</a></noindex> этой версии MySQL нету. Погуглив и попробовав разные варианты я составил небольшую статью...</p>
<h3>Сборка плагина</h3>
<p>Тут все просто, сливаем из портов сорцы MySQL, сливаем патч, сливаем sphinx из транка и собираем все вместе.</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>database<span style="color: #000000; font-weight: bold;">/</span>mysql55-server<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> fetch<br />
<span style="color: #c20cb9; font-weight: bold;">cp</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>distfiles<span style="color: #000000; font-weight: bold;">/</span>mysql-5.5.9.tgz <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
<span style="color: #c20cb9; font-weight: bold;">svn co</span> http:<span style="color: #000000; font-weight: bold;">//</span>sphinxsearch.googlecode.com<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>trunk sphinx-trunk<br />
fetch http:<span style="color: #000000; font-weight: bold;">//</span>www.coreseek.cn<span style="color: #000000; font-weight: bold;">/</span>uploads<span style="color: #000000; font-weight: bold;">/</span>csft<span style="color: #000000; font-weight: bold;">/</span>patch<span style="color: #000000; font-weight: bold;">/</span>Sphinx_1.11-dev_sphinxse_mysql-5.5.8.diff<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> mysql-5.5.9.tar.gz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> sphinx-trunk<br />
<span style="color: #c20cb9; font-weight: bold;">patch</span> <span style="color: #660033;">-p0</span> <span style="color: #000000; font-weight: bold;">&lt;</span> ..<span style="color: #000000; font-weight: bold;">/</span>Sphinx_1.11-dev_sphinxse_mysql-5.5.8.diff<br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-R</span> mysqlse ..<span style="color: #000000; font-weight: bold;">/</span>mysql-5.5.9<span style="color: #000000; font-weight: bold;">/</span>storage<span style="color: #000000; font-weight: bold;">/</span>sphinx<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>mysql-5.5.9<br />
cmake . -DCMAKE_BUILD_TYPE=Release -DWITH_SPHINX_STORAGE_ENGINE=<span style="color: #000000;">1</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span><br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> storage<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>ha_sphinx.so <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>mysql<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span>ha_sphinx.so</div></div>
<p>Так как у меня уже был поставлен MySQL 5.5 из портов, то я не запускал make install, поэтому его тут и не привел. И вам советую поставить из портов.</p>
<h3>Установка плагина</h3>
<p>Заходим в mysql-клиент:</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">INSTALL PLUGIN sphinx <span style="color: #993333; font-weight: bold;">SONAME</span> <span style="color: #ff0000;">&quot;ha_sphinx.so&quot;</span>;<br />
<span style="color: #993333; font-weight: bold;">SHOW</span> ENGINES;</div></div>
<p>По мотивам <noindex><a rel="nofollow" href="http://sphinxsearch.com/forum/view.html?id=6862#32268" >http://sphinxsearch.com/forum/view.html?id=6862#32268</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/mysql55-sphinxse/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Nginx. Использование PHP в режиме FastCGI с помощью spawn-fcgi</title>
		<link>http://adw0rd.ru/2010/nginx-spawn-fcgi/</link>
		<comments>http://adw0rd.ru/2010/nginx-spawn-fcgi/#comments</comments>
		<pubDate>Thu, 25 Nov 2010 01:54:08 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[spawn-fcgi]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4875</guid>
		<description><![CDATA[В прошлой статье о FastCGi&#160;&#8212; Nginx. Использование PHP в режиме FastCGI с помощью php-fpm я рассказал как использовать php-fpm спаунер (надо сказать, что с тех времен все сильно поменялось, например вышел php 5.3.3 и php-fpm стал входить в дистрибутив php, а так же поменялся формат конфига php-fpm). Сегодня расскажу как использовать spawn-fcgi, некогда входивший в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/nginx-spawn-fcgi/" ><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>В прошлой статье о FastCGi&nbsp;&mdash; <a href="http://adw0rd.ru/2010/nginx-and-php-fpm/" >Nginx. Использование PHP в режиме FastCGI с помощью php-fpm</a> я рассказал как использовать php-fpm спаунер (надо сказать, что с тех времен все сильно поменялось, например вышел php 5.3.3 и php-fpm стал входить в дистрибутив php, а так же поменялся формат конфига php-fpm). Сегодня расскажу как использовать spawn-fcgi, некогда входивший в дистрибутив lighttpd, а ныне являющийся <noindex><a rel="nofollow" href="http://redmine.lighttpd.net/projects/spawn-fcgi/news" >отдельным проектом</a></noindex>.</p>
<h3>Установка</h3>
<p>Перед установкой спаунера убедимся, что PHP собран с поддержкой CGi:</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">[X] CGI &nbsp; &nbsp; &nbsp; &nbsp;Build CGI version</div></div>
<p>Далее заходим в порты и устанавливаем <strong>spawn-fcgi</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>spawn-fcgi<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-4875"></span></p>
<h3>Настройка</h3>
<p>Отредактируйте &laquo;nginx.conf&raquo; и добавьте upstream:</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 spawn-fcgi {<br />
&nbsp; &nbsp; server unix:/tmp/spawn-fcgi.sock;<br />
}</div></div>
<p>Откройте на редактирование файл &laquo;/etc/rc.conf&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"># При запуске системы загружать spawn-fcgi<br />
spawn_fcgi_enable=&quot;YES&quot;<br />
<br />
# Пользователь от которой работать будет php-cgi<br />
spawn_fcgi_username=&quot;www&quot;<br />
<br />
# Группа<br />
spawn_fcgi_groupname=&quot;www&quot;<br />
<br />
# Путь до unix-сокета, именно его мы используем<br />
spawn_fcgi_bindsocket=&quot;/tmp/spawn-fcgi.sock&quot;<br />
<br />
# Количество запущенных php-cgi процессов<br />
spawn_fcgi_children=&quot;5&quot;<br />
<br />
# Кол-во запросов, после которых перезагружается процесс (для предотвращения утечек памяти)<br />
spawn_fcgi_max_requests=&quot;1000&quot;</div></div>
<p>Полный перечень допустимых настроек можно посмотреть в &laquo;/usr/local/etc/rc.d/spawn-fcgi&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"># Путь до php-cgi приложения<br />
spawn_fcgi_app=&quot;/usr/local/bin/php-cgi&quot;<br />
<br />
# Дополнительные аргументы для php-cgi (их можно узнать командой &quot;php-cgi -h&quot;)<br />
spawn_fcgi_app_args=&quot;&quot;<br />
<br />
# Вы можете указать путь до песочницы<br />
spawn_fcgi_chroot_dir=&quot;&quot;<br />
<br />
# IP адрес, который будет слушать демон<br />
spawn_fcgi_bindaddr=&quot;127.0.0.1&quot;<br />
<br />
# Соответственно порт<br />
spawn_fcgi_bindport=&quot;9000&quot;<br />
<br />
# Путь до PID файла<br />
spawn_fcgi_pidfile=&quot;/var/run/spawn-fcgi.pid&quot;<br />
<br />
# Права на файл unix-сокета<br />
spawn_fcgi_bindsocket_mode=&quot;0777&quot;</div></div>
<h3>Запуск</h3>
<p>Запускаем spawn-fcgi и перезагружаем 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: #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>spawn-fcgi start<br />
nginx <span style="color: #660033;">-s</span> reload</div></div>
<p>Используемая версия <strong>spawn-fcgi</strong>&nbsp;&mdash; 1.6.3</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/nginx-spawn-fcgi/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>FreeBSD. XHProf для анализа производительности PHP</title>
		<link>http://adw0rd.ru/2010/freebsd-xhprof-php/</link>
		<comments>http://adw0rd.ru/2010/freebsd-xhprof-php/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 23:00:20 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XHProf]]></category>
		<category><![CDATA[Оптимизация]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5510</guid>
		<description><![CDATA[Решил я воспользоваться утилитой для профилирования производительности веб-приложения XHProf от Facebook. И она мне так понравилась, что я решил написать про неё небольшой пост. Утилита проводит анализ работы сайта, выводит информацию о использование каждой функции на пути работы приложения (например, загрузки определенной страницы сайта), а именно: количество вызовов определенной функции, затраченное время, кол-во потребляемой памяти [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/wp-content/uploads/2010/04/xhprof.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2010/04/xhprof.jpg" alt="" title="xhprof" width="199" height="100" class="alignright size-full wp-image-5526" /></a></p>
<p>Решил я воспользоваться утилитой для профилирования производительности веб-приложения <strong>XHProf</strong> от Facebook. И она мне так понравилась, что я решил написать про неё небольшой пост.</p>
<p>Утилита проводит анализ работы сайта, выводит информацию о использование каждой функции на пути работы приложения (например, загрузки определенной страницы сайта), а именно: количество вызовов определенной функции, затраченное время, кол-во потребляемой памяти и ресурсов процессора.</p>
<blockquote>
<p>
<strong>Профилирование</strong> — сбор характеристик работы программы, таких как время выполнения отдельных фрагментов (обычно подпрограмм), число верно предсказанных условных переходов, число кэш промахов и т. д. Инструмент, используемый для анализа работы, называют профилировщиком. Обычно выполняется совместно с оптимизацией программы.</p>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29" >Профилирование в Wikipedia</a></noindex>
</p>
</blockquote>
<p><span id="more-5510"></span></p>
<p>Данные выводятся в виде таблицы:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/05/xhprof_table.jpg" alt="" title="xhprof_table" width="809" height="407" class="alignnone size-full wp-image-6186" style="border:dotted 2px gray;padding:10px;" /></p>
<p>Так же она может отрисовать граф с помощью <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Graphviz" >GraphViz</a></noindex>, но для этого он должен быть предварительно собран в системе (об этом ниже):</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/05/xhprof_callgraph.jpg" alt="" title="xhprof_callgraph" width="223" height="528" class="alignnone size-full wp-image-6187" style="border:dotted 2px gray;padding:10px;" /></p>
<p><strong>XHProf</strong> представляет собой pecl-расширение для PHP, написана она на си, поэтому достигается высокая с ее стороны производительность и ее можно использовать на продакшен сервере для анализа реальных данных.</p>
<h3>Установка</h3>
<p>Я собирал расширение из сорцов, для этого заходим на <noindex><a rel="nofollow" href="http://pecl.php.net/package/xhprof" >страницу расширения</a></noindex> и качаем необходимую нам версию, у меня это <noindex><a rel="nofollow" href="http://pecl.php.net/get/xhprof-0.9.2.tgz" >xhprof-0.9.2</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: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
fetch http:<span style="color: #000000; font-weight: bold;">//</span>pecl.php.net<span style="color: #000000; font-weight: bold;">/</span>get<span style="color: #000000; font-weight: bold;">/</span>xhprof-0.9.2.tgz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> xhprof-0.9.2.tgz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> xhprof-0.9.2<span style="color: #000000; font-weight: bold;">/</span>extension<span style="color: #000000; font-weight: bold;">/</span><br />
phpize<br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-php-config</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>php-config<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Пропишите расширение в php.ini или в php/extensions.ini:</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">extension=xhprof.so</div></div>
<blockquote>
<p>
Вы можете поставить расширение <strong>XHProf</strong> из портов (/usr/ports/devel/pecl-xhprof/).<br />
В мае, когда я практически написал эту статью, его ещё там небыло.
</p>
</blockquote>
<p>Укажите в php.ini каталог, который будет играть роль хранилища ваших данных:</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">[xhprof] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
xhprof.output_dir=/usr/local/xhprof/out</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">mkdir -p /usr/local/xhprof/out</div></div>
<h4>XHProf UI</h4>
<p>Теперь настроим веб-интерфейс <strong>XHProf</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: #c20cb9; font-weight: bold;">mkdir</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>xhprof<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>xhprof-0.9.2<span style="color: #000000; font-weight: bold;">/</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>xhprof<span style="color: #000000; font-weight: bold;">/</span></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">server <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; server_name xhprof.test;<br />
&nbsp; &nbsp; charset utf8;<br />
&nbsp; &nbsp; root <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>xhprof<span style="color: #000000; font-weight: bold;">/</span>xhprof_html;<br />
&nbsp; &nbsp; index index.php;<br />
<br />
&nbsp; &nbsp; location ~ \.php$ <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_index index.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME <span style="color: #007800;">$document_root</span><span style="color: #007800;">$fastcgi_script_name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params;<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>Перезагружаем 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">nginx <span style="color: #660033;">-s</span> reload</div></div>
<p>А в локальном файле hosts завяжем домен:</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">123.45.67.89 xhprof.test</div></div>
<p>Где &laquo;123.45.67.89&raquo;&nbsp;&mdash; ip машины на которой стоит <strong>XHProf</strong>, то есть где мы его только что устанавливали.</p>
<h4>Собираем Graphviz</h4>
<p>Для построение визуализации соберем Graphviz (крайне рекомендую это сделать, будет намного нагляднее).</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>graphics<span style="color: #000000; font-weight: bold;">/</span>graphviz<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<h4>Собираем Ctype</h4>
<p>Вам так же может понадобится Ctype</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>textproc<span style="color: #000000; font-weight: bold;">/</span>php5-ctype<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<h3>Настройка</h3>
<p>Теперь настроим <strong>XHProf</strong> так, чтобы он профилировал только когда у нас установлена специальная кука. Для это создадим два файла &laquo;/usr/local/xhprof/header.php&raquo; и &laquo;/usr/local/xhprof/footer.php&raquo;, со следующим содержимым:</p>
<p>1. Отредактируйте &laquo;/usr/local/xhprof/header.php&raquo;:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">extension_loaded</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$utils_path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/local/xhprof/xhprof_lib/utils/&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">include_once</span> <span style="color: #000088;">$utils_path</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'xhprof_lib.php'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">include_once</span> <span style="color: #000088;">$utils_path</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'xhprof_runs.php'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xhprof_enable<span style="color: #009900;">&#40;</span>XHPROF_FLAGS_CPU <span style="color: #339933;">+</span> XHPROF_FLAGS_MEMORY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Он срабатывает только если установлена кука &laquo;xhprof&raquo;, подключает необходимые библиотеки и устанавливает необходимые флаги (об этом чуть ниже).</p>
<p>2. Отредактируйте &laquo;/usr/local/xhprof/footer.php&raquo;:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">extension_loaded</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profiler_namespace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'myapp'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// namespace for your application</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xhprof_data</span> <span style="color: #339933;">=</span> xhprof_disable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xhprof_runs</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XHProfRuns_Default<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$run_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$xhprof_runs</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save_run</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xhprof_data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profiler_namespace</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// url to the XHProf UI libraries (change the host name and path)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profiler_url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://xhprof.test/index.php?run=%s&amp;source=%s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$run_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profiler_namespace</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;a href=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$profiler_url</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;Profiler output&lt;/a&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Он срабатывает только если установлена кука &laquo;xhprof&raquo;, устанавливает неймспейс и сохраняет собранные показатели. После чего отрисовывает ссылку на веб-интерфейс <strong>XHProf</strong> для последующего анализа.</p>
<p>Теперь добавим в конец две строки в php.ini, для того чтобы эти два скрипта стартовали в начале и конце соответственно:</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">auto_prepend_file = /usr/local/xhprof/header.php<br />
auto_append_file = /usr/local/xhprof/footer.php</div></div>
<p>Более подробная документация по <strong>XHProf</strong>: <noindex><a rel="nofollow" href="http://mirror.facebook.net/facebook/xhprof/doc.html" >http://mirror.facebook.net/facebook/xhprof/doc.html</a></noindex></p>
<h3>Проблема с dot</h3>
<p>Утилита dot это тот самый Graphviz и с ним бывает проблема, что-то типа того:</p>
<blockquote>
<p>Error: either we can not find profile data for run_id 4ced888563969 or the threshold 0.01 is too small or you do not have &#39;dot&#39; image generation utility installed.</p>
</blockquote>
<p>Сначала зайдите в &laquo;/usr/local/xhprof/xhprof_lib/utils/callgraph_utils.php&raquo; и найдите функцию &laquo;xhprof_generate_image_by_dot&raquo; (примерно 96 строка). Отредактируйте массив $descriptorspec, указав путь до файла лога:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #000088;">$descriptorspec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stdin is a pipe that the child will read from</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stdout is a pipe that the child will write to</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stderr is a file to write to</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">//2 =&gt; array(&quot;file&quot;, &quot;/dev/null&quot;, &quot;a&quot;)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Путь до файла лога</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;file&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;/var/log/xhprof.log&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;a+&quot;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Ну и теперь запускайте и смотрите лог, если у вас там:</p>
<blockquote>
<p>
dot: not found
</p>
</blockquote>
<p>То просто укажите полный путь до dot:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; /usr/local/bin/dot -T&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$type</span><span style="color: #339933;">;</span></div></div>
<p>Это примерно 107 строка того же файла &laquo;/usr/local/xhprof/xhprof_lib/utils/callgraph_utils.php&raquo;.</p>
<h3>Ссылки</h3>
<p>Посты, от которых я узнал о <strong>XHProf</strong>:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://highload.com.ua/index.php/2009/08/21/xhprof-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-php-%D0%BE%D1%82-facebook/" >XHprof&nbsp;&mdash; профилирование PHP от Facebook</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/php/78210/" >Профилирование PHP-кода</a></noindex></li>
</ul>
<p>Советую почитать:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/" >XHprof – профайлер PHP от Facebook</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://mirror.facebook.net/facebook/xhprof/doc.html" >XHProf Documentation</a></noindex></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/freebsd-xhprof-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Nginx. Кеширование с помощью fastcgi_cache</title>
		<link>http://adw0rd.ru/2010/nginx-fastcgi-cache/</link>
		<comments>http://adw0rd.ru/2010/nginx-fastcgi-cache/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 01:10:58 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[Кеш]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5750</guid>
		<description><![CDATA[Устал я от того что мой блог долго грузится, но менять движок с WordPress на что-либо другое пока нет времени, а переезд на новый более мощный сервер всё время затягивается и решил прикрутить кеширование на стороне Nginx. Так как блог работает на fastcgi, то буду использовать fastcgi_cache, если вы используете связку Nginx+Apache, то вам следует [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/nginx-fastcgi-cache/"><img src="http://adw0rd.ru/wp-content/uploads/2009/02/nginx.png"  alt="" title="nginx" width="242" height="64" style="padding:0 20px" class="alignright size-full wp-image-1374" /></a></noindex></p>
<p>Устал я от того что мой блог долго грузится, но менять движок с <strong>WordPress</strong> на что-либо другое пока нет времени, а переезд на новый более мощный сервер всё время затягивается и решил прикрутить кеширование на стороне <strong>Nginx</strong>. Так как блог работает на <strong>fastcgi</strong>, то буду использовать <strong>fastcgi_cache</strong>, если вы используете связку <a href="/2009/nginx-and-apache-install/">Nginx+Apache</a>, то вам следует использовать <strong>proxy_cache</strong>, как я понял там отличий особых нет.</p>
<p>Некоторые блоки мне всетаки надо оставить вне кеша, поэтому буду использовать <strong>ssi</strong>.</p>
<h3>Настройка</h3>
<p>У меня много хостов на одном сервере, но мне надо настроить кеш только для одного хоста. Определим кеш для моего блога в <strong>nginx.conf</strong>, секция <strong>http</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">fastcgi_cache_path <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>cache<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>adw0rd<br />
&nbsp; &nbsp; <span style="color: #007800;">levels</span>=<span style="color: #000000;">1</span>:<span style="color: #000000;">2</span><br />
&nbsp; &nbsp; <span style="color: #007800;">keys_zone</span>=adw0rd:16m<br />
&nbsp; &nbsp; <span style="color: #007800;">max_size</span>=256m<br />
&nbsp; &nbsp; <span style="color: #007800;">inactive</span>=1d;</div></div>
<p><span id="more-5750"></span><br />
Где,</p>
<blockquote>
<p><strong>fastcgi_cache_path <PATH></strong>&nbsp;&mdash; путь до каталога кеша, создайте его заблаговременно.<br />
<strong>levels=<LEVEL></strong>&nbsp;&mdash; разделять файлы кеша на сабкаталоги заданного уровня, то есть &laquo;1:2&raquo;&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;">0</span><span style="color: #000000; font-weight: bold;">/</span>ab<span style="color: #000000; font-weight: bold;">/</span>b7f54b2df7773722d382f4809d650ab0</div></div>
<p>либо так, если не указывать LEVEL, то есть levels оставить пустым (levels=):</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>b7f54b2df7773722d382f4809d650ab0</div></div>
<p><strong>max_size</strong>&nbsp;&mdash; максимальный размер кеша.<br />
<strong>incative</strong>&nbsp;&mdash; время жизни кеша.
</p>
</blockquote>
<h4>Настройка виртуального хоста</h4>
<p>Я разделяю конфиги на основной (nginx.conf) и на хосты (adw0rd.conf, pyha.conf, etc). Сейчас мы разберемся с adw0rd.conf:</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 />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Порт который слушаем</span><br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Имя хоста</span><br />
&nbsp; &nbsp; server_name adw0rd.ru;<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Путь до htdocs (document_root)</span><br />
&nbsp; &nbsp; root <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>www;<br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># включаем использование ssi</span><br />
&nbsp; &nbsp; ssi on;<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; <span style="color: #666666; font-style: italic;"># Если такой файл не существует физически, то переходить на крайний аргумент, то есть @wordpress</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try_files <span style="color: #007800;">$uri</span> <span style="color: #000000; font-weight: bold;">@</span>wordpress;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># обработчик для wordpress</span><br />
&nbsp; &nbsp; location <span style="color: #000000; font-weight: bold;">@</span>wordpress <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Проксируем на php-fpm</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME <span style="color: #007800;">$document_root</span><span style="color: #000000; font-weight: bold;">/</span>index.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_NAME <span style="color: #000000; font-weight: bold;">/</span>index.php;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Настройки кеширования</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_temp_path <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>nginx <span style="color: #000000;">1</span> <span style="color: #000000;">2</span>; <span style="color: #666666; font-style: italic;"># Каталог для хранение временных файлов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache adw0rd; <span style="color: #666666; font-style: italic;"># Имя зоны кеша</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache_key <span style="color: #ff0000;">&quot;<span style="color: #007800;">$request_method</span>|<span style="color: #007800;">$host</span>|<span style="color: #007800;">$request_uri</span>&quot;</span>; <span style="color: #666666; font-style: italic;"># Из этих данных строится хеш</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_hide_header <span style="color: #ff0000;">&quot;Set-Cookie&quot;</span>; <span style="color: #666666; font-style: italic;"># Не передавать клиенту заголовки кук</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache_min_uses <span style="color: #000000;">1</span>; <span style="color: #666666; font-style: italic;"># Кол-во запросов, после которых ответ будет закеширован</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache_valid 10m; <span style="color: #666666; font-style: italic;"># Время жизни кеша</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_cache_use_stale error timeout invalid_header http_500; <span style="color: #666666; font-style: italic;"># Случаи при которых будет использоватся старый кеш</span><br />
<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># обработчик для динамических данных на странице, ниже я покажу как юзать это</span><br />
&nbsp; &nbsp; location ~ ^<span style="color: #000000; font-weight: bold;">/</span>ssi<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME <span style="color: #007800;">$document_root</span><span style="color: #007800;">$fastcgi_script_name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Обработчик *.php файлов, например &quot;wp-comments-post.php&quot;</span><br />
&nbsp; &nbsp; location ~ \.php$ <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># если файл физически не существует, то переходим в @wordpress</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; try_files <span style="color: #007800;">$uri</span> <span style="color: #000000; font-weight: bold;">@</span>wordpress;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># иначе обрабатываем запрос</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME <span style="color: #007800;">$document_root</span><span style="color: #007800;">$fastcgi_script_name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params;<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>Обо всех директивах можете прочитать в оф. доке <noindex><a rel="nofollow" href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html" >Директивы модуля ngx_http_fastcgi_module</a></noindex>.</p>
<h3>Тестирование</h3>
<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">nginx <span style="color: #660033;">-s</span> reload</div></div>
<p>Для тестирования кеша я встроил в шаблон html-комментарий, который формирую так:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;!-- cache: <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span> --&gt;</div></div>
<p>И теперь вижу в сорце странице закешировалась страница или нет.</p>
<h3>Вставка динамических блоков при помощи SSI</h3>
<p>Отредактируйте шаблон своей страницы и вставьте нечто подобное:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">&lt;!-- uncached_data: &lt;!--# include virtual=&quot;/ssi/uncached.php&quot; wait=&quot;no&quot; --&gt;</span> --&gt;</div></div>
<p>Теперь приведите файл &laquo;/ssi/uncached.php&raquo; к следующему виду:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Так как у нас есть обработчик действующий для /ssi/* и он не отдает кешированные данные, то у нас будет подгружатся динамика, все просто! :)</p>
<h3>Дополнение</h3>
<p>Раздел добавлен 8 августа 2011 г., чтобы дополнить эту статью недостоющими материалами. В основном причиной была статья <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/124684/" >Прозрачное кэширование в nginx для всех и каждого</a></noindex>, спасибо авторам.</p>
<h4>Директива fastcgi_ignore_headers для игнорирования инструкци от FastCGI-сервера</h4>
<p>Директива fastcgi_ignore_headers запрещает обработку некоторых строк заголовка из ответа FastCGI-сервера.<br />
В директиве можно указать строки &laquo;X-Accel-Redirect&raquo;, &laquo;X-Accel-Expires&raquo;, &laquo;Expires&raquo; и &laquo;Cache-Control&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">fastcgi_ignore_headers Expires Cache-Control;</div></div>
<p>То есть указываем Nginx кэшировать страницы в любом случае, независимо от заголовков кэширования выставленных FasCGI-сервером.</p>
<h4>Директивы fastcgi_cache_bypass и fastcgi_no_cache</h4>
<p>Директива задаёт условия, при которых <strong>ответ не будет браться из кэша</strong>.<br />
Если значение хотя бы одной из строк переменных не пустое и не равно &laquo;0&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">fastcgi_cache_bypass $cookie_session $cookie_nocache;</div></div>
<p>Директива задаёт условия, при которых <strong>ответ не будет сохраняться в кэш</strong>.<br />
Если значение хотя бы одной из строк переменных не пустое и не равно &laquo;0&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">fastcgi_no_cache $cookie_session $cookie_nocache;</div></div>
<h4>Управление кеширование через заголовок X-Accel-Expires</h4>
<p>Будем управлять кеширование из PHP:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;X-Accel-Expires: <span style="color: #006699; font-weight: bold;">$seconds</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ставим на $seconds секунд</span><br />
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;X-Accel-Expires: 0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// или отключаем кеширование для определенной страницы</span></div></div>
<h4>Принудительное обновление кэша</h4>
<p>Обновим наш bypass,  добавим еще одну переменную для заголовка &laquo;X-Update&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">fastcgi_cache_bypass $cookie_session $http_x_update;</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">curl -s -o /dev/null -H &quot;X-Update: 1&quot; example.com</div></div>
<p>Как и рекомендуют авторы статьи необходимо изменить &laquo;$http_x_update&raquo; и &laquo;X-Update&raquo; на что-то своё, чтобы скрипткидесы не баловались.</p>
<h3>Полезные материалы</h3>
<p>Вот небольшой список статей, который вам могут пригодится:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html" >Директивы модуля ngx_http_fastcgi_module</a></noindex> (оф. документация)</li>
<li>Описание модуля <noindex><a rel="nofollow" href="http://wiki.nginx.org/NginxHttpFcgiModule" >NginxHttpFcgiModule</a></noindex> на wiki.nginx.org</li>
<li><noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/71501/" >Кеширование FastCGI-запросов в nginx</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://dklab.ru/chicken/nablas/56.html" >56. Подводные камни при использовании кэширования в nginx</a></noindex></li>
<li><a href="/2010/ubuntu-php53/">Ubuntu. Рабочее окружение Nginx+PHP5.3+FPM+MySQL</a></li>
<li><a href="/2010/nginx-and-php-fpm/">Nginx. Использование PHP в режиме FastCGI с помощью php-fpm</a></li>
<li><a href="/2009/nginx-gzip/">Настройка Gzip в Nginx</a></li>
<li><a href="/2009/nginx-and-apache-install/">Nginx и Apache2. Установка и быстрая настройка!</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/nginx-fastcgi-cache/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Mercurial. Автоматическое обновление проекта при помощи хуков</title>
		<link>http://adw0rd.ru/2010/mercurial-hooks/</link>
		<comments>http://adw0rd.ru/2010/mercurial-hooks/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 12:44:30 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Hooks]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Триггеры]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6085</guid>
		<description><![CDATA[После того как мы переехали с Subversion на Mercurial, нам осталось перевести svn&#39;овские хуки для &#171;деплоя&#187; проекта. Для продакшена мы будем делать update головы бранча &#171;EXAMPLE&#187;, то есть самого главного бранча. Напоминаю, путь до hg репозитория&#160;&#8212; &#171;/var/hg&#187;, имя проекта&#160;&#8212; &#171;EXAMPLE&#187;, а имя вашего пользователя&#160;&#8212; &#171;USER1&#187;. Подготовка проекта и настройки В предыдущей статье вы должны были [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/mercurial-hooks/"><img src="http://adw0rd.ru/wp-content/uploads/2010/10/Mercurial_logo2.jpg"  alt="" title="Mercurial" width="140" height="168" class="alignright size-full wp-image-6019" /></a></noindex></p>
<p>После того как мы <a href="/2010/mercurial-freebsd/">переехали с Subversion на Mercurial</a>, нам осталось <a href="/2009/subversion-hooks/">перевести svn&#39;овские хуки</a> для &laquo;деплоя&raquo; проекта. Для продакшена мы будем делать update головы бранча &laquo;EXAMPLE&raquo;, то есть самого главного бранча. </p>
<p>Напоминаю, путь до hg репозитория&nbsp;&mdash; &laquo;/var/hg&raquo;, имя проекта&nbsp;&mdash; &laquo;EXAMPLE&raquo;, а имя вашего пользователя&nbsp;&mdash; &laquo;USER1&raquo;.</p>
<h3>Подготовка проекта и настройки</h3>
<p>В предыдущей статье вы должны были настроить Mercurial и инициализировать проект. Так как у нас каталог проекта &laquo;/home/USER1/projects/EXAMPLE&raquo; и плодить две рабочие копии на одном сервере не хочется, то:</p>
<ul>
<li>переместим репозиторий в каталог наших рабочих проектов</li>
<li>назначим символическую ссылку в &laquo;/var/hg/repos&raquo; на каталог рабочего проекта</li>
</ul>
<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>hg<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>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE</div></div>
<p><span id="more-6085"></span></p>
<h3>Хук changegroup</h3>
<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;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hooks<br />
<span style="color: #c20cb9; font-weight: bold;">touch</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>changegrouphook<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>changegrouphook<br />
emacs <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hgrc</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: #7a0874; font-weight: bold;">&#91;</span>hooks<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
changegroup = <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>changegrouphook</div></div>
<p>Хук &laquo;changegroup&raquo; активируется, когда вызываются команды <strong>push/pull/unbundle</strong>, и только единожды, в отличии от хука &laquo;commit&raquo;, который вызывается на каждый &laquo;changeset&raquo;.</p>
<p>Приведите содержимое файла хука &laquo;changegrouphook&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: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE <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>hg update EXAMPLE</div></div>
<p>Более подробно о хуках можете почитать на <noindex><a rel="nofollow" href="http://mercurial.selenic.com/wiki/Hook" >странице оф. документации</a></noindex> и на <noindex><a rel="nofollow" href="http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html" >странице книги Bryan O&#39;Sullivan &laquo;Mercurial: The Definitive Guide&raquo;</a></noindex>.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mercurial-hooks/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>FreeBSD. Переезжаем с Subversion на Mercurial +Trac</title>
		<link>http://adw0rd.ru/2010/mercurial-freebsd/</link>
		<comments>http://adw0rd.ru/2010/mercurial-freebsd/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 08:27:03 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[Trac]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6013</guid>
		<description><![CDATA[На днях все-таки переехали с vasa_c&#39;ом на Mercurial. Возникли трудности с перемещением ревизий из Subversion в Mercurial, а также с настройкой Trac. Работать будем от имени и группы&#160;&#8212; www. Путь до файлов с данными svn&#160;&#8212; &#171;/var/svn&#187;, до hg&#160;&#8212; &#171;/var/hg&#187;, для trac&#160;&#8212; &#171;/var/trac&#187;. Имя проекта для примера&#160;&#8212; &#171;EXAMPLE&#187;. Запускать hg serve будем на порту 8010. Установка [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/mercurial-freebsd/"><img src="http://adw0rd.ru/wp-content/uploads/2010/10/Mercurial_logo2.jpg"  alt="" title="Mercurial" width="140" height="168" class="alignright size-full wp-image-6019" /></a></noindex></p>
<p>На днях все-таки переехали с <a href="http://blgo.ru/blog/" >vasa_c</a>&#39;ом на <strong>Mercurial</strong>. Возникли трудности с перемещением ревизий из Subversion в Mercurial, а также с настройкой <strong>Trac</strong>.</p>
<p>Работать будем от имени и группы&nbsp;&mdash; <strong>www</strong>.<br />
Путь до файлов с данными svn&nbsp;&mdash; &laquo;/var/svn&raquo;, до hg&nbsp;&mdash; &laquo;/var/hg&raquo;, для trac&nbsp;&mdash; &laquo;/var/trac&raquo;.<br />
Имя проекта для примера&nbsp;&mdash; &laquo;EXAMPLE&raquo;.<br />
Запускать <strong>hg serve</strong> будем на порту <strong>8010</strong>.</p>
<h3>Установка и настройка Mercurial</h3>
<p>Установим сам <strong>Mercurial</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>devel<span style="color: #000000; font-weight: bold;">/</span>mercurial<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-6013"></span></p>
<p>Создаем каталог для хранения данных Mercurial и репозиториев:</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;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> www:www <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg</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: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<br />
hg init</div></div>
<p>Отредактируйте файл &laquo;/var/hg/repos/EXAMPLE/.hg/hgrc&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">[web]<br />
# стиль gitweb<br />
style = gitweb<br />
# при пушенге не использовать SSL<br />
push_ssl = false<br />
# разрешить всем пушинг, по поводу авторизации см. ниже<br />
allow_push = *</div></div>
<p>Копируем http-auth конфиг из &laquo;/var/svn&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: #c20cb9; font-weight: bold;">cp</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>svn-auth-file <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>hg-auth-file</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">htpasswd <span style="color: #660033;">-cb</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>hg-auth-file USER1 PASSWORD1<br />
htpasswd <span style="color: #660033;">-b</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>hg-auth-file USER2 PASSWORD2</div></div>
<h4>Настройки на клиенте</h4>
<p>Добавим свое имя для <strong>hg</strong> и авторизационные данные, отредактируя hgrc:</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">emacs <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>USER1<span style="color: #000000; font-weight: bold;">/</span>.hgrc</div></div>
<blockquote class="info">
<p>Вы так же можете прописать настройки персонально для проекта, например в &laquo;/home/USER1/projects/EXAMPLE/.hg/hgrc&raquo;, где &laquo;/home/USER1/projects/EXAMPLE&raquo;&nbsp;&mdash; ваша рабочая копия проекта EXAMPLE.</p>
</blockquote>
<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">[ui]<br />
username = USER1<br />
<br />
[auth]<br />
EXAMPLE.prefix = http://hg.example.com/<br />
EXAMPLE.username = USER1<br />
EXAMPLE.password = PASSWORD1</div></div>
<p>Более подробно о <strong>hgrc</strong> можно почитать в статье <noindex><a rel="nofollow" href="http://www.selenic.com/mercurial/hgrc.5.html" >Configuration files for Mercurial</a></noindex></p>
<h4>Настройка hgweb</h4>
<p>Вернемся снова на сервер и отредактируем hgweb.config:</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">emacs <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>hgweb.config</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">[collections]<br />
# путь который вырезается из строки запроса (http) = путь до файлов репозитория Mercurial<br />
/var/hg/repos = /var/hg/repos</div></div>
<h4>Запуск hg serve</h4>
<p>Для запуска вам понадобится скрипт инициализации, который вы можете скачать <a href="/files/hg.txt">тут</a>, после чего скопируйте его в каталог &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: #7a0874; font-weight: bold;">cd</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>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> hg http:<span style="color: #000000; font-weight: bold;">//</span>adw0rd.ru<span style="color: #000000; font-weight: bold;">/</span>files<span style="color: #000000; font-weight: bold;">/</span>hg.txt<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> +x hg</div></div>
<p>Теперь создадим pidfile:</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;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>hgserve<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">touch</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>hgserve<span style="color: #000000; font-weight: bold;">/</span>hgserve.8010<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> www:www <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>hgserve<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: #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>hg start</div></div>
<p>Для того, чтобы при загрузке системы <strong>hgserve</strong> сам запускался, вам следует добавить в /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">hgserve_enable=&quot;YES&quot;</div></div>
<h3>Настройка Nginx</h3>
<p>Добавим upstream:</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">upstream hg <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; server 127.0.0.1:<span style="color: #000000;">8010</span>;<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</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">server <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; server_name hg.example.com;<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; auth_basic <span style="color: #ff0000;">&quot;Password, please!&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; auth_basic_user_file <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>hg-auth-file;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http:<span style="color: #000000; font-weight: bold;">//</span>hg;<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>Перезагружаем 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">nginx <span style="color: #660033;">-s</span> reload</div></div>
<h3>Импортируем данные из Subversion</h3>
<p>Для импортирования данных из <strong>Subversion</strong> нам понадобится установить <strong>hgsvn</strong> (если у вас нет Subversion, то пропустите шаги связанные с ним):</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>devel<span style="color: #000000; font-weight: bold;">/</span>hgsvn<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean<br />
rehash</div></div>
<p>Импортируем данные из Subversion, такие как ревизии и ченжлоги к ним:</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>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<br />
hgimportsvn file:<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<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> EXAMPLE<br />
hgpullsvn</div></div>
<p>Чуть более подробно о <strong>hgsvn</strong> можно прочитать в статье <noindex><a rel="nofollow" href="http://ww2.samhart.com/book/export/html/49" >Converting from Subversion to Mercurial</a></noindex>.</p>
<h3>Настройка Trac</h3>
<p>Будем считать, что <a href="/2009/trac-freebsd/">Trac у нас уже установлен, настроен и работает</a>, поэтому опишу только изменения.</p>
<p>Для поддержки Mercurial в Trac нам понадобится установить плагин <strong>mercurial-plugin</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: #c20cb9; font-weight: bold;">svn co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.edgewall.org<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>trac<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">0.11</span><span style="color: #000000; font-weight: bold;">/</span>mercurial-plugin mercurial-plugin<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> mercurial-plugin<br />
python setup.py bdist_egg<br />
easy_install dist<span style="color: #000000; font-weight: bold;">/</span>TracMercurial-0.11.0.<span style="color: #7a0874; font-weight: bold;">&#91;</span>x<span style="color: #7a0874; font-weight: bold;">&#93;</span>-py2.<span style="color: #7a0874; font-weight: bold;">&#91;</span>x<span style="color: #7a0874; font-weight: bold;">&#93;</span>.egg</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">emacs <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>trac<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>trac.ini</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: #7a0874; font-weight: bold;">&#91;</span>trac<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
repository_type = hg<br />
repository_dir = <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>hg<span style="color: #000000; font-weight: bold;">/</span>repos<span style="color: #000000; font-weight: bold;">/</span>EXAMPLE<br />
<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>components<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
tracext.hg.<span style="color: #000000; font-weight: bold;">*</span> = enabled<br />
<br />
<span style="color: #7a0874; font-weight: bold;">&#91;</span>hg<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #666666; font-style: italic;"># -- Show revision number in addition to the changeset hash</span><br />
show_rev = <span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #666666; font-style: italic;"># -- Changeset hash format</span><br />
node_format = short<br />
<span style="color: #666666; font-style: italic;"># hex: &nbsp; Show the full SHA1 hash </span><br />
<span style="color: #666666; font-style: italic;"># short: Show a shortened hash for the changesets</span></div></div>
<p>После установки плагина и настройки проекта не забудьте перезагрузить <a href="/2010/trac-nginx-and-tracd/">Tracd</a> или другой веб-сервер, через который вы работаете с Trac.</p>
<p>Теперь, если у вас в <strong>Timeline</strong> появились символы вопросов вместо кириллических комментариев к ревизиям, вам необходимо установить HGENCODING="utf-8":</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: #007800;">HGENCODING</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><br />
<span style="color: #7a0874; font-weight: bold;">export</span> HGENCODING</div></div>
<p>Посмотреть полностью <a href="/files/tracd.txt">скрипт инициализации для tracd можно тут</a> (там устанавливается HGENCODING).</p>
<blockquote class="info">
<p>Более подробно изучить проблему с битыми символами при выводе сообщения к ченжлогу, вы можете посмотрев исходный код Mercurial, а именно в файле &laquo;/usr/local/lib/python2.6/site-packages/mercurial/encoding.py&raquo; функция &laquo;tolocal&raquo;.</p>
</blockquote>
<h3>Рекомендую к прочтению</h3>
<p>Несколько статей про Mercurial и Trac:</p>
<p><a href="/2010/mercurial-hooks/">Mercurial. Автоматическое обновление проекта при помощи хуков</a><br />
<a href="http://blgo.ru/blog/tag/mercurial/" >Статьи vasa_c про Mercurial</a><br />
<a href="/2009/trac-freebsd/">Установка и настройка Trac на FreeBSD</a><br />
<a href="/2010/trac-nginx-and-tracd/">Перенос Trac на Nginx и tracd</a></p>
<p>Присылайте ссылки на другие статьи и я их тут опубликую.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mercurial-freebsd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

