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

<channel>
	<title>Юникс и другие &#187; Debian</title>
	<atom:link href="http://boombick.org/blog/posts/category/nix/debian-nix/feed" rel="self" type="application/rss+xml" />
	<link>http://boombick.org/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Wed, 26 May 2010 14:33:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Тестируем MariaDB</title>
		<link>http://boombick.org/blog/posts/99</link>
		<comments>http://boombick.org/blog/posts/99#comments</comments>
		<pubDate>Wed, 26 May 2010 14:33:09 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/99</guid>
		<description><![CDATA[На недавно прошедшей DevConf выступал с докладом Michael &#8220;Monty&#8221; Widenius, автор и идейный вдохновитель MySQL. Он рассказал про то, что Oracle потихоньку убивает MySQL и презентовал форк под названием MariaDB. Меня заинтересовала эта СУРБД и вот представляю вам свой опыт ее использования :) Итак, по шагам. Эксперементировать решил на Debian, коий и поднял в виртуальной [...]]]></description>
			<content:encoded><![CDATA[<p>На недавно прошедшей <a href="http://devconf.ru">DevConf</a> выступал с докладом <a href="http://en.wikipedia.org/wiki/Michael_Widenius">Michael &#8220;Monty&#8221; Widenius</a>, автор и идейный вдохновитель MySQL. Он рассказал про то, что Oracle потихоньку убивает MySQL и презентовал форк под названием <a href="http://askmonty.org/wiki/MariaDB_versus_MySQL">MariaDB</a>.<br />
Меня заинтересовала эта СУРБД и вот представляю вам свой опыт ее использования :)<br />
<span id="more-99"></span><br />
Итак, по шагам.<br />
Эксперементировать решил на Debian, коий и поднял в виртуальной машине. Меня, в первую очередь, интересовало ее применение на собственных проектах и совместимость с моими скриптами и сайтиками :)<br />
Итак, сначала выполняем следующие действия:</p>
<p>Добавляем ключ репозитория в хранилище и добавляем репозиторий в sources.list</p>
<blockquote><pre>
wget -O- http://ourdelta.org/deb/ourdelta.gpg | sudo apt-key add -
    sudo wget http://ourdelta.org/deb/sources/lenny-mariadb-ourdelta.list \
      -O /etc/apt/sources.list.d/ourdelta.list
</pre>
</blockquote>
<p>Затем устанавливаем, собственно, сервер и клиентскую либу. Все остальное, что нам будет нужно, потянется по зависимостям</p>
<blockquote><pre>
aptitude install libmariadbclient16 mariadb-server-5.1
 </pre>
</blockquote>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/05/password_setup.png' title='password_setup.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/password_setup.png' alt='password_setup.png' /></a><br />
Все, как в mysql :) Вводим желаемый пароль root для входа в mariadb</p>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/05/login.png' title='login.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/login.png' alt='login.png' /></a><br />
Затем логинимся</p>
<blockquote><pre>
mysql -u root -p
</pre>
</blockquote>
<p>Все до боли привычно и знакомо :)<br />
Ну чтож, пока все отлично (даже запускается как /etc/init.d/mysql start), проверим, как оно дружит с PHP</p>
<p>Сначала я хотел запустить стандартные бенчмарки, но жестоко обломался :) В репозитории были версии только для 64-битных систем<br />
<a href='http://boombick.org/blog/wp-content/uploads/2010/05/test_failed.png' title='test_failed.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/test_failed.png' alt='test_failed.png' /></a></p>
<p>Ну и фиг с ним, подрубаем PHP</p>
<blockquote><pre>
aptitude install php5-cli php5-mysql
</pre>
</blockquote>
<p>создаем тестовую табличку<br />
<a href='http://boombick.org/blog/wp-content/uploads/2010/05/create_table.png' title='create_table.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/create_table.png' alt='create_table.png' /></a><br />
и проверяем</p>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/05/test_connect.png' title='test_connect.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/test_connect.png' alt='test_connect.png' /></a></p>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/05/test_connect_result.png' title='test_connect_result.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/test_connect_result.png' alt='test_connect_result.png' /></a></p>
<p>Как видите, со стороны PHP все абсолютно прозрачно и никаких лишних телодвижений совершать не приходится. Это радует :)<br />
Для эксперимента можно поставить Wordpres<br />
Доставляем apache и все необходимое для него и пробуем<br />
<a href='http://boombick.org/blog/wp-content/uploads/2010/05/wp_install.png' title='wp_install.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/wp_install.png' alt='wp_install.png' /></a></p>
<p><a href='http://boombick.org/blog/wp-content/uploads/2010/05/wp_installed.png' title='wp_installed.png'><img src='http://boombick.org/blog/wp-content/uploads/2010/05/wp_installed.png' alt='wp_installed.png' /></a></p>
<p>Все отлично :)</p>
<p>PS Моей целью не было выяснение всех отличий MariaDB от MySQL, меня интересовала именно возможность применять ее в собственных проектах и дальнейшего отказа от MySQL. Возможность проверил, в дальнейшем попробую поставить ее на реальный сервер и попробовать в  production на каких-нибудь не очень критичных проектах :)<br />
О результатх будет отдельный пост.</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/99/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Немного о mod_perl</title>
		<link>http://boombick.org/blog/posts/83</link>
		<comments>http://boombick.org/blog/posts/83#comments</comments>
		<pubDate>Thu, 01 Oct 2009 13:18:24 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[web-servers]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/83</guid>
		<description><![CDATA[Apache &#8211; это очень популярный и широко используемый web-сервер. Есть множество альтернатив, но по возможностям настройки, гибкости и количеству доступных расширений Apache прочно держится в топе. В этой небольшой статье я расскажу как можно контролировать фактически все аспекты работы вашего web-сервера при помощи Perl и mod_perl mod_perl &#8211; это обычный модуль для Apache, который устанавливается [...]]]></description>
			<content:encoded><![CDATA[<p>Apache &#8211; это очень популярный и широко используемый web-сервер. Есть множество альтернатив, но по возможностям настройки, гибкости и количеству доступных расширений Apache прочно держится в топе. В этой небольшой статье я расскажу как можно контролировать фактически все аспекты работы вашего web-сервера при помощи Perl и <code>mod_perl</code><br />
<span id="more-83"></span><br />
<code>mod_perl</code> &#8211; это обычный модуль для Apache, который устанавливается также, как и все остальные модули. Но ключевое отличие в том, что этот модуль содержит в себе встроенный интерпретатор Perl, с помощью которого можно писать расширения и управлять фактически всеми аспектами работы сервера. Даже если вы никогда не писали (и не собираетесь писать) расширений для сервера, <code>mod_perl</code> пригодится вам чтобы, например, ускорить работу CGI-скриптов. А сам процесс описан ниже</p>
<p><b>Установка <code>mod_perl</code></b><br />
Все примеры показаны для ОС Linux Debian<br />
Устанавливаем пакет libapache2-mod-perl2</p>
<blockquote><pre>
lenny:~# apt-get install libapache2-mod-perl2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  libapache2-reload-perl libbsd-resource-perl libperl5.10
The following NEW packages will be installed
  libapache2-mod-perl2 libapache2-reload-perl libbsd-resource-perl libperl5.10
0 upgraded, 4 newly installed, 0 to remove and 2 not upgraded.
Need to get 1201kB of archives.
After this operation, 3891kB of additional disk space will be used.
...
Processing triggers for man-db ...
Setting up libperl5.10 (5.10.0-19) ...
Setting up libapache2-mod-perl2 (2.0.4-5) ...
Enabling module perl.
Run '/etc/init.d/apache2 restart' to activate new configuration!
Setting up libapache2-reload-perl (0.10-2) ...
Setting up libbsd-resource-perl (1.28-1+b1) ...
</pre>
</blockquote>
<p>Как можно увидеть, модуль уже активирован.. Но никто не мешает сделать это еще раз (для надежности :) ) Или, например, после изменения конфигурации сервера, да и вообще, чтобы убедиться</p>
<blockquote><pre>lenny:~# a2enmod perl
Module perl already enabled
lenny:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
</pre>
</blockquote>
<p>Модуль установлен, давайте займемся его настройкой. Самое простое &#8211; это добавить хендлер <code>perl-status</code> и посмотреть, что же происходит с нашим сервером. Создайте файл <code>/etc/apache2/conf.d/perl-status</code> со следующим содержимым:</p>
<blockquote><pre>
 #
 # make status information available at
 #   http://example.com/perl-status/
 #
 &lt;Location /perl-status&gt;
    SetHandler perl-script
    PerlHandler +Apache2::Status
&lt;/Location&gt;

 #
 # But only from the local host, and our trusted
 # remote IP.
 #
 &lt;Location /perl-status&gt;
    order deny,allow
    deny from all
    allow from 127.0.0.1
    allow from your.ip.address
&lt;/Location&gt;
</pre>
</blockquote>
<p>Перезапустите сервер и зайдите на адрес /perl-status. Узнаете несколько интересных вещей об окружении сервера и о загруженных модулях Perl<br />
<em><strong>Внимание!</strong></em> Эта информация содержит много такого, что не стоило бы показывать всем и каждому. Поэтому не стоит делать ее доступной для всех. Ограничьте доступ!</p>
<p><b>Ускорение Perl CGI-скриптов</b><br />
Так как <code>mod_perl</code> уже содержит встроенный интерпретатор Perl, то мы можем использовать его для запуска CGI-скриптов, вместо вызова внешней команды. Это позволит снизить накладные расходы на вызов отдельной копии интерпретатора при поступлении запроса на обработку скрипта. Есть способы добиться более внушительного ускорения, но это потребует внесения изменений в исходный код сценариев. В Debian CGI-скрипты по умолчанию располагаются в <code>/usr/lib/cgi-bin</code> Мы укажем Apache, что хотели бы запускать встроенный интерпретатор вместо внешнего для сценариев из этой директории.</p>
<blockquote><pre>
  PerlModule Apache::Registry
  Alias /cgi-bin/ /usr/lib/cgi-bin
  &lt;Location /cgi-bin&gt;
    SetHandler perl-script
    PerlHandler Apache::Registry
    PerlSendHeader On
    Options +ExecCGI
  &lt;/Location&gt;
</pre>
</blockquote>
<p>Перезапустите сервер (<code>/etc/init.d/apache2 restart</code>) и посмотрите, насколько быстрее стали работать скрипты :)</p>
<p><b>Загрузка модулей</b><br />
Продолжим. Давайте напишем код, который Apache мог бы использовать в процессе обработки страницы и пересылки ее клиенту. Нам необходимо разместить этот код так, чтобы встроенный интерпретатор смог загрузить его. По умолчанию в путь для поиска уже включены большинство системных директорий, но я считаю, что имеет смысл расположить его в очевидном месте :) <code>/etc/apache2/perl</code> Для добавления директории в путь поиска добавьте следующую директиву в <code>/etc/apache2/conf/00-mod-perl</code></p>
<blockquote><p>
#<br />
#  Load the startup script<br />
#<br />
PerlRequire /etc/apache2/perl/startup.pl</p>
</blockquote>
<p>Теперь при старте севера будет запускаться указанный скрипт. Давайте создадим его и поместим туда вот такой код</p>
<blockquote><p>
#<br />
#  Add /etc/apache2/perl to the mod_perl search path.<br />
#<br />
use lib  qw( /etc/apache2/perl );</p>
<p>#<br />
#  This script had no errors (?!)<br />
#<br />
1;
</p></blockquote>
<p>После перезапуска сервера путь для поиска будет обновлен и будет включать в себя нужную нам директорию.</p>
<p><b>Сделаем что-то полезное?</b><br />
Очень часто я вижу на своих проектах &#8220;пауков&#8221;, которые методично обшаривают страницу за страницей, качая содержимое. Вообщем я не возражаю против &#8220;зеркалирования&#8221; своих сайтов, но пока это все происходит незаметно для меня, в один поток и без съедания львиной доли ресурсов. А плохие &#8220;пауки&#8221; очень часто делают запросы, подобные следующим:</p>
<blockquote><p>
1.2.3.4 &#8211; [30/Apr/2009:19:36:29 +0100] &#8220;GET /articles/535#comment_2 HTTP/1.0&#8243;<br />
1.2.3.4 &#8211; [30/Apr/2009:19:36:30 +0100] &#8220;GET /articles/535#comment_3 HTTP/1.0&#8243;<br />
1.2.3.4 &#8211; [30/Apr/2009:19:36:30 +0100] &#8220;GET /articles/535#comment_5 HTTP/1.0&#8243;<br />
1.2.3.4 &#8211; [30/Apr/2009:19:36:31 +0100] &#8220;GET /articles/535#comment_4 HTTP/1.0&#8243;
</p></blockquote>
<p>Т.е. по якорям методично и многократно вытягивают одну и туже страницу, съедая ресурсы и трафик. Чтоже делать, будем их ловить с помощью вот такого модуля на Perl: <a href="http://boombick.org/DropClients.pm">DropClients</a><br />
Это сценарий на Perl, который обрабатывается <code>mod_perl</code>. Он выполняется для каждого входящего запроса и делает следующее:</p>
<ul>
<li>Выделяет из запроса IP-адрес и User-Agent</li>
<li>Если UA и IP &#8211; &#8220;плохие&#8221;, то отклоняет запрос</li>
<li>В нашем случае запрос отклоняется и тогда, когда в нем содержится &#8220;#&#8221;</li>
</ul>
<p>Если все хорошо, то запрос проходит</p>
<p>Чтобы запустить этот сценарий мы должны</p>
<ol>
<li>Загрузить его</li>
<li>И заставить его выполняться :)</li>
</ol>
<p>Сохраним модуль как <code>/etc/apache2/perl/DropClients.pm</code> и создадим файл <code>/etc/apache2/conf/dropclients</code> со следующим содержимым:</p>
<blockquote><p>
#<br />
#  Load the module<br />
#<br />
PerlModule DropClients</p>
<p>#<br />
#  Ensure it is invoked as an access handler<br />
#<br />
&lt;Location /&gt;<br />
     PerlAccessHandler DropClients<br />
