<?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>The WebDevil &#187; webtech</title>
	<atom:link href="http://dmitry.shaposhnik.name/category/webtech/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitry.shaposhnik.name</link>
	<description>Enjoy development</description>
	<lastBuildDate>Mon, 24 May 2010 01:29:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>LAMP through fcgid with suexec</title>
		<link>http://dmitry.shaposhnik.name/2009/08/11/lamp-through-fcgid-with-suexec/</link>
		<comments>http://dmitry.shaposhnik.name/2009/08/11/lamp-through-fcgid-with-suexec/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 08:11:49 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=294</guid>
		<description><![CDATA[Взглянем на Apache+mod_php. Плюсы:

настраивается максимально просто
интерпретатор стартует вместе с каждым форком апача

Минусы: 

mpm_prefork далеко не самый быстрый
все работает под одним пользователем (да-да, можно накрутить mod_itk)

В попытках сделать секьюрно и по возможности быстро я решил скрутить apache (mpm_worker) + mod_fcgid + suexec.
Сам по себе CGI очень небыстр за счет того, что при каждом запросе подымается интерпретатор. [...]]]></description>
			<content:encoded><![CDATA[<p>Взглянем на Apache+mod_php. Плюсы:</p>
<ul>
<li>настраивается максимально просто</li>
<li>интерпретатор стартует вместе с каждым форком апача</li>
</ul>
<p>Минусы: </p>
<ul>
<li>mpm_prefork далеко не самый быстрый</li>
<li>все работает под одним пользователем (да-да, можно накрутить mod_itk)</li>
</ul>
<p>В попытках сделать секьюрно и по возможности быстро я решил скрутить apache (mpm_worker) + <a href="http://fastcgi.coremail.cn/">mod_fcgid</a> + suexec.<br />
Сам по себе CGI очень небыстр за счет того, что при каждом запросе подымается интерпретатор. FastCGI быстрее, так как интерпретатор держится отдельным процессом. А mod_fcgid &#8211; модуль, бинарно совместимый с mod_fastcgi, с новой стратегией управления процессами.</p>
<p>Suexec в свою очередь позволяет выполнять CGI/FastCGI/SSI с указанными uid/gid. Да-да, в системе будут заводиться реальные пользователи.</p>
<p>Расстановкой прав можно добиться того, что даже взломав один сайт злоумышленник не сможет увидеть другие сайты.<br />
<span id="more-294"></span><br />
Приступим.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">apt-get install apache2-mpm-worker apache2-suexec ache2-threaded-dev libapache2-mod-fcgid php5-cgi</div></div>
<p>Теперь когда у нас все есть, создадим скелет для будущих площадок.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mkdir -p /root/web/skel<br />
cd /root/web/skel<br />
mkdir {cgi-bin,etc,logs,tmp,www}<br />
chmod 770 tmp<br />
chmod 751 {etc,logs,www}<br />
cp /etc/php5/cgi/php.ini ./etc</div></div>
<p>Правим php.ini на предмет вывода ошибок и прочих мелких твиков.<br />
Теперь сделаем враппер для самого обработчика (cgi-bin/php-cgi):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$CGI_BIN_DIR</span><br />
<span style="color: #007800;">PHP_INI</span>=..<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php.ini<br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$PHP_INI</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #007800;">PHP_INI</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php5<span style="color: #000000; font-weight: bold;">/</span>cgi<span style="color: #000000; font-weight: bold;">/</span>php.ini<br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php5-cgi <span style="color: #660033;">-c</span> <span style="color: #007800;">$PHP_INI</span></div></div>
<p>И делаем</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">chown -R 755 cgi-bin<br />
cd /root/web<br />
touch {adduser,awstats,vhost}.skel<br />
touch add_site.sh &amp;&amp; chmod +x add_site.sh</div></div>
<p><strong>adduser.skel</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">DSHELL</span>=<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span><br />
<span style="color: #007800;">DHOME</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<br />
<span style="color: #007800;">GROUPHOMES</span>=no<br />
<span style="color: #007800;">LETTERHOMES</span>=no<br />
<span style="color: #007800;">SKEL</span>=<span style="color: #000000; font-weight: bold;">/</span>root<span style="color: #000000; font-weight: bold;">/</span>web<span style="color: #000000; font-weight: bold;">/</span>skel<br />
<span style="color: #007800;">FIRST_SYSTEM_UID</span>=<span style="color: #000000;">2000</span><br />
<span style="color: #007800;">LAST_SYSTEM_UID</span>=<span style="color: #000000;">2999</span><br />
<span style="color: #007800;">FIRST_SYSTEM_GID</span>=<span style="color: #000000;">2000</span><br />
<span style="color: #007800;">LAST_SYSTEM_GID</span>=<span style="color: #000000;">2999</span><br />
<span style="color: #007800;">FIRST_UID</span>=<span style="color: #000000;">2000</span><br />
<span style="color: #007800;">LAST_UID</span>=<span style="color: #000000;">29999</span><br />
<span style="color: #007800;">FIRST_GID</span>=<span style="color: #000000;">2000</span><br />
<span style="color: #007800;">LAST_GID</span>=<span style="color: #000000;">2999</span><br />
<span style="color: #007800;">USERGROUPS</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">USERS_GID</span>=<span style="color: #000000;">100</span><br />
<span style="color: #007800;">DIR_MODE</span>=0751<br />
<span style="color: #007800;">SETGID_HOME</span>=no<br />
<span style="color: #007800;">QUOTAUSER</span>=<span style="color: #ff0000;">&quot;&quot;</span><br />
<span style="color: #007800;">SKEL_IGNORE_REGEX</span>=<span style="color: #ff0000;">&quot;dpkg-(old|new|dist)&quot;</span></div></div>
<p><strong>awstats.skel</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">LogFile</span>=<span style="color: #ff0000;">&quot;/var/www/#USER/logs/#SITE-access.log&quot;</span><br />
<span style="color: #007800;">SiteDomain</span>=<span style="color: #ff0000;">&quot;#SITE&quot;</span><br />
<span style="color: #007800;">HostAliases</span>=<span style="color: #ff0000;">&quot;localhost 127.0.0.1 REGEX[#SITE$]&quot;</span><br />
Include <span style="color: #ff0000;">&quot;/etc/awstats/awstats.conf.local&quot;</span></div></div>
<p><strong>vhost.skel</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><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;">&lt;</span>virtualhost <span style="color: #000000; font-weight: bold;">*&gt;</span><br />
&nbsp; &nbsp; ServerName <span style="color: #666666; font-style: italic;">#SITE</span><br />
&nbsp; &nbsp; ServerAlias www.<span style="color: #666666; font-style: italic;">#SITE</span><br />
&nbsp; &nbsp; DocumentRoot <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/www/#SITE/public_html</span><br />
<br />
&nbsp; &nbsp; SuexecUserGroup <span style="color: #666666; font-style: italic;">#USER #USER</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; ScriptAlias <span style="color: #000000; font-weight: bold;">/</span>cgi-bin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/cgi-bin/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>directory <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/www/#SITE/public_html&gt;</span><br />
&nbsp; &nbsp; Options <span style="color: #660033;">-Indexes</span> +ExecCGI<br />
&nbsp; &nbsp; AllowOverride All<br />
&nbsp; &nbsp; AddHandler fcgid-script .php<br />
&nbsp; &nbsp; FCGIWrapper <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/cgi-bin/php-cgi .php</span><br />
&nbsp; &nbsp; Order allow,deny<br />
&nbsp; &nbsp; Allow from all<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>directory<span style="color: #000000; font-weight: bold;">&gt;</span><br />
<br />
&nbsp; &nbsp; ErrorLog <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/logs/#SITE-error.log</span><br />
&nbsp; &nbsp; CustomLog <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/logs/#SITE-access.log combined</span><br />
<br />
&nbsp; &nbsp; SetEnv AWSTATS_FORCE_CONFIG <span style="color: #666666; font-style: italic;">#SITE</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>location <span style="color: #000000; font-weight: bold;">/</span>cgi-bin<span style="color: #000000; font-weight: bold;">/</span>awstats.pl <span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; AuthUserFile <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;">#USER/etc/awstats.passwd</span><br />
&nbsp; &nbsp; AuthName <span style="color: #ff0000;">&quot;Website stats for #SITE&quot;</span><br />
&nbsp; &nbsp; AuthType Basic<br />
&nbsp; &nbsp; require valid-user<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;/</span>location<span style="color: #000000; font-weight: bold;">&gt;</span><br />
<span style="color: #000000; font-weight: bold;">&lt;/</span>virtualhost<span style="color: #000000; font-weight: bold;">&gt;</span></div></div>
<p><strong>add_site.sh</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #007800;">$2</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Oops. Some param not given.&quot;</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
<br />
<span style="color: #666666; font-style: italic;"># If no such user exists - add one right now</span><br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$2</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; adduser <span style="color: #660033;">--conf</span> .<span style="color: #000000; font-weight: bold;">/</span>adduser.skel <span style="color: #660033;">--disabled-login</span> <span style="color: #660033;">--gecos</span> <span style="color: #ff0000;">''</span> <span style="color: #007800;">$2</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Buld generic folders</span><br />
<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>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$2</span><span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$1</span><span style="color: #000000; font-weight: bold;">/</span>public_html<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> <span style="color: #007800;">$2</span>:<span style="color: #007800;">$2</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$2</span><span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$1</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Build generic vhost for apache</span><br />
<span style="color: #c20cb9; font-weight: bold;">cat</span> vhost.skel <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">&quot;s/#USER/<span style="color: #007800;">${2}</span>/g;s/#SITE/<span style="color: #007800;">${1}</span>/g&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #800000;">${2}</span>_<span style="color: #800000;">${1}</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Activate vhost</span><br />
a2ensite <span style="color: #800000;">${2}</span>_<span style="color: #800000;">${1}</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Build generic awstats config</span><br />
<span style="color: #c20cb9; font-weight: bold;">cat</span> awstats.skel <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">&quot;s/#USER/<span style="color: #007800;">${2}</span>/g;s/#SITE/<span style="color: #007800;">${1}</span>/g&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>awstats<span style="color: #000000; font-weight: bold;">/</span>awstats.<span style="color: #800000;">${1}</span>.conf<br />
<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Restart apache...&quot;</span><br />
apache2ctl configtest <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> apache2ctl restart</div></div>
<p>Вот таким нехитрым образом можно добавить сайт:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cd /root/web<br />
./add_site example.org web_example</div></div>
<p>В результате будет создан пользователь web_example и у него сайт &#8211; example.org.</p>
<h3>Tip</h3>
<p>Иногда надо позволить скрипту выполяться боее 30 секунд. Думаете для этого достаточно подправить php.ini? Нет, в таком случае fcgid отстрелит скрипт по достижении 40 секунд. Для этих случаев в конфиге vhost&#8217;а требуется задать значение <strong>IPCCommTimeout</strong> в секундах (например, 300). Есть баг &#8211; глобальное значение отчего-то не хочет применяться к vhost&#8217;у, потому надо указать его непосредственно в vhost&#8217;е.</p>
<p>В общем и целом &#8211; конфиги показал, идею донес (надеюсь). Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/08/11/lamp-through-fcgid-with-suexec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LVM Rocks</title>
		<link>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/</link>
		<comments>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 23:18:18 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=251</guid>
		<description><![CDATA[Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку &#8211; и последний год стал его использовать, так как постиг скрытую в нем мощь  

Допустим, у нас есть простенький бюджетный сервер. Мы [...]]]></description>
			<content:encoded><![CDATA[<p>Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку &#8211; и последний год стал его использовать, так как постиг скрытую в нем мощь <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-251"></span></p>
<p>Допустим, у нас есть простенький бюджетный сервер. Мы развернули новое приложение, и его база стала расти весьма стремительно. Итого &#8211; база, веб-файлы и система живут на одном физическом диске.</p>
<p>Был куплен диск WD Razor, и на него перенесли базу. Нагрузка диска (<tt>iostat -x -m 1</tt>) составила 1-2%. Решено перенести туда же и веб-файлы, однако решение это пришло лишь через пару дней. Так что получилось наглядно продемонстрировать возможности LVM.</p>
<h3>Part1. Creating&#8230;</h3>
<p>Когда поставили разор на нем создали один раздел &#8211; LVM:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># fdisk -l</span><br />
<br />
Disk <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb: <span style="color: #000000;">74.3</span> GB, <span style="color: #000000;">74355769344</span> bytes<br />
<span style="color: #000000;">255</span> heads, <span style="color: #000000;">63</span> sectors<span style="color: #000000; font-weight: bold;">/</span>track, <span style="color: #000000;">9039</span> cylinders<br />
Units = cylinders of <span style="color: #000000;">16065</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">512</span> = <span style="color: #000000;">8225280</span> bytes<br />
Disk identifier: 0x00000000<br />
<br />
&nbsp; &nbsp;Device Boot &nbsp; &nbsp; &nbsp;Start &nbsp; &nbsp; &nbsp; &nbsp; End &nbsp; &nbsp; &nbsp;Blocks &nbsp; Id &nbsp;System<br />
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">1</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">9039</span> &nbsp; &nbsp;<span style="color: #000000;">72605736</span> &nbsp; 8e &nbsp;Linux LVM</div></div>
<p>Пару слов об организации LVM.<br />
<strong>Уровень 1</strong>: volume group (vg). Это наивысший уровень абстракции, объединяющий в себе logical volumes и physical volumes.<br />
<strong>Уровень 2</strong>: physical volume (pv). Это некое блочное устройство, способное хранить данные (HDD, RAID, &#8230;)<br />
<strong>Уровень 3</strong>: logical volume (lv). Это эквивалент раздела на жестком диске.</p>
<p>Таким образом в группу добавляются физические тома (pv), и потом во всем этом пространстве свободного места создаются разделы (lv), на которых уже создается файловая система.</p>
<p>Итак, сначала создавался pv:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pvcreate <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>Затем vg:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vgcreate sys_vg <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>И затем на все свободное место указанного pv (/dev/sdb1) создали lv с именем var_lib_mysql:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lvcreate <span style="color: #660033;">-L</span> <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span>PVS -nvar_lib_mysql sys_vg <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>Дело за малым:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mkreiserfs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql stop<br />
<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>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<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>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> mysql:mysql <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql start</div></div>
<p>Вот собственно и почти все. Последний штрих &#8211; прописать монтирование раздела в fstab, дабы это происходило при загрузке автоматом. Можно скучно сделать это через blkid, увидеть там нужный UUID (например, f6946e54-c7d6-4688-8fac-05dcb1bf9973), скопировать его, открыть /etc/fstab и вставить туда строку вида:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">UUID</span>=f6946e54-c7d6-<span style="color: #000000;">4688</span>-8fac-05dcb1bf9973 &nbsp; <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql reiserfs defaults <span style="color: #000000;">0</span> <span style="color: #000000;">2</span></div></div>
<p>а можно сделать так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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;">printf</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>UUID=<span style="color: #780078;">`blkid | grep sys_vg-var_lib_mysql | sed -r 's/.*UUID=&quot;([^&quot;]*).*/\1/i'`</span><span style="color: #000099; font-weight: bold;">\t</span>/var/lib/mysql reiserfs defaults 0 2<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab</div></div>
<p>Да, если сделать umount /var/lib/mysql &#038;&#038; mount /var/lib/mysql до ребута &#8211; то /dev/disk/by-uuid/f6946e54-c7d6-4688-8fac-05dcb1bf9973 (или какой там получится) там еще не будет. Для того чтоб появился до ребута надо перезапустить udev:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>udev restart</div></div>
<h3>Part2. Resizing&#8230;</h3>
<p>Как я говорил раньше, с опозданием пришла мысль о том, что неплохо бы вынести и статические файлы на этот же винт. И сделать это совсем просто! Для этого от того lv что был создан раньше (и именуется var_lib_mysql) откусим немного места.</p>
<p>Сначала остановим все службы (говорят, reiserfs увеличивается/уменьшается без проблем налету, но я этого пока не пробовал на себе):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql stop<br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql</div></div>
<p>Затем уменьшим файловую систему, а затем и lv на 20ГБ:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">resize_reiserfs <span style="color: #660033;">-s-20G</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql<br />
lvreduce <span style="color: #660033;">-L-20G</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql</div></div>
<p>На всякий случай я предпочел проверить фс на ошибки (а вдруг!):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">reiserfsck <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql</div></div>
<p>Ну и возвращаем обратно MySQL:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql start</div></div>
<p>Теперь создадим lv для веб-файлов, и так как их намного меньше 20ГБ, я решил оставить 5ГБ про запас, никому их не присвоив. Потом можно будет налету добавить туда где закончится место.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lvcreate <span style="color: #660033;">-L</span> 15G -nvar_www sys_vg<br />
mkreiserfs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www</div></div>
<p>Далее &#8211; перенос файлов:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx stop<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 stop<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<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>www<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<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>www<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 start<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx start</div></div>
<p>И опять не забываем про fstab:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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;">printf</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>UUID=<span style="color: #780078;">`blkid | grep sys_vg-var_www | sed -r 's/.*UUID=&quot;([^&quot;]*).*/\1/i'`</span><span style="color: #000099; font-weight: bold;">\t</span>/var/lib/mysql reiserfs defaults 0 2<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab</div></div>
<p>По материалам:</p>
<ol>
<li><a href="http://wiki.linuxquestions.org/wiki/LVM#example">http://wiki.linuxquestions.org/wiki/LVM#example</a></li>
<li><a href="http://www.tldp.org/HOWTO/LVM-HOWTO/reducelv.html">http://www.tldp.org/HOWTO/LVM-HOWTO/reducelv.html</a></li>
</ol>
<p>PS: после изменения размера мог измениться UUID для lv var_lib_mysql, хотя я и не уверен в этом. Но проверить не помешает.<br />
PS2: если работаете удаленно &#8211; не забывайте про <a href="http://www.gnu.org/software/screen/screen.html">screen</a>.<br />
PS3: писалось по памяти, так что могут быть некоторые неточности. Тупой копипаст без вовлечения мыслительного процесса чреват боком. Я предупредил <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multilingual site on Rails</title>
		<link>http://dmitry.shaposhnik.name/2008/08/29/multilingual-site-on-rails/</link>
		<comments>http://dmitry.shaposhnik.name/2008/08/29/multilingual-site-on-rails/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 22:29:35 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[RoR]]></category>
		<category><![CDATA[locales]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=232</guid>
		<description><![CDATA[Задавался давно уже вопросом о том, как сделать многоязычный сайт на рельсах. Сначала нехватало знаний, потом времени.
Недавно понадобилось таки реализовать такой сайт. Сразу скажу, получилось.

Первым делом задумался над переводом в шаблонах. Благо, тут вариантов было много и я выбрал simple-localization. С рельсами 2.1 работает версия 3.0. Но она ставится экспортом из svn:
cd vendor/plugins
svn co http://svn.arkanis.de/projects/rails_plugins/simple_localization/branches/3.0 [...]]]></description>
			<content:encoded><![CDATA[<p>Задавался давно уже вопросом о том, как сделать многоязычный сайт на рельсах. Сначала нехватало знаний, потом времени.<br />
Недавно понадобилось таки реализовать такой сайт. Сразу скажу, получилось.<br />
<span id="more-232"></span><br />
Первым делом задумался над переводом в шаблонах. Благо, тут вариантов было много и я выбрал <a href="http://simple-localization.arkanis.de/">simple-localization</a>. С рельсами 2.1 работает версия 3.0. Но она ставится экспортом из svn:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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> vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<br />
<span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.arkanis.de<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>rails_plugins<span style="color: #000000; font-weight: bold;">/</span>simple_localization<span style="color: #000000; font-weight: bold;">/</span>branches<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">3.0</span> simple_localization</div></div>
<p>Теперь можно вставлять конструкции <tt>l(:domain, :key)</tt>, которые из файла перевода из раздела <tt>app:</tt> будут брать домен и ключ, указанные в методе. Кстати, я вынес файлы перевода в директорию translations в корень проекта.<br />
Также в перевод я добавил массив с датами в родительном падеже (:declinable_monthnames).<br />
Подключается плагин в config/initializers/simple_localization.rb строками:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SimpleLocalization.<span style="color:#9900CC;">init</span> <span style="color:#ff3333; font-weight:bold;">:languages</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:ru</span>, <span style="color:#ff3333; font-weight:bold;">:en</span>, <span style="color:#ff3333; font-weight:bold;">:uk</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:lang_file_dir</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;#{RAILS_ROOT}/translations&quot;</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Date</span><br />
&nbsp; silence_warnings <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; &nbsp; DECLINABLE_MONTHNAMES = <span style="color:#6666ff; font-weight:bold;">ArkanisDevelopment::SimpleLocalization::ProxyObject</span>.<span style="color:#9900CC;">new</span> <span style="color:#ff3333; font-weight:bold;">:dates</span>, <span style="color:#ff3333; font-weight:bold;">:declinable_monthnames</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>localized_data<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> localized_data<br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Язык я категорически отказался хранить в сессии &#8211; это несерьезно. Так невозможно дать ссылку товарищу и быть уверенным, что он увидит о же что и вы.<br />
В роутах реализовал так:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>map<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; <br />
&nbsp; map.<span style="color:#9900CC;">with_options</span> <span style="color:#ff3333; font-weight:bold;">:path_prefix</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'/:lang'</span> <span style="color:#9966CC; font-weight:bold;">do</span> &nbsp;<span style="color:#006600; font-weight:bold;">|</span>lang<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; lang.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'news'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;news&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;index&quot;</span><br />
&nbsp; &nbsp; lang.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'news/:id'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;news&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;show&quot;</span><br />
&nbsp; &nbsp; lang.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">''</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;pages&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;index&quot;</span><br />
&nbsp; &nbsp; lang.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'feedback'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;pages&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;feedback&quot;</span><br />
&nbsp; &nbsp; lang.<span style="color:#9900CC;">connect</span> <span style="color:#996600;">'*link'</span>, <span style="color:#ff3333; font-weight:bold;">:controller</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;pages&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;show&quot;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;pages&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;index&quot;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>В app/controllers/application.rb добавил парочку методов и фильтр:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Base</span><br />
&nbsp; &nbsp; before_filter <span style="color:#ff3333; font-weight:bold;">:localize</span><br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> localize<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> params <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:lang</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> Localization.<span style="color:#9900CC;">loaded_languages</span>.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:lang</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Localization.<span style="color:#9900CC;">use</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:lang</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_sym</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; &nbsp; <span style="color:#008000; font-style:italic;">#it can accept only URL_FOR :(</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> localized_redirect<span style="color:#006600; font-weight:bold;">&#40;</span>url<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url = <span style="color:#996600;">''</span> <span style="color:#9966CC; font-weight:bold;">if</span> url==<span style="color:#996600;">'/'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; redirect_to <span style="color:#996600;">&quot;/#{Localization.used.to_s}/#{url}&quot;</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Тут я задумался как работать с урлами. Ведь они же будут на корень ссылаться.<br />
Так в config/initializers/simple_localization.rb был добавлен еще кусок кода, в котором переопределялись основные хелперы:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">module</span> ActionView<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">module</span> Helpers<br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">module</span> UrlHelper<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> url_for<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">case</span> options<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">Hash</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; show_path = &nbsp;options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:host</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>? ? <span style="color:#0000FF; font-weight:bold;">true</span> : <span style="color:#0000FF; font-weight:bold;">false</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options = <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:only_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> show_path <span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>options.<span style="color:#9900CC;">symbolize_keys</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; escape &nbsp;= options.<span style="color:#9900CC;">key</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:escape</span><span style="color:#006600; font-weight:bold;">&#41;</span> ? options.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:escape</span><span style="color:#006600; font-weight:bold;">&#41;</span> : <span style="color:#0000FF; font-weight:bold;">true</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp; = <span style="color:#0066ff; font-weight:bold;">@controller</span>.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:url_for</span>, options<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; escape = <span style="color:#0000FF; font-weight:bold;">true</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp;= options<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">NilClass</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url = <span style="color:#0066ff; font-weight:bold;">@controller</span>.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:url_for</span>, <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; escape = <span style="color:#0000FF; font-weight:bold;">false</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp;= polymorphic_path<span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url = escape ? escape_once<span style="color:#006600; font-weight:bold;">&#40;</span>url<span style="color:#006600; font-weight:bold;">&#41;</span> : url<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> url =~ <span style="color:#006600; font-weight:bold;">/</span>\<span style="color:#006600; font-weight:bold;">/</span>.<span style="color:#006600; font-weight:bold;">+/</span> <span style="color:#9966CC; font-weight:bold;">and</span> url !~ <span style="color:#006600; font-weight:bold;">/</span>^\<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#008000; font-style:italic;">#{Localization.loaded_languages.join('|')})(\/.+)?$/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url = <span style="color:#996600;">&quot;/#{Localization.used.to_s}#{url}&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> link_to<span style="color:#006600; font-weight:bold;">&#40;</span>name, options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, html_options = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url = <span style="color:#9966CC; font-weight:bold;">case</span> options<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">url_for</span> options<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#ff3333; font-weight:bold;">:back</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@controller</span>.<span style="color:#9900CC;">request</span>.<span style="color:#9900CC;">env</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;HTTP_REFERER&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#996600;">'javascript:history.back()'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">url_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> html_options<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; html_options = html_options.<span style="color:#9900CC;">stringify_keys</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; href = html_options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'href'</span><span style="color:#006600; font-weight:bold;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; convert_options_to_javascript!<span style="color:#006600; font-weight:bold;">&#40;</span>html_options, url<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tag_options = tag_options<span style="color:#006600; font-weight:bold;">&#40;</span>html_options<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tag_options = <span style="color:#0000FF; font-weight:bold;">nil</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; href_attr = <span style="color:#996600;">&quot;href=<span style="color:#000099;">\&quot;</span>#{url}<span style="color:#000099;">\&quot;</span>&quot;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> href<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#996600;">&quot;&lt;a #{href_attr}#{tag_options}&gt;#{name || url}&lt;/a&gt;&quot;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Я знаю что это жутко некрасиво, но я не знаю как изменить в методе всего одну строку. Можно было создать свой хелпер, но хотелось переопределить существующие, чтобы все было по возможности прозрачно.</p>
<p>Теперь дело дошло и до хранения локализованого контента в БД. Вот как у меня устроена таблица Pages:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> CreatePages <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span><br />
&nbsp; &nbsp; create_table <span style="color:#ff3333; font-weight:bold;">:pages</span>, <span style="color:#ff3333; font-weight:bold;">:force</span><span style="color:#006600; font-weight:bold;">=&gt;</span>true <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; &nbsp; t.<span style="color:#CC0066; font-weight:bold;">string</span> <span style="color:#ff3333; font-weight:bold;">:lang</span>, <span style="color:#ff3333; font-weight:bold;">:title</span>, <span style="color:#ff3333; font-weight:bold;">:link</span>, <span style="color:#ff3333; font-weight:bold;">:null</span><span style="color:#006600; font-weight:bold;">=&gt;</span>false<br />
&nbsp; &nbsp; &nbsp; t.<span style="color:#9900CC;">text</span> <span style="color:#ff3333; font-weight:bold;">:body</span><br />
&nbsp; &nbsp; &nbsp; t.<span style="color:#9900CC;">boolean</span> <span style="color:#ff3333; font-weight:bold;">:textilize</span>, <span style="color:#ff3333; font-weight:bold;">:default</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">1</span>, <span style="color:#ff3333; font-weight:bold;">:null</span><span style="color:#006600; font-weight:bold;">=&gt;</span>false<br />
&nbsp; &nbsp; &nbsp; t.<span style="color:#9900CC;">timestamps</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; add_index <span style="color:#ff3333; font-weight:bold;">:pages</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:link</span>, <span style="color:#ff3333; font-weight:bold;">:lang</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:unique</span><span style="color:#006600; font-weight:bold;">=&gt;</span>true<br />
&nbsp; &nbsp; add_index <span style="color:#ff3333; font-weight:bold;">:pages</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:link</span><span style="color:#006600; font-weight:bold;">&#93;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span><br />
&nbsp; &nbsp; drop_table <span style="color:#ff3333; font-weight:bold;">:pages</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>а в app/models/page.rb имеем следующее:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> Page <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span><br />
&nbsp; named_scope <span style="color:#ff3333; font-weight:bold;">:localized</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:lang<span style="color:#006600; font-weight:bold;">=&gt;</span>Localization.<span style="color:#9900CC;">used</span>.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Так можно оперировать локализоваными страницами как Page.localized.</p>
<p>Вроде бы из интересного все, остальное рутина. Если у кого есть советы как что дополнить/измениь &#8211; с радостью выслушаю.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/08/29/multilingual-site-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lighttpd and execwrap</title>
		<link>http://dmitry.shaposhnik.name/2008/07/24/lighttpd-and-execwrap/</link>
		<comments>http://dmitry.shaposhnik.name/2008/07/24/lighttpd-and-execwrap/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 18:32:09 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=203</guid>
		<description><![CDATA[В качестве вэб-сервера я использую lighttpd. И сегодня я наткнулся на старую проблему &#8211; вэб-сервер работает из-под пользователя www-data, и когда пользователь pupkin загружает какой-то файл &#8211; этот файл принадлежит не pupkin&#8217;у, а www-data. И через ftp удалить его он не может, и вынужден искать некие web-file-manager&#8217;ы.
Так вот я погуглил и наткнулся на execwrap. Он [...]]]></description>
			<content:encoded><![CDATA[<p>В качестве вэб-сервера я использую lighttpd. И сегодня я наткнулся на старую проблему &#8211; вэб-сервер работает из-под пользователя www-data, и когда пользователь pupkin загружает какой-то файл &#8211; этот файл принадлежит не pupkin&#8217;у, а www-data. И через ftp удалить его он не может, и вынужден искать некие web-file-manager&#8217;ы.</p>
<p>Так вот я погуглил и наткнулся на <a href="http://cyanite.org/execwrap/">execwrap</a>. Он очень мелкий, почти ничего ему не нужно стороннего для работы, конфигурировать и использовать его крайне просто (да-да, я знаю про suExec, но он мне не сильно понравился).</p>
<p>В результате конфиг для сайта у меня выглядит так:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$HTTP[&quot;host&quot;] == &quot;pupkin.com&quot; {<br />
&nbsp; &nbsp; server.name = &quot;pupkin.com&quot;<br />
&nbsp; &nbsp; site-root = &quot;/home/pupkin/www/&quot; + server.name<br />
&nbsp; &nbsp; server.document-root = site-root + &quot;/www&quot;<br />
&nbsp; &nbsp; accesslog.filename = site-root + &quot;/log/access.log&quot;<br />
&nbsp; &nbsp; setenv.add-environment = ( &quot;AWSTATS_FORCE_CONFIG&quot; =&gt; server.name )<br />
&nbsp; &nbsp; auth.backend.htpasswd.userfile = site-root + &quot;/awstats.passwd&quot;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; fastcgi.server = ( &quot;.php&quot; =&gt; (( <br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;bin-path&quot; =&gt; &quot;/var/www/lighttpd/execwrap&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;socket&quot; =&gt; &quot;/tmp/&quot; + server.name + &quot;.phpsocket&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;max-procs&quot; =&gt; 10,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;bin-environment&quot; =&gt; ( <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;UID&quot; =&gt; &quot;9999&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;GID&quot; =&gt; &quot;9999&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;TARGET&quot; =&gt; site-root + &quot;/cgi-bin/php&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;CHECK_GID&quot; =&gt; &quot;1&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;CGI_BIN_DIR&quot; =&gt; site-root + &quot;/cgi-bin/&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;PHP_FCGI_CHILDREN&quot; =&gt; &quot;2&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;PHP_FCGI_MAX_REQUESTS&quot; =&gt; &quot;5000&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; )<br />
&nbsp; &nbsp; )))<br />
}</div></div>
<p>где 9999 &#8211; ID пользователя и группы (у меня они часто совпадают).</p>
<p>А в директории /home/pupkin/www/pupkin.com/cgi-bin лежит два файла &#8211; симлинк на php.ini и исполняемый файлик &#8220;php&#8221; следующего содержания:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$CGI_BIN_DIR</span><br />
<span style="color: #7a0874; font-weight: bold;">exec</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php-cgi <span style="color: #660033;">-c</span> .<span style="color: #000000; font-weight: bold;">/</span>php.ini</div></div>
<p>Как видите, если надо то конфиг php.ini можно пользователю задать персональный. А файлик php обязательно должен принадлежать этому же пользователю.</p>
<p>Когда все сделано &#8211; рестартуем lighttpd и смотрим, нет ли в логах ругательств с кодом ошибки 22 &#8211; это, как видно из сорса execwrap, несоответствие прав.</p>
<p>Enjoy =)</p>
<p>UPD: execwrap умер и воскрес тут: <a href="http://cgit.stbuehler.de/gitosis/execwrap/">http://cgit.stbuehler.de/gitosis/execwrap/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/07/24/lighttpd-and-execwrap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lighttpd and rails</title>
		<link>http://dmitry.shaposhnik.name/2008/01/05/lighttpd-and-rails/</link>
		<comments>http://dmitry.shaposhnik.name/2008/01/05/lighttpd-and-rails/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 02:33:27 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/01/05/lighttpd-and-rails/</guid>
		<description><![CDATA[Сделал небольшую пачку оберток на сервере для управления приложениями.

Для начала воспользовался кластером mongrel:
gem install mongrel_cluster
и создал юзеря, от которого все монгрели будут выполняться:
adduser --system --no-create-home --shell /bin/false --group mongrel
Правда, мне понадобилось сделать vipw и vigr, чтобы подправить ID пользователя и группы &#8211; чтоб они совпадали.
Теперь, в папке с приложением сделал
mongrel_rails cluster::configure -e production -p 3000 [...]]]></description>
			<content:encoded><![CDATA[<p>Сделал небольшую пачку оберток на сервере для управления приложениями.<br />
<span id="more-159"></span><br />
Для начала воспользовался кластером mongrel:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gem <span style="color: #c20cb9; font-weight: bold;">install</span> mongrel_cluster</div></div>
<p>и создал юзеря, от которого все монгрели будут выполняться:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">adduser <span style="color: #660033;">--system</span> <span style="color: #660033;">--no-create-home</span> <span style="color: #660033;">--shell</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span> <span style="color: #660033;">--group</span> mongrel</div></div>
<p>Правда, мне понадобилось сделать vipw и vigr, чтобы подправить ID пользователя и группы &#8211; чтоб они совпадали.</p>
<p>Теперь, в папке с приложением сделал</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mongrel_rails cluster::configure <span style="color: #660033;">-e</span> production <span style="color: #660033;">-p</span> <span style="color: #000000;">3000</span> <span style="color: #660033;">-N</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-c</span> .<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">-a</span> 127.0.0.1 <span style="color: #660033;">--user</span> mongrel <span style="color: #660033;">--group</span> mongrel</div></div>
<p>и получил в результате в config/mongrel_cluster.yml конфиг для кластера монгрелей. Вот такого вида:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">--- <br />
user: mongrel<br />
cwd: /var/www/lighttpd/www.example.com<br />
log_file: log/mongrel.log<br />
port: <span style="color: #933;">&quot;8000&quot;</span><br />
environment: production<br />
group: mongrel<br />
address: 127.0.0.1<br />
pid_file: tmp/pids/mongrel.pid<br />
servers: <span style="">5</span></div></div>
<p>Запускается оно через <tt>mongrel_rails cluster::start</tt>.<br />
Но надо же что-то сделать, чтоб оно загружалось при старте системы. И вот что я нашел и сделал.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>available<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>enabled<br />
<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>www<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>www.example.com<span style="color: #000000; font-weight: bold;">/</span>config<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster.yml <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>available<span style="color: #000000; font-weight: bold;">/</span>www.example.com.yml<br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>available<span style="color: #000000; font-weight: bold;">/</span>www.example.com.yml <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>enabled<span style="color: #000000; font-weight: bold;">/</span>www.example.com.yml</div></div>
<p>Теперь создадим скрипт /etc/init.d/mongrel_cluster:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #660033;">-e</span><br />
<br />
mongrel_cluster_ctl <span style="color: #660033;">-v</span> <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>enabled $<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:435px;"><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;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<br />
update-rc.d <span style="color: #660033;">-f</span> mongrel_cluster defaults</div></div>
<p>Также для удобства запуска-остановки отдельного приложения я сделал мелкий скрипт /etc/mongrel_cluster/operation.sh:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #660033;">-e</span><br />
<br />
<span style="color: #007800;">CONFIGS</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mongrel_cluster<span style="color: #000000; font-weight: bold;">/</span>enabled<br />
<br />
mongrel_rails cluster::<span style="color: #007800;">$1</span> <span style="color: #660033;">-C</span> <span style="color: #007800;">$CONFIGS</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$2</span>.yml</div></div>
<p>Поьзоваться им можно так: <tt>/etc/mongrel_cluster/operation.sh start www.example.com</tt><br />
Собственно, на этом с монгрелем все.<br />
Далее &#8211; lighttpd. Почему не nginx? Я не нашел никаких доводов за или против. В конце-концов, оба они работают как reverse-proxy к монгрелю, и несложно сменить демон &#8211; никаких переработок приложения не потребуется.</p>
<p>Итак, вот конфиг lighttpd:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server.modules &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span> </span><span style="color: #933;">&quot;mod_access&quot;</span>, <span style="color: #933;">&quot;mod_accesslog&quot;</span>, <span style="color: #933;">&quot;mod_compress&quot;</span>, <span style="color: #933;">&quot;mod_rewrite&quot;</span>, <span style="color: #933;">&quot;mod_proxy&quot;</span>, <span style="color: #933;">&quot;mod_redirect&quot;</span> <span style="">&#41;</span><br />
server.document-root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/www/lighttpd/default/&quot;</span><br />
server.errorlog &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/log/lighttpd/error.log&quot;</span><br />
server.port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> 80</span><br />
server.bind &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;77.120.99.179&quot;</span><br />
server.pid-file &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/run/lighttpd.pid&quot;</span><br />
server.username &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;www-data&quot;</span><br />
server.groupname &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;www-data&quot;</span><br />
server.tag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;lighttpd&quot;</span><br />
<br />
index-file.names &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span> </span><span style="color: #933;">&quot;index.php&quot;</span>, <span style="color: #933;">&quot;index.html&quot;</span>, <span style="color: #933;">&quot;index.htm&quot;</span> <span style="">&#41;</span><br />
url.access-deny &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span> </span><span style="color: #933;">&quot;~&quot;</span>, <span style="color: #933;">&quot;.inc&quot;</span> <span style="">&#41;</span><br />
static-file.exclude-extensions &nbsp;<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span> </span><span style="color: #933;">&quot;.php&quot;</span>, <span style="color: #933;">&quot;.pl&quot;</span>, <span style="color: #933;">&quot;.fcgi&quot;</span> <span style="">&#41;</span><br />
<br />
accesslog.filename &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/log/lighttpd/access.log&quot;</span><br />
<br />
compress.cache-dir &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/cache/lighttpd/compress/&quot;</span><br />
compress.filetype &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span></span><span style="color: #933;">&quot;text/plain&quot;</span>, <span style="color: #933;">&quot;text/html&quot;</span>, <span style="color: #933;">&quot;application/x-javascript&quot;</span>, <span style="color: #933;">&quot;text/css&quot;</span>, <span style="color: #933;">&quot;text/xml&quot;</span> <span style="">&#41;</span><br />
<br />
include_shell &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #933;">&quot;/usr/share/lighttpd/create-mime.assign.pl&quot;</span><br />
include_shell &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #933;">&quot;/usr/share/lighttpd/include-conf-enabled.pl&quot;</span><br />
<br />
var.basedir <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;/var/www/lighttpd/&quot;</span><br />
<br />
#### SITES ####<br />
$HTTP<span style="">&#91;</span><span style="color: #933;">&quot;host&quot;</span><span style="">&#93;</span> <span style="color: #000066; font-weight:bold;">==</span> <span style="color: #933;">&quot;example.com&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; url.redirect <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span></span><span style="color: #933;">&quot;^/(.*)$&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;http://www.example.com/$1&quot;</span><span style="">&#41;</span><br />
<span style="">&#125;</span><br />
$HTTP<span style="">&#91;</span><span style="color: #933;">&quot;host&quot;</span><span style="">&#93;</span> <span style="color: #000066; font-weight:bold;">==</span> <span style="color: #933;">&quot;www.example.com&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; server.name <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;www.example.com&quot;</span><br />
&nbsp; &nbsp; server.document-root <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> basedir + server.name + </span><span style="color: #933;">&quot;/public&quot;</span><br />
&nbsp; &nbsp; accesslog.filename <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> basedir + server.name + </span><span style="color: #933;">&quot;/log/access.log&quot;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; $HTTP<span style="">&#91;</span><span style="color: #933;">&quot;url&quot;</span><span style="">&#93;</span> !~ <span style="color: #933;">&quot;^/(stylesheets|javascripts|images|files)/&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy.balance <span style="color: #000066; font-weight:bold;">=</span> <span style="color: #933;">&quot;fair&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy.server &nbsp;<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #933;">&quot;/&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#40;</span> <span style="color: #933;">&quot;host&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;127.0.0.1&quot;</span>, <span style="color: #933;">&quot;port&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">8000</span> <span style="">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#40;</span> <span style="color: #933;">&quot;host&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;127.0.0.1&quot;</span>, <span style="color: #933;">&quot;port&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">8001</span> <span style="">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#40;</span> <span style="color: #933;">&quot;host&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;127.0.0.1&quot;</span>, <span style="color: #933;">&quot;port&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">8002</span> <span style="">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#40;</span> <span style="color: #933;">&quot;host&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;127.0.0.1&quot;</span>, <span style="color: #933;">&quot;port&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">8003</span> <span style="">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#40;</span> <span style="color: #933;">&quot;host&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="color: #933;">&quot;127.0.0.1&quot;</span>, <span style="color: #933;">&quot;port&quot;</span> <span style="color: #000066; font-weight:bold;">=</span>&gt; <span style="">8004</span> <span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#41;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<span style="">&#125;</span></div></div>
<p>Я обеспечил прямой доступ к статике посредством lighttpd, не заворачивая статику через mongrel (везде я встречал заворачивание всего на монгрели, что, ИМХО, не есть хорошо).<br />
Весьма настоятельно рекомендую в приложении создать файлик log/access.log и обеспечить в него запись пользователю www-data, от которого работает lighttpd.</p>
<p>Собственно, все. Ругайте.</p>
<p>UPD: в процессе работы проявились особенности Safari &#038; IE. Для них надо в конфиге lighttpd добавить</p>
<div class="codecolorer-container perl default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000ff;">$HTTP</span><span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;useragent&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=~</span> <span style="color: #ff0000;">&quot;^(.*MSIE.*)|(.*AppleWebKit.*)$&quot;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; server<span style="color: #339933;">.</span>max<span style="color: #339933;">-</span>keep<span style="color: #339933;">-</span>alive<span style="color: #339933;">-</span>requests <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><br />
<span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/01/05/lighttpd-and-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Optimizers revisited</title>
		<link>http://dmitry.shaposhnik.name/2007/12/27/php-optimizers-revisited/</link>
		<comments>http://dmitry.shaposhnik.name/2007/12/27/php-optimizers-revisited/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 11:34:15 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2007/12/27/php-optimizers-revisited/</guid>
		<description><![CDATA[Только-что наткнулся на эту публикацию, в которой основные ссылки &#8211; на сорс и на результат.
Как и показали результаты, стоит особо присмотреться к APC. Лично я еще после первого тестирования перешел на него.
UPD: есть нарекания на конфиг XCache в приведенном тесте, но у меня он страшно &#8220;лагал&#8221; с правильным конфигом, так что я свой выбор не [...]]]></description>
			<content:encoded><![CDATA[<p>Только-что наткнулся на <a href="http://phpinside.ru/?q=node/731">эту публикацию</a>, в которой основные ссылки &#8211; <a href="http://blog.digitalstruct.com/2007/12/23/php-accelerators-the-missing-details/">на сорс</a> и <a href="http://blog.digitalstruct.com/2007/12/24/accelerators-revisited/">на результат</a>.<br />
Как и показали результаты, стоит особо присмотреться к APC. Лично я еще после первого тестирования перешел на него.</p>
<p>UPD: есть нарекания на конфиг XCache в приведенном тесте, но у меня он страшно &#8220;лагал&#8221; с правильным конфигом, так что я свой выбор не поменял.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/12/27/php-optimizers-revisited/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Search for bug tracker</title>
		<link>http://dmitry.shaposhnik.name/2007/11/06/search-for-bug-tracker/</link>
		<comments>http://dmitry.shaposhnik.name/2007/11/06/search-for-bug-tracker/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 23:01:23 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2007/11/06/search-for-bug-tracker/</guid>
		<description><![CDATA[Помогите люди добрые советом при выборе багтракера.
Из необходимого:

многопроектность (участники одного проекта не должны даже догадываться о существовании других проектов&#8230; пока им не дадут туда доступ)
управление пользователями и правами
интуитивно понятный интерфейс
Wiki
Отправка уведомлений почтой

Из желаемого &#8211; time tracking, связка с SVN/BZR/Mercurial, работа с тикетами через почту.
Рассмотрены:

mantis &#8211; интерфейс аццки калечный
bugzilla &#8211; интерфейс хромает
Trac &#8211; все изумительно, но [...]]]></description>
			<content:encoded><![CDATA[<p>Помогите люди добрые советом при выборе багтракера.</p>
<p>Из необходимого:</p>
<ul>
<li>многопроектность (участники одного проекта не должны даже догадываться о существовании других проектов&#8230; пока им не дадут туда доступ)</li>
<li>управление пользователями и правами</li>
<li>интуитивно понятный интерфейс</li>
<li>Wiki</li>
<li>Отправка уведомлений почтой</li>
</ul>
<p>Из желаемого &#8211; time tracking, связка с SVN/BZR/Mercurial, работа с тикетами через почту.</p>
<p>Рассмотрены:</p>
<ul>
<li>mantis &#8211; интерфейс аццки калечный</li>
<li>bugzilla &#8211; интерфейс хромает</li>
<li>Trac &#8211; все изумительно, но многопроектность&#8230;</li>
<li>RT &#8211; громоздкая. Весьма. Задолбался пока поставил и настроил. Удалилось быстрее.</li>
</ul>
<p>UPDATE: </p>
<ul>
<li>Eventum from MySQL &#8211; весьма громоздко, неудобно. Раньше были траблы с русским, но верно уже все с этим в порядке.</li>
<li>SimpleTicket &#8211; сырющая, неюзабельно глюкающая системка. Простая&#8230; и совсем без ничего.</li>
<li>Trac &#8211; надо попробовать мультипроектность через плагин.</li>
<li>TrackStudio &#8211; выглядит заманчиво, но стоит денег.</li>
</ul>
<p>Пока остановился на RedMine.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/11/06/search-for-bug-tracker/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Trillian opens da new age</title>
		<link>http://dmitry.shaposhnik.name/2007/04/07/trillian-opens-da-new-age/</link>
		<comments>http://dmitry.shaposhnik.name/2007/04/07/trillian-opens-da-new-age/#comments</comments>
		<pubDate>Sat, 07 Apr 2007 18:16:04 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/04/07/trillian-opens-da-new-age/</guid>
		<description><![CDATA[Вот скажите кто-нибудь, как ЭТО оно ТАК работает???

]]></description>
			<content:encoded><![CDATA[<p>Вот скажите кто-нибудь, как ЭТО оно ТАК работает???</p>
<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/BOKQF864DS4"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/BOKQF864DS4" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/04/07/trillian-opens-da-new-age/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>google reader</title>
		<link>http://dmitry.shaposhnik.name/2006/11/16/google-reader/</link>
		<comments>http://dmitry.shaposhnik.name/2006/11/16/google-reader/#comments</comments>
		<pubDate>Thu, 16 Nov 2006 14:30:52 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2006/11/16/google-reader/</guid>
		<description><![CDATA[Наткнулся на эту замечательную читалку (RSS-аггрегатор). Возможностей много и приятно сделано.
Вот ссылочка к моим расшареным новостям:
http://www.google.com.ua/reader/shared/01112913359388397771
А еще справа снизу на главной странице появился специальный блок  
]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на эту замечательную читалку (RSS-аггрегатор). Возможностей много и приятно сделано.</p>
<p>Вот ссылочка к моим расшареным новостям:</p>
<p><a target="_blank" href="http://www.google.com.ua/reader/shared/01112913359388397771">http://www.google.com.ua/reader/shared/01112913359388397771</a></p>
<p>А еще справа снизу на главной странице появился специальный блок <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2006/11/16/google-reader/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
