<?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; lighttpd</title>
	<atom:link href="http://dmitry.shaposhnik.name/category/lighttpd/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>PowerDNS URL records and redirector</title>
		<link>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/</link>
		<comments>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 19:43:21 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[PowerDNS]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=205</guid>
		<description><![CDATA[В PowerDNS есть пара плюшек, которые я раньше не замечал. Одну из них &#8211; записи &#8220;URL&#8221; я сегодня попробовал, настроил и остался вполне доволен.
Что же такое URL-запись? Это фича PowerDNS, при помощи которой можно делать редирект домена на заданный URL.
Например, запись выглядит как
some.domain.com URL http://other.domain.com/some_domain_com
На самом деле в поле со значением записи может быть ссылка [...]]]></description>
			<content:encoded><![CDATA[<p>В PowerDNS есть пара плюшек, которые я раньше не замечал. Одну из них &#8211; записи &#8220;URL&#8221; я сегодня попробовал, настроил и остался вполне доволен.</p>
<p>Что же такое URL-запись? Это фича PowerDNS, при помощи которой можно делать редирект домена на заданный URL.<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">some.domain.com URL http://other.domain.com/some_domain_com</div></div>
<p>На самом деле в поле со значением записи может быть ссылка куда угодно.<br />
В конфиге сервера нужно указать</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 />
<span style="color: #000099;">fancy-records</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">yes</span><br />
<span style="color: #000099;">urlredirector</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">77.120.99.180</span><br />
...</div></div>
<p>Когда приходит запрос к DNS&#8217;у для домена some.domain.com отдается 77.120.99.180, указанный в конфиге, как если бы это была обычная &#8220;А&#8221;-запись.<br />
Браузер отрезолвив имя идет на http://some.domain.com. На этом адресе висит http-сервер (я повесил lighttpd), у которого скрипт лезет в БД и для указанного домена ищет соответствующую ему URL-запись и редиректит браузер туда. Все просто и тривиально.</p>
<p>Для lighttpd у меня конфиг дополнился такими строками:</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">$SERVER<span style="">&#91;</span><span style="color: #933;">&quot;socket&quot;</span><span style="">&#93;</span> <span style="color: #000066; font-weight:bold;">==</span> <span style="color: #933;">&quot;77.120.99.180:80&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; $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;(.*)&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; magnet.attract-raw-url-to <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span></span><span style="color: #933;">&quot;/var/www/lighttpd/pdns-url-redirector.lua&quot;</span><span style="">&#41;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<span style="">&#125;</span></div></div>
<p>То есть все что приходит незамедлительно обрабатывается упомянутым lua-скриптом. Почему <a href="http://www.lua.org/">lua</a>? С ним работает <a href="http://trac.lighttpd.net/trac/wiki/Docs:ModMagnet">mod_magnet</a>, и мне было интересно написать этот скриптик. Вот он:</p>
<div class="codecolorer-container lua default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require</span> <span style="color: #ff0000;">&quot;luasql.mysql&quot;</span><br />
env <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>luasql.mysql<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
con <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>env:connect<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;dnsdb&quot;</span>, <span style="color: #ff0000;">&quot;dns_user&quot;</span>, <span style="color: #ff0000;">&quot;dns_pass_for_readonly_records_table&quot;</span>, <span style="color: #ff0000;">&quot;localhost&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
domain <span style="color: #66cc66;">=</span> lighty.request<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Host&quot;</span><span style="color: #66cc66;">&#93;</span> <br />
<br />
mysql_replacements <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> <br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>0&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>n&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>r&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\'</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>26&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>Z&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\b</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>b&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>t&quot;</span>,<br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #b1b100;">function</span> fixsql <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">string.gsub</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">tostring</span> <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">&quot;[%z<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\'</span><span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\0</span>26<span style="color: #000099; font-weight: bold;">\b</span><span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span>, <br />
&nbsp; &nbsp; <span style="color: #b1b100;">function</span> <span style="color: #66cc66;">&#40;</span>str<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> mysql_replacements <span style="color: #66cc66;">&#91;</span>str<span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">or</span> str<br />
&nbsp; &nbsp; <span style="color: #b1b100;">end</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">end</span> <span style="color: #808080; font-style: italic;">-- fixsql</span><br />
<br />
cur <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>con:<span style="color: #b1b100;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">string.format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'&quot;</span>, fixsql<span style="color: #66cc66;">&#40;</span>domain<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><br />
result <span style="color: #66cc66;">=</span> cur:fetch<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">if</span> result <span style="color: #b1b100;">then</span><br />
&nbsp; &nbsp; redirect_to <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">string.format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span>, result<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; redirect_to <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;http://daemons.org.ua/&quot;</span><br />
<span style="color: #b1b100;">end</span><br />
<br />
cur:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
con:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
env:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;">--lighty.content = { string.format(&quot;SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'&quot;, fixsql(domain) ) &nbsp;}</span><br />
<span style="color: #808080; font-style: italic;">--lighty.header[&quot;Content-Type&quot;] = &quot;text/plain&quot;</span><br />
<span style="color: #808080; font-style: italic;">--return 200</span><br />
<br />
lighty.header<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Location&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> redirect_to<br />
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">301</span></div></div>
<p>Комментарий начинается с &#8220;&#8211;&#8221;. Закоментарены строки для отладки скрипта.<br />
Для соединения с мускулем из lua доставил пакет liblua5.1-sql-mysql-2.</p>
<p>Скрипт писал долго, но это было интересно. И небесполезно =)</p>
<hr />
<p><strong>UPD</strong>: во избежание DoS/DDoS атаки на мускуль возможны два варианта апгрейда метода:<br />
1. По крону раз в 5 минут генерить sqlite-БД состоящую из одной таблицы из двух полей &#8211; domain, target<br />
2. Раз в 5 минут генерить сам скрипт с вынесенными в него в виде хеша записями. Тогда скрипт вообще никуда подглядывать не будет.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/feed/</wfw:commentRss>
		<slash:comments>1</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>Webservers benchmark</title>
		<link>http://dmitry.shaposhnik.name/2008/02/03/webservers-benchmark/</link>
		<comments>http://dmitry.shaposhnik.name/2008/02/03/webservers-benchmark/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 05:08:54 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/02/03/webservers-benchmark/</guid>
		<description><![CDATA[Решил потестировать PHP в разных связках, а именно &#8211; Apache + mod_php, Apache + mod_fcgid + php, Lighttpd + mod_fastcgi + php. Все это еще в двух вариантах &#8211; с APC (Advanced PHP Cache) и без него.
Тестировал выполнением вот такой команды:
ab -c 5 -n 500 http://dmitry.shaposhnik.name/
Выполнял команду на другом сервере чтобы снизить влияние случайных факторов.
И [...]]]></description>
			<content:encoded><![CDATA[<p>Решил потестировать PHP в разных связках, а именно &#8211; Apache + mod_php, Apache + mod_fcgid + php, Lighttpd + mod_fastcgi + php. Все это еще в двух вариантах &#8211; с APC (Advanced PHP Cache) и без него.</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">ab <span style="color: #660033;">-c</span> <span style="color: #000000;">5</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">500</span> http:<span style="color: #000000; font-weight: bold;">//</span>dmitry.shaposhnik.name<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>Выполнял команду на другом сервере чтобы снизить влияние случайных факторов.</p>
<p>И вот что получилось в результате:<br />
<a href='http://dmitry.shaposhnik.name/files/2008/02/screenshot1.png' title='testing results, table' rel="lightbox"><img src='http://dmitry.shaposhnik.name/files/2008/02/screenshot1.thumbnail.png' alt='testing results, table' /></a><br />
Вот полный вывод в текстовом виде:<br />
<a href='http://dmitry.shaposhnik.name/files/2008/02/tests.txt' title='testing results'>testing results</a></p>
<p>UPD: вот на том же сервере решил протестировать приложение-блогодвижек (<a href="http://sergey.tatarenkov.name/">Записки айтишника</a>) на рельсах той же командой.<br />
<span id="more-170"></span></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">Document Length: &nbsp; &nbsp; &nbsp; &nbsp;13176 bytes<br />
<br />
Concurrency Level: &nbsp; &nbsp; &nbsp;5<br />
Time taken for tests: &nbsp; 15.141659 seconds<br />
Complete requests: &nbsp; &nbsp; &nbsp;500<br />
Failed requests: &nbsp; &nbsp; &nbsp; &nbsp;0<br />
Write errors: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0<br />
Total transferred: &nbsp; &nbsp; &nbsp;6743500 bytes<br />
HTML transferred: &nbsp; &nbsp; &nbsp; 6588000 bytes<br />
Requests per second: &nbsp; &nbsp;33.02 [#/sec] (mean)<br />
Time per request: &nbsp; &nbsp; &nbsp; 151.417 [ms] (mean)<br />
Time per request: &nbsp; &nbsp; &nbsp; 30.283 [ms] (mean, across all concurrent requests)<br />
Transfer rate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;434.89 [Kbytes/sec] received<br />
<br />
Connection Times (ms)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min &nbsp;mean[+/-sd] median &nbsp; max<br />
Connect: &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp;0 &nbsp; 0.0 &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; 1<br />
Processing: &nbsp; &nbsp; 6 &nbsp;100 1126.2 &nbsp; &nbsp; &nbsp;7 &nbsp; 15141<br />
Waiting: &nbsp; &nbsp; &nbsp; &nbsp;4 &nbsp; 98 1126.1 &nbsp; &nbsp; &nbsp;5 &nbsp; 15139<br />
Total: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6 &nbsp;100 1126.2 &nbsp; &nbsp; &nbsp;7 &nbsp; 15141<br />
<br />
Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50% &nbsp; &nbsp; &nbsp;7<br />
&nbsp; 66% &nbsp; &nbsp; &nbsp;8<br />
&nbsp; 75% &nbsp; &nbsp; &nbsp;9<br />
&nbsp; 80% &nbsp; &nbsp; 10<br />
&nbsp; 90% &nbsp; &nbsp; 11<br />
&nbsp; 95% &nbsp; &nbsp; 13<br />
&nbsp; 98% &nbsp; &nbsp;110<br />
&nbsp; 99% &nbsp; &nbsp;211<br />
&nbsp;100% &nbsp;15141 (longest request)</div></div>
<p><strong>UPD:</strong> по коментариям Вадима сделал более жесткий тест:</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">ab -c300 -n3000 http://dmitry.shaposhnik.name/test.php</div></div>
<p><a href='http://dmitry.shaposhnik.name/files/2008/02/test2.txt' title='testing results, heavy testing'>testing results, heavy testing</a><br />
Без APC mod_fcgid отлетает (2 запроса). Подскажите как подтюнинговать.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/02/03/webservers-benchmark/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Lighttpd and speed limits</title>
		<link>http://dmitry.shaposhnik.name/2008/01/26/lighttpd-and-speed-limits/</link>
		<comments>http://dmitry.shaposhnik.name/2008/01/26/lighttpd-and-speed-limits/#comments</comments>
		<pubDate>Sat, 26 Jan 2008 16:45:10 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/01/26/lighttpd-and-speed-limits/</guid>
		<description><![CDATA[Надо сделать ограничения по скорости отдачи файлов. Да и в принципе саму отдачу.
Дело было под Debian etch.

Для того, чтобы отдать файл средствами php, например, надо сделать
&#60;?php
header&#40;&#34;Content-type: application/octet-stream&#34;&#41;; 
header&#40;&#34;Content-Disposition: attachment; filename=\&#34;bigbinary.bin\&#34;\n&#34;&#41;;
readfile&#40;&#34;/var/www/lighttpd/bigbinary.bin&#34;&#41;;
?&#62;
А теперь отдайте так файл 100 пользователям. Даже lighttpd+php(fastcgi) просядет. Из-за PHP.
Но если работа lighttpd &#8211; отдавать статические файлы, то почему же ее не переложить на [...]]]></description>
			<content:encoded><![CDATA[<p>Надо сделать ограничения по скорости отдачи файлов. Да и в принципе саму отдачу.<br />
Дело было под Debian etch.<br />
<span id="more-168"></span><br />
Для того, чтобы отдать файл средствами php, например, надо сделать</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: application/octet-stream&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=<span style="color: #000099; font-weight: bold;">\&quot;</span>bigbinary.bin<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/readfile"><span style="color: #990000;">readfile</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/var/www/lighttpd/bigbinary.bin&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>А теперь отдайте так файл 100 пользователям. Даже lighttpd+php(fastcgi) просядет. Из-за PHP.<br />
Но если работа lighttpd &#8211; отдавать статические файлы, то почему же ее не переложить на него? Однако, не хочется давать прямую ссылку.<br />
Именно для этого есть специальный заголовок: <strong>X-Sendfile</strong></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: application/octet-stream&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=<span style="color: #000099; font-weight: bold;">\&quot;</span>bigbinary.bin<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;X-Sendfile: /var/www/lighttpd/bigbinary.bin&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>В конфиге надо включить для 1.4 для fastcgi (в описании fastcgi-сервера):</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">allow<span style="color: #339933;">-</span>x<span style="color: #339933;">-</span>sendfile &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;enable&quot;</span></div></div>
<p>А для 1.5 fastcgi уже реализован через mod_proxy_core, соответственно</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">proxy<span style="color: #339933;">-</span>core<span style="color: #339933;">.</span>allow<span style="color: #339933;">-</span>x<span style="color: #339933;">-</span>sendfile &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;enable&quot;</span></div></div>
<p>Проверьте отдачу. Разница налицо.</p>
<p>Далее, стоял вопрос в контроле скорости отдачи.<br />
Если правила для всего сервера одинаковы, то можно прописать в конфиге</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">connection<span style="color: #339933;">.</span>kbytes<span style="color: #339933;">-</span>per<span style="color: #339933;">-</span>second <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1000</span></div></div>
<p>или суммарную для всего сервера:</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">server<span style="color: #339933;">.</span>kbytes<span style="color: #339933;">-</span>per<span style="color: #339933;">-</span>second <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1000</span></div></div>
<p>Но если надо из скрипта управлять скоростью?<br />
Делается вот таким образом:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: application/octet-stream&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;X-LIGHTTPD-KBytes-per-second: 100&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=<span style="color: #000099; font-weight: bold;">\&quot;</span>bigbinary.bin<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;X-Sendfile: /var/www/lighttpd/bigbinary.bin&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>Однако ограничение скорости не работает. Во всем виноват mod_speed, точнее его отсутствие среди исходников.<br />
<a href="http://trac.lighttpd.net/trac/attachment/wiki/Docs/TrafficShaping/mod_speed.c">Вот исходник модуля</a>.<br />
Итак, скачиваем его в папку src к остальным исходникам lighttpd, в src/Makefile.am добавляем:</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">lib_LTLIBRARIES += mod_speed.la<br />
mod_speed_la_SOURCES = mod_speed.c<br />
mod_speed_la_LDFLAGS = <span style="color: #660033;">-module</span> <span style="color: #660033;">-export-dynamic</span> <span style="color: #660033;">-avoid-version</span> <span style="color: #660033;">-no-undefined</span><br />
mod_speed_la_LIBADD = $<span style="color: #7a0874; font-weight: bold;">&#40;</span>common_libadd<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Желательно это сделать до выполнения autogen.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: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--enable-maintainer-mode</span></div></div>
<p>и потом в конфиге дописать в загрузке модулей mod_speed.</p>
<p><strong>ПРИМЕЧАНИЯ</strong><br />
В 1.5 появилась возможность обработки X-Sendfile из бэкэнда у proxy_core. В версии 1.4 эта возможность была в модуле mod_fastcgi и от бэкэнда-апача, например, заголовок такой поймать было нельзя.</p>
<p>В версии 1.5 есть возможность выбирать backend для отдачи файлов. <a href="http://www.lighttpd.net/benchmark">Посмотреть на сравнение можно тут.</a> А установить нужный можно так:</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">server<span style="color: #339933;">.</span>network<span style="color: #339933;">-</span>backend <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;gthread-aio&quot;</span></div></div>
<p>Также у меня возникал вопрос, а как можно сделать простую обработку входящих параметров на некоем встроенном языке? Для примера, у nginx есть встроенный perl-овый модуль, при помощи которого можно реализовать мини-логику прямо на вэб-сервере. В lighttpd такая возможность нашлась &#8211; mod_magnet и в качестве обработчика скрипт на LUA. Ну что ж, будет повод освоить LUA.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/01/26/lighttpd-and-speed-limits/feed/</wfw:commentRss>
		<slash:comments>2</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>
	</channel>
</rss>