&lt;/Location&gt;
</p></blockquote>
<p>После перезапуска метод <code>DropClients::request()</code> будет выполняться для каждого входящего запроса и нежелательные запросы будут отклоняться.</p>
<p>Нормальный запрос</p>
<blockquote><p>
user@notebook:~$ echo -e &#8220;GET / HTTP/1.0\n&#8221; | nc lenny 80 |grep ^HTTP<br />
HTTP/1.1 200 OK
</p></blockquote>
<p>&#8220;Плохой&#8221; запрос</p>
<blockquote><p>
user@notebook:~$ echo -e &#8220;GET /#foo HTTP/1.0\n&#8221; | nc lenny 80 |grep ^HTTP<br />
HTTP/1.1 403 Forbidden
</p></blockquote>
<p>Поскольку мы только что сделали &#8220;плохой&#8221; запрос, дальнейший доступ к серверу будет закрыт</p>
<blockquote><p>
user@notebook:~$ echo -e &#8220;GET / HTTP/1.0\n&#8221; | nc lenny 80 |grep ^HTTP<br />
HTTP/1.1 403 Forbidden
</p></blockquote>
<p>Если заглянете в код модуля, то увидите, что эта блокировка очень просто и снимается командой <code>rm -rf /tmp/blah</code></p>
<p><b>Различные типы обработчиков</b><br />
Для нашего модуля мы использовали обработчик <code>PerlAccessHandler</code>, который запускал скрипт при входящих соединениях. Но это лишь один из многих типов обработчиков. Есть также, например:</p>
<ul>
<li><code>PerlResponseHandler</code> &#8211; запускает сценарий после прохождения запроса</li>
<li><code>PerlOutputFilterHandler</code> &#8211; позволяет выполнить фильтрацию контента, отдаваемого пользователю (заменить слова, добавить футер&#8230; Сфера применения ограничена лишь вашей фантазией)</li>
</ul>
<p>Полный список обработчиков доступен в документации к <code>mod_perl</code> и <noindex><a href="http://perl.apache.org/docs/2.0/user/handlers/http.html">здесь</a></noindex> Там же можно найти и примеры кода</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/83/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Установка nginx, php5 CGI и MySQL</title>
		<link>http://boombick.org/blog/posts/79</link>
		<comments>http://boombick.org/blog/posts/79#comments</comments>
		<pubDate>Tue, 18 Aug 2009 13:40:19 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[web-servers]]></category>
		<category><![CDATA[Для начинающих]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/79</guid>
		<description><![CDATA[Nginx (произносится как &#8220;энджин икс&#8221;) &#8211; это легкий высокопроизводительный веб-сервер с открытым исходным кодом. Он известен своей стабильностью, большим набором функций, сравнительной простотой конфигурации, а также весьма низкой требовательностью к ресурсам. В этой статье я опишу процесс установки nginx, PHP5 в CGI-режиме и MySQL на Debian Lenny. В нашем примере установка будет производится на сервер [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx (произносится как &#8220;энджин икс&#8221;) &#8211; это легкий высокопроизводительный веб-сервер с открытым исходным кодом. Он известен своей стабильностью, большим набором функций, сравнительной простотой конфигурации, а также весьма низкой требовательностью к ресурсам. В этой статье я опишу процесс установки nginx, PHP5 в CGI-режиме и MySQL на Debian Lenny.<br />
<span id="more-79"></span><br />
В нашем примере установка будет производится на сервер с доменным именем <code>server1.example.com</code> и IP-адресом <code>192.168.1.100</code></p>
<p><strong>Установка MySQL 5.0</strong></p>
<blockquote><p>aptitude install mysql-server mysql-client</p></blockquote>
<p>В процессе установки вас попросят ввести пароль для пользователя root. Этот пользователь не имеет ничего общего с системным пользователем root. Этот пароль будет использован для пользователя, обладающего суперпривелегиями для самой MySQL:</p>
<blockquote>
<pre>
New password for the MySQL "root" user: &lt;-- yourrootsqlpassword
Repeat password for the MySQL "root" user: &lt;-- yourrootsqlpassword</pre>
</blockquote>
<p><strong>Установка Nginx</strong><br />
Nginx есть в репозитории Debian, что существенно упрощает нашу задачу :)<br />
Установим и запустим его:</p>
<blockquote><p>aptitude install nginx<br />
/etc/init.d/nginx start</p></blockquote>
<p>Наберите в браузере IP-адрес или хостнейм сервера (например <code>http://192.168.0.100</code>) и вы увидите стартовую страницу nginx<br />
<a href="http://boombick.org/blog/wp-content/uploads/2009/08/1.png" title="1.png"><img src="http://boombick.org/blog/wp-content/uploads/2009/08/1.thumbnail.png" alt="1.png" /></a></p>
<p><strong>Установка PHP5</strong><br />
Для &#8220;общения&#8221; между nginx и PHP мы будем использовать FastCGI. К счастью, в репозиториях Debian есть пакет, обеспечиващий поддержку FCGI в PHP. Установим PHP</p>
<blockquote><p>aptitude install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl</p></blockquote>
<p>Отредактируйте файл <code>/etc/php5/cgi/php.ini</code> добавив в его конец следующую строку:</p>
<blockquote>
<pre>
cgi.fix_pathinfo = 1</pre>
</blockquote>
<p>В Debian нет самостоятельного приложения для FastCGI, поэтому мы воспользуемся <code>spawn-fcgi</code>, которая входит в состав lighttpd:</p>
<blockquote><p>aptitude install lighttpd</p></blockquote>
<p>И после установки получим сразу же получим ошибку:</p>
<blockquote>
<pre>Starting web server: lighttpd2009-03-19 15:58:09: (network.c.300) can't bind to port: 80 Address already in use
 failed!</pre>
</blockquote>
<p>Логично, 80-й порт у нас занят nginx-ом. Поэтому сделаем так, чтобы Лайти не запускался при загрузке системы:</p>
<blockquote><p>update-rc.d -f lighttpd remove</p></blockquote>
<p>Мы установили Лайти только для того, чтобы воспользовать крайне полезной для наших целей программой, идущей с ним в комплекте: <code>/usr/bin/spawn-fcgi</code>, именно ее мы будем использовать для запуска процессов FastCGI. Для краткого ознакомления с ее возможностями выполните команду</p>
<blockquote><p>spawn-fcgi &#8211;help</p></blockquote>
<p>Для запуска PHP FastCGI-демона на 9000 порту на сервере <code>localhost</code> от пользователя <code>www-data</code> выполните</p>
<blockquote>
<pre>
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
</pre>
</blockquote>
<p>И чтобы каждый раз не приходилось вводить это вручную, команду можно прописать в <code>/etc/rc.local</code></p>
<p><strong>Настройка Nginx</strong><br />
Конфигурационный файл nginx расположен здесь: <code>/etc/nginx/nginx.conf</code>. Для начала (необязательно) увеличим количество рабочих процессов и поменяем параметр <code>keepalive_timeout</code>:</p>
<blockquote>
<pre>[...]
worker_processes  5;
[...]
    keepalive_timeout   2;
[...]</pre>
</blockquote>
<p>Настройки виртуальных хостов расположены в секции <code>server {}</code>, хост по умолчанию описан в <code>/etc/nginx/sites-available/default</code>, модифицируйте его следующим образом:</p>
<blockquote>
<pre>
[...]
server {
        listen   80;
        server_name  _;

        access_log  /var/log/nginx/localhost.access.log;

        location / {
                root   /var/www/nginx-default;
                index  index.php index.html index.htm;
        }

        location /doc {
                root   /usr/share;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }

        location /images {
                root   /usr/share;
                autoindex on;
        }

        #error_page  404  /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
                #proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
                include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny  all;
        }
}
[...]</pre>
</blockquote>
<p><code>server_name _;</code> &#8211; имя хоста &#8220;по умолчанию&#8221; (конечно же, никто не мешает явно указать имя хоста, например <code>example.com</code>)<br />
В выражении <code>location /</code> мы указываем индексный файл (<code>index.php</code>) и document root (<code>/var/www/nginx-default</code>)<br />
Важная часть для PHP &#8211; это <code>location ~ \.php$ {}</code>, раскомментируйте ее. Не забудьте проверить, что вы изменили строку <code>fastcgi_param</code> на <code>fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name</code> (замените <code>/var/www/nginx-default</code> на ваш реальный путь к document root), иначе интерпретатор PHP может не найти запрашиваемый вами через браузер скрипт.<br />
Удостоверьтесь, что между <code>include</code> и <code>fastcgi_params</code> есть пробел, в оригинальном файле они записаны как одно слово &#8211; это ошибка.<br />
Перезапустите <code>nginx</code></p>
<blockquote><p>/etc/init.d/nginx restart</p></blockquote>
<p>Создайте тестовый файл PHP со следующим содержанием</p>
<blockquote>
<pre>
&lt;?php
phpinfo();
?&gt;</pre>
</blockquote>
<p>Сохраните в вашей document root и откройте его в браузере (<code>http://192.168.0.100/info.php</code>)<br />
<a href="http://boombick.org/blog/wp-content/uploads/2009/08/2.png" title="2.png"><img src="http://boombick.org/blog/wp-content/uploads/2009/08/2.thumbnail.png" alt="2.png" /></a><br />
Обратите внимание на строку ServerAPI</p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/79/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Собственный видеохостинг</title>
		<link>http://boombick.org/blog/posts/72</link>
		<comments>http://boombick.org/blog/posts/72#comments</comments>
		<pubDate>Thu, 21 May 2009 15:40:56 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[web-servers]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/72</guid>
		<description><![CDATA[Статья описывает процесс построения собственного видеохостинга (как, например, YouTube) на базе lighttpd с модулем mod_flv_streaming для трансляции потокового видео в формате .flv и модулем mod_secdownload для предотвращения хотлинкинга. В качестве проигрывателя мы возьмем FlowPlayer, который поддерживает mod_flv_streaming. Также мы опишем процесс перекодировки видео различных форматов (.mp4 .mov .mpg .3gp .mpeg .wmv .avi) в формат FLV, [...]]]></description>
			<content:encoded><![CDATA[<p>Статья описывает процесс построения собственного видеохостинга (как, например, YouTube) на базе lighttpd с модулем <em>mod_flv_streaming</em> для трансляции потокового видео в формате .flv и модулем<br />
<em>mod_secdownload</em> для предотвращения хотлинкинга. В качестве проигрывателя мы возьмем <noindex><a href="http://flowplayer.org/">FlowPlayer</a></noindex>, который поддерживает <em>mod_flv_streaming</em>. Также мы опишем процесс перекодировки видео различных форматов (.mp4 .mov .mpg .3gp .mpeg .wmv .avi) в формат FLV, который будет использоваться на нашем сайте<br />
<span id="more-72"></span><br />
<strong>Необходимые замечания</strong><br />
Перед описанием непосредственно процесса давайте определим используемые в статье некоторые параметры, которые могут отличаться от ваших (и наверняка отличаются :))<br />
Все происходит на сервере с адресом <code>server1.example.com</code> и IP-адресом <code>192.168.0.100</code>. Предполагается, что на сервере уже установлен lighttpd и php с поддержкой MySQL<br />
В Лайти также включена поддержка PHP. В качестве операционной системы мы используем Debian Etch<br />
Итак, приступим</p>
<p><strong>Устанавливаем LAME</strong><br />
<noindex><a href="http://lame.sourceforge.net/">LAME</a></noindex> &#8211; это mp3-декодер. Он необходим нам для того, чтобы в наших сконвертированных видеофайлах сохранялась аудиодорожка. В репозитриях Etch LAME отсутствует, поэтому мы будем собирать его вручную.<br />
Установим необходимые пакеты:</p>
<blockquote><p> apt-get install build-essential</p></blockquote>
<p>Затем скачаем и скомпилируем LAME</p>
<blockquote>
<pre>
cd /tmp
wget http://mesh.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz
tar xvfz lame-3.97.tar.gz
cd lame-3.97
./configure --enable-shared --prefix=/usr
make
make install</pre>
</blockquote>
<p><strong>Устанавливаем ffmpeg</strong><br />
Для перекодирования видео мы будем использовать <code>ffmpeg</code>. Установим его и плагины к нему</p>
<blockquote><p> apt-get install ffmpeg libavcodec0d libavformat0d libavifile-0.7c2 libpostproc0d libasound2-plugins avifile-player avifile-utils avifile-mad-plugin avifile-mjpeg-plugin avifile-vorbis-plugin</p></blockquote>
<p>Проблема LAME в Debian заключается в том, что он не поддерживает кодирование mp3 из-за патентных ограничений, а значит наше видео превратится в &#8220;немое кино&#8221;. Чтож, немного поправим пакет</p>
<blockquote><p> cd /usr/src/<br />
apt-get source ffmpeg<br />
cd ffmpeg-0.cvs20060823</p></blockquote>
<p>Отредактируем файл <code>debain/rules</code>. В начале файла есть две строки <code>confflags</code> с опциями сборки. Добавим в одну из них <code>--enable-mp3lame</code> и сохраним файл</p>
<blockquote>
<pre>
[...]
confflags += --enable-gpl --enable-pp --enable-pthreads --enable-mp3lame
confflags += --enable-vorbis --enable-libogg --enable-a52 --enable-dts --enable-libgsm
[...]</pre>
</blockquote>
<p>Соберем пакет</p>
<blockquote><p> dpkg-buildpackage</p></blockquote>
<p><code>dpkg-buildpackage</code>, скорее всего, будет &#8220;ругаться&#8221; на отсутствующие пакеты, которые нужны ему для сборки <code>ffmpeg</code></p>
<blockquote>
<pre>
server1:/usr/src/ffmpeg-0.cvs20060823# dpkg-buildpackage
dpkg-buildpackage: source package is ffmpeg
dpkg-buildpackage: source version is 0.cvs20060823-8
dpkg-buildpackage: source changed by Sam Hocevar (Debian packages) <sam+deb@zoy.org>
dpkg-buildpackage: host architecture i386
dpkg-buildpackage: source version without epoch 0.cvs20060823-8
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (&gt;= 4.0) quilt libogg-dev libvorbis-dev liba52-dev libdts-dev zlib1g-dev libsdl1.2-dev libfreetype6-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev (&gt;&gt; 0.0.0.alpha4) libgsm1-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)
server1:/usr/src/ffmpeg-0.cvs20060823#
</sam+deb@zoy.org></pre>
</blockquote>
<p>Если вы видите что-то подобное, то просто доставьте недостающие пакеты</p>
<blockquote><p> apt-get install debhelper quilt libogg-dev libvorbis-dev liba52-dev libdts-dev zlib1g-dev libsdl1.2-dev libfreetype6-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev libgsm1-dev</p></blockquote>
<p>и запустите <code>dpkg-buildpackage</code> снова</p>
<blockquote><p> dpkg-buildpackage</p></blockquote>
<p>Процесс создания нового пакета займет некоторое время, а результатом его будут *.deb-файлы в директории <code>/usr/src</code>. Установим их командой</p>
<blockquote><p> cd ..<br />
dpkg -i *.deb</p></blockquote>
<p><strong>Устанавливаем flvtool2</strong><br />
При перекодировке видео неплохо было добавить некоторые метаданные в конечные файлы, например информацию о длительности, чтобы наш плеер смог корректно показывать счетчик времени. Для этого воспользуемся утилитой <noindex><a href="http://rubyforge.org/projects/flvtool2/">flvtool2</a></noindex>. Она написана на Ruby, поэтому сначала установим его</p>
<blockquote><p> apt-get install ruby</p></blockquote>
<p>Затем скачаем и установим flvtool2</p>
<blockquote><p> cd /tmp<br />
wget http://rubyforge.org/frs/download.php/17497/flvtool2-1.0.6.tgz<br />
tar xvfz flvtool2-1.0.6.tgz<br />
cd flvtool2-1.0.6<br />
ruby setup.rb config<br />
ruby setup.rb setup<br />
ruby setup.rb install</p></blockquote>
<p><strong>Подгототавливаем директории для видео</strong><br />
Корневой директорией для Лайти в нашем случае является <code>/var/www</code> (по умолчанию в Debian так и есть). Конечно же мы не хотим хранить оригинальные и сконвертированные видеофайлы в этой директории, иначе их смогут скачать все, кто захочет (зная прямую ссылку). Поэтому директорию с оригинальными видео (<code>/var/videos/incoming</code>) и сконвертированными (<code>/var/videos/flv</code>) мы расположим <strong>вне</strong> DocumentRoot</p>
<blockquote><p> mkdir -p /var/videos/incoming<br />
mkdir -p /var/videos/flv</p></blockquote>
<p>Вы (или ваши пользователи) смогут загружать файлы в <code>/var/videos/incoming</code> через FTP или WEB-интерфейс, а вы будете их перекодировать (вручную или автоматически) в FLV-формат и хранить в <code>/var/videos/flv</code></p>
<p><strong>Перекодирование видео</strong><br />
Предположим, что у нас есть файл <code>video.avi</code> в директории <code>/var/videos/incoming</code> (или .mp4 .mov .mpg .3gp .mpeg .wmv). Мы хотим сконвертировать его в <code>fideo.flv</code> и сохранить в <code>/var/videos/flv</code>. Разрешение конечного файла должно быть 320&#215;240, звук 44100 Hz и частота кадров 12 fps</p>
<blockquote><p> ffmpeg -i /var/videos/incoming/video.avi -s 320&#215;240 -ar 44100 -r 12 /var/videos/flv/video.flv</p></blockquote>
<p>(для дополнительной информации рекомендую обратиться к <code>man ffmpeg</code>). Это займет некоторое время, а вывод будет похож на</p>
<blockquote>
<pre>
server1:~# ffmpeg -i /var/videos/incoming/video.avi -s 320x240 -ar 44100 -r 12 /var/videos/flv/video.flv
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2004 Fabrice Bellard
  configuration:  --enable-gpl --enable-pp --enable-pthreads --enable-mp3lame --enable-vorbis --enable-libogg
 --enable-a52 --enable-dts --enable-libgsm --enable-dc1394 --disable-debug --enable-shared --prefix=/usr
  libavutil version: 0d.49.0.0
  libavcodec version: 0d.51.11.0
  libavformat version: 0d.50.5.0
  built on Aug 14 2007 15:02:25, gcc: 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Input #0, avi, from '/var/videos/incoming/video.avi':
  Duration: 00:10:53.8, start: 0.000000, bitrate: 5455 kb/s
  Stream #0.0: Video: mpeg4, yuv420p, 1024x576, 24.00 fps(r)
  Stream #0.1: Audio: ac3, 48000 Hz, 5:1, 448 kb/s
Output #0, flv, to '/var/videos/flv/video.flv':
  Stream #0.0: Video: flv, yuv420p, 320x240, q=2-31, 200 kb/s, 12.00 fps(c)
  Stream #0.1: Audio: mp3, 44100 Hz, stereo, 64 kb/s
Stream mapping:
  Stream #0.0 -&gt; #0.0
  Stream #0.1 -&gt; #0.1
No accelerated IMDCT transform found
Press [q] to stop encoding
frame= 7847 q=2.0 Lsize=   21682kB time=653.8 bitrate= 271.7kbits/s
video:16061kB audio:5108kB global headers:0kB muxing overhead 2.427536%
server1:~#</pre>
</blockquote>
<p>Обратите особое внимание на секцию <code>Output</code> &#8211; там должно быть два потока: видео и аудио. Если вы видите там только видеопоток, то значит какие-то проблемы с аудиокодированием, внимательно проверьте наши инструкции по подключению LAME<br />
После кодирования добавим метаданные</p>
<blockquote><p> cat /var/videos/flv/video.flv | flvtool2 -U stdin /var/videos/flv/video.flv</p></blockquote>
<p><strong>Настройка Lighttpd</strong><br />
Теперь приступим к настройке Лайти. Откроем главный конфигурационный файл <code>/etc/lighttpd/lighttpd.conf</code>  активируем в нем модули <code>mod_secdownload</code> и <code>mod_flv_streaming</code>. Обратите внимание: крайне важно, чтобы модуль <code>mod_secdownload</code> шел <em>перед</em> модулем <code>mod_flv_streaming</code> в секции <code>server.modules</code>. В обратном случае будут проблемы с отображением видео FlowPlayer&#8217;ом</p>
<blockquote>
<pre>
[...]
server.modules              = (
            "mod_access",
            "mod_alias",
            "mod_accesslog",
            "mod_fastcgi",
#           "mod_rewrite",
#           "mod_redirect",
#           "mod_status",
#           "mod_evhost",
#           "mod_compress",
#           "mod_usertrack",
#           "mod_rrdtool",
#           "mod_webdav",
#           "mod_expire",
            "mod_secdownload",
            "mod_flv_streaming",
#           "mod_evasive"
 )
[...]</pre>
</blockquote>
<p>Также добавьте в конец конфига следующие строки</p>
<blockquote>
<pre>
[...]
flv-streaming.extensions = ( ".flv" )
secdownload.secret          = "somesecret"
secdownload.document-root   = "/var/videos/flv/"
secdownload.uri-prefix      = "/dl/"
secdownload.timeout         = 120</pre>
</blockquote>
<p>Не забудьте заменить <code>somesecret</code> на реальную парольную фразу<br />
Как работает <code>mod_secdownload</code>:<br />
На web-странице расположена ссылка примерно следующего вида:<br />
<em>&lt;uri-prefix&gt;/&lt;token&gt;/&lt;timestamp-in-hex&gt;/&lt;rel-path&gt; </em> (например: <em>/dl/d8a8cb150f7e5962f6a8443b0b6c6cc2/46c1d9f6/video.flv</em>)<br />
Где &lt;token&gt; &#8211; это md5-хэш от</p>
<ul>
<li>Секретной строки</li>
<li>&lt;rel-path&gt; (начинающегося с /)</li>
<li></li>
<li>&lt;timestamp-in-hex&gt;</li>
<p><code>mod_secdownload</code> перенаправит эту ссылку на файл, расположенный в  <code>secdownload.document-root</code> (который вне основного корня веб-сервера) и обеспечит доступ к нему в течении <code>secdownload.timeout</code> секунд. По истечении времени ссылка перестанет быть валидной и доступ будет закрыт.<br />
После установки FlowPalyer мы будем генерировать валидные сслыки для <code>mod_secdownload</code> при помощи PHP-скрипта. Дополнительную информацию по <code>mod_secdownload</code> можно получить <noindex><a href="http://trac.lighttpd.net/trac/wiki/Docs%3AModSecDownload">здесь</a></noindex><br />
Не забудьте перезапустить Лайти</p>
<blockquote><p> /etc/init.d/lighttpd restart</p></blockquote>
<p><strong>Установка FlowPlayer</strong><br />
Скачайте последнюю версию плеера с <noindex><a href="http://flowplayer.org/download">http://flowplayer.org/download</a></noindex> и приготовьте его к работе</p>
<blockquote><p> cd /tmp<br />
wget http://belnet.dl.sourceforge.net/sourceforge/flowplayer/flowplayer-1.19.zip<br />
unzip flowplayer-1.19.zip<br />
mv flowplayer /var/www/</p></blockquote>
<p><strong>Настройка FlowPlayer</strong><br />
Плеер установлен, теперь давайте создадим файл, с помощью которого можно будет посмотреть наше видео. В нашем примере это <code>/var/www/flowplayertest.php</code>, в котором расположены все параметры для запуска плеера и генерируются валидные ссылки для <code>mod_secdownload</code></p>
<blockquote>
<pre>
&lt;?php
$secret = "somesecret";
$uri_prefix = "/dl/";

# filename
$f = "/video.flv";

# current timestamp
$t = time();

$t_hex = sprintf("%08x", $t);
$m = md5($secret.$f.$t_hex);

?&gt;

&lt;object type="application/x-shockwave-flash" data="/flowplayer/FlowPlayerThermo.swf"&gt;
    width="320" height="256" id="FlowPlayer"&gt;
&lt;param name="allowScriptAccess" value="sameDomain"&gt;&lt;/param&gt;
&lt;param name="movie" value="/flowplayer/FlowPlayerThermo.swf"&gt;&lt;/param&gt;
&lt;param name="quality" value="high"&gt;&lt;/param&gt;
&lt;param name="scale" value="noScale"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;
&lt;param name="flashvars" value="config={videoFile: '&lt;?php printf('%s%s/%s%s', $uri_prefix, $m, $t_hex, $f, $f); ?&gt;', streamingServer: 'lighttpd', loop: 'false', useNativeFullScreen: true}"&gt;&lt;/param&gt;
&lt;/object&gt;</pre>
</blockquote>
<p>Не забудьте позаботиться о том, чтобы переменная <code>$secret</code> совпадала со значением, указанным в конфиге Лайти. Также должны совпадать <code>$uri_prefix</code> и <code>secdownload.uri-prefix</code>. Если все верно, то ссылки точно будут рабочими. В переменной <code>$f</code> содержится имя видеофайла, начинающееся со слеша (&#8220;/&#8221;). В нашем примере имя &#8220;жестко&#8221; зашито в код, но вы можете получать его из БД, например.<br />
В тэгах <code>&lt;object&gt;&lt;/object&gt;</code> содержатся конфигурационные параметры для FlowPlayer. Плеер может использовать разные скины (в нашем примере это <code>FlowPlayerThermo</code>), видео имеет размер 320&#215;240 и панель управления имеет высоту 16px. Пожтому мы указали ширину равной 320px и высоту (240+16) 256px. Если вы используете другой скин, поправьте эти параметры. За документацией по FlowPlayer обращайтесь на <noindex><a href="http://flowplayer.org/demos/index.html">официальный сайт</a></noindex><br />
В параметре <code>&lt;param name="flashvars"...</code> содержатся настройки окружения плеера. Важным параметром является <code>videoFile</code> &#8211; это ссылка на файл, которую генерирует наш скрипт. Другая важная опция &#8211; это <code>streamingServer: 'lighttpd'</code>, которая указывает, что для потоковой трансляции файла мы используем <code>mod_flv_streaming</code> Остальные опции (<code>loop, useNativeFullScreen</code>) являются необязательными. Например, если вы установите опцию <code>useNativeFullScreen</code> в <code>true</code> (это поддержка нативного полноэкранного режима для Flash Player 9), то вы должны включить в object строку &lt;param name=&#8221;allowFullScreen&#8221; value=&#8221;true&#8221; /&gt; и не можете использовать &lt;param name=&#8221;wmode&#8221; value=&#8221;transparent&#8221; /&gt;<br />
За дополнительными настройками FlowPlayer обратитесь к документации</p>
<p><strong>Проверим?</strong><br />
Зайдем браузером на <code>http://192.168.0.100/flowplayertest.php</code> &#8211; видео должно работать (со звуком)<br />
<a href="http://boombick.org/blog/wp-content/uploads/2009/05/2.png" title="2.png"><img src="http://boombick.org/blog/wp-content/uploads/2009/05/2.thumbnail.png" alt="2.png" /></a><br />
И даже в полноэкранном режиме<br />
<a href="http://boombick.org/blog/wp-content/uploads/2009/05/3.png" title="3.png"><img src="http://boombick.org/blog/wp-content/uploads/2009/05/3.thumbnail.png" alt="3.png" /></a><br />
Enjoy.</p>
<p><strong>Оригинал:</strong> <noindex><a href="http://howtoforge.org/video_streaming_lighttpd_flowplayer">http://howtoforge.org/video_streaming_lighttpd_flowplayer</a></noindex></ul>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/72/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Настройка NFS-сервера и клиентов на Debian Lenny</title>
		<link>http://boombick.org/blog/posts/68</link>
		<comments>http://boombick.org/blog/posts/68#comments</comments>
		<pubDate>Mon, 18 May 2009 16:00:55 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Network]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/68</guid>
		<description><![CDATA[В этой статье описан процесс настройки NFS-сервера и его клиентов. NFS расшифровывается как Network File System (Сетевая Файловая Система). Клиенты, подключившие себе ресурсы с NFS-сервера, могут работать с файлами на удаленном сервере также, как если бы они располагались на локальном жестком диске. В статье мы будем придерживаться следующих соглашений: NFS-сервер: server.example.com с IP-адресом 192.168.0.100 NFS-клиент: [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье описан процесс настройки NFS-сервера и его клиентов. NFS расшифровывается как Network File System (Сетевая Файловая Система). Клиенты, подключившие себе ресурсы с NFS-сервера, могут работать с файлами на удаленном сервере также, как если бы они располагались на локальном жестком диске.<br />
<span id="more-68"></span><br />
В статье мы будем придерживаться следующих соглашений:</p>
<ul>
<li>NFS-сервер: server.example.com с IP-адресом 192.168.0.100</li>
<li>NFS-клиент: client.example.com с IP-адресом 192.168.0.101</li>
</ul>
<p><b>Установка NFS</b><br />
<i>Сервер</i></p>
<blockquote><p>apt-get install nfs-kernel-server nfs-common portmap</p></blockquote>
<p><i>Клиент</i></p>
<blockquote><p>apt-get install nfs-common portmap</p></blockquote>
<p><b>Экспорт директорий с сервера</b><br />
Сделаем директории <code>/home</code> и <code>/var/nfs</code> доступными для клиентов. Для этого мы должны &#8220;экспортировать&#8221; их с сервера. </p>
<p>Обычно клиент монтирует NFS-ресурс с правами <code>nobody</code>. Но директория <code>/home</code>, как правило, не принадлежит пользователю <code>nobody</code> (и категорически не рекомендуется менять ее владельца). Помимо чтения, мы хотим предоставить возможность <i>записи</i> в нее, так что укажем NFS, что мы хотим предоставлять доступ к <code>/home</code> от пользователя <code>root</code>. (Если выдается доступ только для чтения, то это не нужно). Ну и наконец необходимо создать директорию <code>/var/nfs</code> и изменить ее владельца на <code>nobody:nogroup</code></p>
<blockquote><p>
mkdir /var/nfs<br />
chown nobody:nogroup /var/nfs</p></blockquote>
<p>Теперь отредактируем файл <code>/etc/exports</code> в соответствии с описанными выше параметрами доступа к NFS-ресурсам.</p>
<blockquote><pre>
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/home           192.168.0.101(rw,sync,no_root_squash,no_subtree_check)
/var/nfs        192.168.0.101(rw,sync,no_subtree_check)</pre>
</blockquote>
<p>(Опция <code>no_root_squash</code> необходима для доступа к директории <code>/home</code> от имени <code>root</code>)<br />
Для получения более подробной информации по опциям и параметрам файла <code>exports</code> обратитесь к документации</p>
<blockquote><p>man 5 exports</p></blockquote>
<p>Чтобы сделанные изменения вступили в силу, выполните</p>
<blockquote><p>exportfs -a</p></blockquote>
<p><b>Монтирование NFS-ресурсов</b><br />
<i>Клиент</i><br />
Создадим точки монтирования для NFS-ресурсов:</p>
<blockquote><p>mkdir -p /mnt/nfs/home<br />
mkdir -p /mnt/nfs/var/nfs</p></blockquote>
<p>И попробуем их смонтировать:</p>
<blockquote><p>mount 192.168.0.100:/home /mnt/nfs/home<br />
mount 192.168.0.100:/var/nfs /mnt/nfs/var/nfs</p></blockquote>
<p>Проверим, смонтировались ли &#8220;шары&#8221;?</p>
<blockquote><pre>
client:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg0-root   19G  676M   17G   4% /
tmpfs                 253M     0  253M   0% /lib/init/rw
udev                   10M   80K   10M   1% /dev
tmpfs                 253M     0  253M   0% /dev/shm
/dev/sda1             471M   20M  427M   5% /boot
192.168.0.100:/home    29G  684M   27G   3% /mnt/nfs/home
192.168.0.100:/var/nfs
                       29G  684M   27G   3% /mnt/nfs/var/nfs
client:~#

client:~# mount
/dev/mapper/vg0-root on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
192.168.0.100:/home on /mnt/nfs/home type nfs (rw,addr=192.168.0.100)
192.168.0.100:/var/nfs on /mnt/nfs/var/nfs type nfs (rw,addr=192.168.0.100)
client:~#
</pre>
</blockquote>
<p><b>Проверяем работу с файлами</b><br />
Создадим тестовые файлы в смонтированных директориях<br />
<i>Клиент</i></p>
<blockquote><p>touch /mnt/nfs/home/test.txt<br />
touch /mnt/nfs/var/nfs/test.txt</p></blockquote>
<p>Теперь можно зайти на сервер и убедиться, что физически файлы созданы там</p>
<blockquote><pre>
server:~# ls -l /home/
total 4
drwxr-xr-x 2 administrator administrator 4096 2009-02-16 13:18 administrator
-rw-r--r-- 1 root          root             0 2009-03-12 17:08 test.txt
server:~#

server:~# ls -l /var/nfs
total 0
-rw-r--r-- 1 nobody nogroup 0 2009-03-12 17:08 test.txt
server:~#</pre>
</blockquote>
<p>Обратите внимание: в директории <code>/home</code> владельцем созданного файла является <code>root</code>, так как мы указали серверу, что мы работаем с этим ресурсои от имени <code>root</code>. В <code>/var/nfs</code> все &#8220;по умолчанию&#8221; &#8211; владелец <code>nobody</code></p>
<p><b>Монтирование NFS-ресурсов во время загрузки</b><br />
Для того, чтобы NFS-ресурсы монтировались автоматически во время загрузки клиента, добавьте следующие параметры в файл <code>/etc/fstab</code> на клиентской машине:</p>
<blockquote><pre>
[...]
192.168.0.100:/home  /mnt/nfs/home   nfs      rw,sync,hard,intr  0     0
192.168.0.100:/var/nfs  /mnt/nfs/var/nfs   nfs      rw,sync,hard,intr  0     0</pre>
</blockquote>
<p>Вместо <em>rw,sync,hard,intr</em> вы можете использовать другие опции монтирования. Для более полной информации прочтите</p>
<blockquote><p>man nfs</p></blockquote>
<p>Перезагрузите клиента. После загрузки ресурсы должны быть уже смонтированы.</p>
<p><noindex><b>Оригинал:</a> <a href="http://howtoforge.org/setting-up-an-nfs-server-and-client-on-debian-lenny">http://howtoforge.org/setting-up-an-nfs-server-and-client-on-debian-lenny</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/68/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chroot-окружение SSH/SFTP в Debian Lenny</title>
		<link>http://boombick.org/blog/posts/56</link>
		<comments>http://boombick.org/blog/posts/56#comments</comments>
		<pubDate>Fri, 20 Mar 2009 11:07:20 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Network]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/56</guid>
		<description><![CDATA[С версии 4.8 OpenSSH нативно поддерживает установку chroot-окружения и для этого больше не нужны патчи. Эта статья описывает настройку chroot-окружения для ваших пользователей при использовании SSH/SFTP. Пользователь будет &#8220;заперт&#8221; в своем каталоге без возможности доступа к основной системе Предисловие Описывается настройка chroot-окружения для OpenSSH версии 4.8 для Debian Lenny Для примера я буду использовать пользователя [...]]]></description>
			<content:encoded><![CDATA[<p>С версии 4.8 OpenSSH нативно поддерживает установку chroot-окружения и для этого больше не нужны патчи. Эта статья описывает настройку chroot-окружения для ваших пользователей при использовании SSH/SFTP. Пользователь будет &#8220;заперт&#8221; в своем каталоге без возможности доступа к основной системе<br />
<span id="more-56"></span><br />
<strong>Предисловие</strong><br />
Описывается настройка chroot-окружения для OpenSSH версии 4.8 для Debian Lenny<br />
Для примера я буду использовать пользователя <code>boombick</code> с домашней директорией <code>/home/boombick</code>. Пользователь <code>boombick</code> входит в группу <code>users</code>. Chroot-окружение будет ограничено директорией <code>/home</code></p>
<p><strong>Установка OpenSSH</strong><br />
Если OpenSSH-сервер еще не установлен в вашей системе, то установите его командой</p>
<blockquote>
<pre>
# aptitude install ssh openssh-server</pre>
</blockquote>
<p><strong>Включаем SFTP</strong><br />
Включить SFTP-доступ очень просто. Отредактируйте файл <code>/etc/ssh/sshd_config</code> следующим образом:</p>
<blockquote>
<pre>
# vim /etc/ssh/sshd_config</pre>
</blockquote>
<blockquote>
<pre>
[...]
Subsystem sftp /usr/lib/openssh/sftp-server
[...]</pre>
</blockquote>
<p>и добавьте в конец файла следующие строки (для каждого пользователя, которого вы хотите поместить в chroot):</p>
<blockquote>
<pre>
[...]
Match User boombick
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand /usr/lib/openssh/sftp-server</pre>
</blockquote>
<p>&#8230; либо для группы пользователей:</p>
<blockquote>
<pre>
[...]
Match Group users
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand /usr/lib/openssh/sftp-server</pre>
</blockquote>
<p>Последний вариант поместит всех пользователей, входящих в группу <code>users</code>, в chroot</p>
<p>Перезапустите ssh-сервер</p>
<blockquote><p> # /etc/init.d/ssh restart</p></blockquote>
<p>Если вы настраиваете chroot для нескольких пользователей в одну директорию (<code>/home</code> в нашем примере) и не хотите, чтобы они просматривали личные директории друг друга, то не забудьте присвоить верные права для директорий:</p>
<blockquote><p> chmod 700 /home/boombick</p></blockquote>
<p>Теперь вы можете зайти на сервер при помощи SFTP-клиента и работать в chroot-окружении.</p>
<p><strong>SSH в chroot-окружении</strong><br />
Настройка chroot для SSH более трудоемка из-за того, что необходимо настроить еще и программное окружение, то есть поместить в chroot такие программы как <code>/bin/bash</code>, <code>/bin/cp</code> и т. д. Это значит, что мы должны будем скопировать эти программы и <em>библиотеки, которые они используют</em>, в наше chroot-окружение. Вы можете сделать это вручную, с помощью команды <code>cp</code>, а узнать список библиотек вам поможет команда ldd:</p>
<blockquote>
<pre>
# ldd /bin/bash
	linux-gate.so.1 =&gt;  (0xb7fbd000)
	libncurses.so.5 =&gt; /lib/libncurses.so.5 (0xb7f75000)
	libdl.so.2 =&gt; /lib/i686/cmov/libdl.so.2 (0xb7f71000)
	libc.so.6 =&gt; /lib/i686/cmov/libc.so.6 (0xb7e0f000)
	/lib/ld-linux.so.2 (0xb7fbe000)</pre>
</blockquote>
<p>Также надо создать системные устройства <code>/dev/null</code>, <code>/dev/zero</code>, <code>/dev/tty</code> и <code>/dev/urandom</code>. Это можно сделать командой <code>mknod</code><br />
Но делать это вручную весьма утомительно :) Хорошо, что есть люди, которые помогли облегчить нам эту процедуру. Wolfgang Fuschlberger написал <a href="http://boombick.org/make_chroot_jail.sh">bash-скрипт</a>, который позволяет автоматизировать процесс создания chroot-окружения.</p>
<p>Для начала установим некоторые необходимые пакеты:</p>
<blockquote><p> aptitutde install sudo debianutils coreutils</p></blockquote>
<p>Затем скачаем скрипт, пометим его в <code>/usr/local/sbin</code> сделаем его исполняемым</p>
<blockquote><p> chmod 700 /usr/local/sbin/make_chroot_jail.sh</p></blockquote>
<p>Но перед стартом добавим некоторые приложения, которые мы хотим сделать доступными для использования в chroot, например, <code>vim</code></p>
<blockquote><p> vim /usr/local/sbin/make_chroot_jail.sh</p></blockquote>
<blockquote>
<pre>
[...]
elif [ "$DISTRO" = DEBIAN ]; then
  APPS="/bin/bash /bin/cp /usr/bin/dircolors /bin/ls /bin/mkdir /bin/mv /bin/rm /bin/rmdir /bin/sh /bin/su /usr/bin/groups /usr/bin/id /usr/bin/rsync /usr/bin/ssh /usr/bin/scp /sbin/unix_chkpwd /usr/bin/vim"
else
[...]</pre>
</blockquote>
<p>Затем создадим симлинк в <code>/home</code>, указывающий на сам <code>/home</code></p>
<blockquote>
<pre>
cd /home
ln -s . home</pre>
</blockquote>
<p>Теперь можно запускать скрипт. Его запускают со следующими параметрами</p>
<blockquote><p>make_chroot_jail.sh username [/path/to/chroot-shell [/path/to/chroot]]</p></blockquote>
<p><code>chroot-shell</code> &#8211; это специальная оболочка для пользователей в chroot, которую создает скрипт. Но OpenSSH поддерживает chroot нативно, поэтому мы будем использовать обычный <code>/bin/bash</code> или <code>/bin/sh</code><br />
Не имеет значения, существует ли пользователь в системе или нет. Если пользователя нет, то он будет создан. Если есть &#8211; его данные будут обновлены.</p>
<blockquote><p># make_chroot_jail.sh boombick /bin/bash /home</p></blockquote>
<p>Эта команда создаст/обновит данные пользователя boombick для его работы в chroot<br />
Для обновления всех файлов/библиотек в chroot выполните</p>
<blockquote><p>make_chroot_jail.sh update /bin/bash /home</p></blockquote>
<p>Теперь немного подредактируем конфиг (примерно так же, как мы делали для SFTP)</p>
<blockquote><p> vim /etc/ssh/sshd_config</p></blockquote>
<p>И добавим следующие строки для каждого пользователя в chroot</p>
<blockquote>
<pre>
[...]
Match User boombick
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no</pre>
</blockquote>
<p>Или для группы пользователей</p>
<blockquote>
<pre>
[...]
Match Group users
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no</pre>
</blockquote>
<p>Разница в том, что мы не добавляем строку <code>ForceCommand /usr/lib/openssh/sftp-server</code> в выражение <code>Match</code><br />
Таким образом пользователи могут использовать не только chroot-SFTP (убедитесь, что в <code>/etc/ssh/sshd_config</code> есть строка <code>Subsystem sftp /usr/lib/openssh/sftp-server</code>)<br />
Не забудьте перезапустить ssh-сервер</p>
<blockquote><p># /etc/init.d/ssh restart</p></blockquote>
<p><noindex><b>Оригинал: </b><a href="http://howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny">http://howtoforge.org/chrooted-ssh-sftp-tutorial-debian-lenny</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/56/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Виртуальные хосты на lighttpd с хранением конфигурации в MySQL</title>
		<link>http://boombick.org/blog/posts/49</link>
		<comments>http://boombick.org/blog/posts/49#comments</comments>
		<pubDate>Wed, 28 Jan 2009 10:29:07 +0000</pubDate>
		<dc:creator>boombick</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[web-servers]]></category>

		<guid isPermaLink="false">http://boombick.org/blog/posts/49</guid>
		<description><![CDATA[Статья посвящена настройке виртуальных хостов для lighttpd, работающего под управлением Debian, с хранением всех конфигурационных данных в MySQL. Главная особенность в том, что мы не будем использовать модуль для Лайти mod_mysql_vhost, который позволяет хранить в базе лишь имя хоста и его корневой раздел. Наша конфигурация более гибкая и позволяет хранить в БД все директивы для [...]]]></description>
			<content:encoded><![CDATA[<p>Статья посвящена настройке виртуальных хостов для lighttpd, работающего под управлением Debian, с хранением всех конфигурационных данных в MySQL. Главная особенность в том, что мы не будем использовать модуль для Лайти <code>mod_mysql_vhost</code>, который позволяет хранить в базе лишь имя хоста и его корневой раздел. Наша конфигурация более гибкая и позволяет хранить в БД все директивы для каждого виртуального хоста<br />
<span id="more-49"></span><br />
<b>Установка MySQL 5.0</b><br />
Устанавливаем MySQL:</p>
<blockquote><p>apt-get install mysql-server mysql-client</p></blockquote>
<p>Задаем пароль для пользователя <code>root</code> (замените <code>yourrootsqlpassword</code> на ваш пароль)</p>
<blockquote><p>mysqladmin -u root password yourrootsqlpassword</p></blockquote>
<p>Проверим, какие адреса слушает MySQL, при помощи команды</p>
<blockquote><p>netstat -tap | grep mysql</p></blockquote>
<p>Вывод должен быть примерно таким:</p>
<blockquote><pre>
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     2713/mysqld
</pre>
</blockquote>
<p>Это значит, что MySQL слушает только <code>localhost.localdomain</code> и вы установили пароль. Если  же вывод похож на:</p>
<blockquote><pre>
tcp        0      0 *:mysql *:*                     LISTEN     2713/mysqld
</pre>
</blockquote>
<p>вам необходимо также установить пароль для вашего хоста (в нашем примере это <code>server1.example.com</code>), иначе кто-угодно сможет подключиться к БД и манипулировать данными</p>
<blockquote><pre>
mysqladmin -h server1.example.com -u root password yourrootsqlpassword
</pre>
</blockquote>
<p><b>Устанавливаем Lighttpd, Python и python-mysqldb</b><br />
Мы будем использовать скрипт, написанный на Python, для чтения конфигурации из БД. Устанавливаем все необходимое:</p>
<blockquote><p>
apt-get install lighttpd python python-mysqldb
</p></blockquote>
<p><b>Подготовка базы данных</b><br />
Подключаемся к MySQL:</p>
<blockquote><p>mysql -u root -p</p></blockquote>
<p>создаем базу данных и пользователя. А также даем пользователю привилегии SELECT для запросов к нашей базе</p>
<blockquote><pre>
CREATE DATABASE lighttpd;
GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'secret';
GRANT SELECT ON lighttpd.* TO lighttpd@localhost.localdomain IDENTIFIED BY 'secret';
FLUSH PRIVILEGES;
</pre>
</blockquote>
<p>Не забудьте заменить &#8220;<code>secret</code>&#8221; на реальный пароль<br />
Осталось создать таблицу для наших виртуальных хостов и подготовка БД на этом закончена</p>
<blockquote><pre>
USE lighttpd;
CREATE TABLE IF NOT EXISTS domains (
domain varchar(64) NOT NULL PRIMARY KEY,
docroot varchar(128) NOT NULL,
config text
);
quit;
</pre>
</blockquote>
<p><b>Сценарий для получения данных из БД</b><br />
Создаем скрипт на python, который будет читать из БД конфигурацию виртуальных хостов</p>
<blockquote><pre>
#!/usr/bin/env python
import sys
import MySQLdb

# load configuration data from the database
db=MySQLdb.connect(host='localhost', db=sys.argv[1], user=sys.argv[2], passwd=sys.argv[3])
cur = db.cursor()
cur.execute("SELECT * FROM domains")
rs=cur.fetchall()
db.close()

for domain in rs:

    print "$HTTP[\"host\"] == \"%s\" {\nserver.document-root = \"%s\"\n%s\n}" % (domain[0], domain[1], domain[2])
</pre>
</blockquote>
<p>и сохраняем его в <code>/usr/share/lighttpd/mysql_vhost.py</code><br />
Делаем скрипт исполняемым</p>
<blockquote><p>chmod 755 /usr/share/lighttpd/mysql_vhost.py</p></blockquote>
<p>Теперь надо настроить Лайти для использования нашего срипта. Для этого открываем конфиг <code>/etc/lighttpd/lighttpd.conf</code> и добавляем в конец следующую строчку</p>
<blockquote><pre>
[...]
include_shell "/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret"
</pre>
</blockquote>
<p>(первый параметр &#8211; это имя БД, второй &#8211; имя пользователя БД, третий &#8211; пароль для доступа к БД)<br />
После всех изменений перезапустим lighttpd</p>
<blockquote><p>/etc/init.d/lighttpd restart</p></blockquote>
<p><b>Настройка виртуальных хостов</b><br />
В примере мы настроим два виртуальных хоста: <code>www.example.com</code> (с корневым разделом в <code>/var/www/www.example.com/web</code>) и <code>www.example.org</code> (с корневым разделом в <code>/var/www/www.example.org/web</code>). Мы будем использовать различные параметры для каждого хоста для демонстрации возможностей :)<br />
Для <code>www.example.com</code> мы разрешим листинг директорий и создадим алиас <code>test</code>, который будет указывать на DocumentRoot. Для <code><br />
www.example.org</code> листинг директорий будет отключен.</p>
<p>Если корневые разделы еще не существуют, то создадим их:</p>
<blockquote><p>
mkdir -p /var/www/www.example.com/web<br />
mkdir -p /var/www/www.example.org/web</p></blockquote>
<p>Подключаемся к MySQL и добавим описание наших хостов</p>
<blockquote><pre>
INSERT INTO domains VALUES ('www.example.com','/var/www/www.example.com/web/','dir-listing.activate = "enable"\nalias.url = ( "/test" => "/var/www/www.example.com/web" )');
INSERT INTO domains VALUES ('www.example.org','/var/www/www.example.org/web/','dir-listing.activate = "disable"');
</pre>
</blockquote>
<p>Обратите внимание на первый запрос <code>INSERT</code>. Если вы хотите использовать более одной директивы, то поместите между ними управляющий символ &#8220;\n&#8221;<br />
Все, виртуальные хосты настроены. Для проверки корректности работы нашего скрипта, запустим его из командной строки:</p>
<blockquote><p>/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret</p></blockquote>
<p>В выводе должна содержаться корректная информация о наших хостах:</p>
<blockquote><pre>
server1:~# /usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret
$HTTP["host"] == "www.example.com" {
server.document-root = "/var/www/www.example.com/web/"
dir-listing.activate = "enable"
alias.url = ( "/test" => "/var/www/www.example.com/web" )
}
$HTTP["host"] == "www.example.org" {
server.document-root = "/var/www/www.example.org/web/"
dir-listing.activate = "disable"
}
server1:~#</pre>
</blockquote>
<p>В отличие от <code>mod_mysql_vhost</code>, наш способ требует перезапуска сервера</p>
<blockquote><p>/etc/init.d/lighttpd restart</p></blockquote>
<p><b>Тестируем</b><br />
Пришло время проверить, верно ли работают наши виртуальные хосты. В корневых директориях хостов нет индексных файлов<br />
<code>http://www.example.com</code> (листинг директорий включен)<br />
<a href='http://boombick.org/blog/wp-content/uploads/2009/01/11.png' title='11.png'><img src='http://boombick.org/blog/wp-content/uploads/2009/01/11.thumbnail.png' alt='11.png' /></a></p>
<p><code>http://www.example.com/test</code> Директории <code>test</code> не существует, но мы прописали алиас для этого пути. Поэтому мы видим содержимое DocumentRoot<br />
<a href='http://boombick.org/blog/wp-content/uploads/2009/01/21.png' title='21.png'><img src='http://boombick.org/blog/wp-content/uploads/2009/01/21.thumbnail.png' alt='21.png' /></a></p>
<p><code>http://www.example.org</code> Мы получаем ошибку 404, потому что индексного файла нет, а листинг директорий отключен<br />
<a href='http://boombick.org/blog/wp-content/uploads/2009/01/31.png' title='31.png'><img src='http://boombick.org/blog/wp-content/uploads/2009/01/31.thumbnail.png' alt='31.png' /></a></p>
<p><code>http://www.example.org/test</code> Листинг директорий отключен, и мы не делали алиасов для этого хоста. Поэтому все та же ошибка 404<br />
<a href='http://boombick.org/blog/wp-content/uploads/2009/01/4.png' title='4.png'><img src='http://boombick.org/blog/wp-content/uploads/2009/01/4.thumbnail.png' alt='4.png' /></a></p>
<p><noindex><b>Оригинал:</b> <a href="http://howtoforge.org/creating-advanced-mysql-based-vhosts-on-lighttpd-debian-etch">http://howtoforge.org/creating-advanced-mysql-based-vhosts-on-lighttpd-debian-etch</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://boombick.org/blog/posts/49/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
