<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>it4it</title>
	
	<link>http://it4it.ru</link>
	<description />
	<lastBuildDate>Sun, 27 May 2012 11:05:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/It4it" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="it4it" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Обновление бложика</title>
		<link>http://it4it.ru/2012/05/27/obnovlenie-blozhika/</link>
		<comments>http://it4it.ru/2012/05/27/obnovlenie-blozhika/#comments</comments>
		<pubDate>Sun, 27 May 2012 11:05:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Заметки]]></category>
		<category><![CDATA[заметка]]></category>
		<category><![CDATA[новое]]></category>
		<category><![CDATA[обновление]]></category>

		<guid isPermaLink="false">http://it4it.ru/?p=839</guid>
		<description><![CDATA[Не писал в бложек уже очень давно, т.к. старый wordpress, отстойная тема не способстовали такому желанию, а желание было Поэтому я решил взять и обновиться, создав с нуля все, чтобы хотелось писать. Из изменений: Новый дизайн &#8212; приятная тема reverie Теперь нету index.php в адресах, хехей! более приятные ссылочки на RSS, twitter, github и социальный [...]]]></description>
			<content:encoded><![CDATA[<p>Не писал в бложек уже очень давно, т.к. старый wordpress, отстойная тема не способстовали такому желанию, а желание было <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Поэтому я решил взять и обновиться, создав с нуля все, чтобы хотелось писать. Из изменений:</p>
<ol>
<li>Новый дизайн &#8212; приятная тема reverie</li>
<li>Теперь нету index.php в адресах, хехей!</li>
<li>более приятные ссылочки на RSS, twitter, github и социальный шаринг</li>
<li>К сожалению, не получилось перенести комменты, поэтому все посты без комментриев (хотя и пофигу)</li>
</ol>
<p>Теперь, надеюсь, буду писать часто <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2012/05/27/obnovlenie-blozhika/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функциональное тестирование с freshen</title>
		<link>http://it4it.ru/2011/09/28/funkcionalnoe-testirovanie-s-freshen/</link>
		<comments>http://it4it.ru/2011/09/28/funkcionalnoe-testirovanie-s-freshen/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 20:05:40 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[freshen]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=478</guid>
		<description><![CDATA[Некоторое время назад, набрел в сети на пакет cucumber, который помогает создавать различные тесты. Все действия в тесте описываюстя с помощью файла  сценария, который пишется на языке Grekhin представляющий из себя обычный, понятный для человека текст на любом языке. К сожалению cucumber это разработка для Ruby, но у него есть практически полная копия переписаная под [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад, набрел в сети на пакет cucumber, который помогает создавать различные тесты. Все действия в тесте описываюстя с помощью файла  сценария, который пишется на языке <a href="https://github.com/cucumber/cucumber/wiki/Gherkin">Grekhin</a> представляющий из себя обычный, понятный для человека текст на любом языке. К сожалению cucumber это разработка для Ruby, но у него есть практически полная копия переписаная под Python с поддержкой nose и  зовется <a href="https://github.com/rlisagor/freshen">freshen</a></p>
<p>Теперь, расскажу про создание теста на freshen</p>
<p>Файл сценарий содержит в себе:</p>
<ol>
<li>Путь к файлу с шагами теста (steps файл)</li>
<li>Описание данного теста</li>
<li>Сценарии</li>
</ol>
<p>Для привязки шагов в коде с шагами в .feature файле используются декораторы.</p>
<p>Для примера, стандартный .feature файл с описанием сценария выглядит так (пример из документации):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Using step definitions from: <span style="color: #ff0000;">'steps'</span>, <span style="color: #ff0000;">'step/page_steps'</span>
&nbsp;
Feature: Destroy a document
  In order to take out one<span style="color: #ff0000;">'s anger on a document
  As an unsatisfied reader
  I want to be able to rip off the pages of the document
&nbsp;
  Scenario: Rip off a page
    Given a document of 5 pages
    And the page is 3
    When I rip off the current page
    Then the page is 3
    But the document has 4 pages</span></pre></div></div>

<p>Файл с шагами будет выглядеть примерно так:</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@Given<span style="color: black;">&#40;</span><span style="color: #483d8b;">'a document of 5 pages'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step1<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
@Given<span style="color: black;">&#40;</span><span style="color: #483d8b;">'the page is 3'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step2<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
@When<span style="color: black;">&#40;</span><span style="color: #483d8b;">'I rip off the current page'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step3<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
@Then<span style="color: black;">&#40;</span><span style="color: #483d8b;">'the page is 3'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step4<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span>
@Then<span style="color: black;">&#40;</span><span style="color: #483d8b;">'the document has 4 pages'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step5<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>Основные ключевые слова при использовании английского языка для написания сценариев:</p>
<p>Given, When, Then, But, And</p>
<p>Также, для описания шага можно использовать регулярные выражения:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">@Given<span style="color: black;">&#40;</span><span style="color: #483d8b;">'the page is ([d]+)'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> step2<span style="color: black;">&#40;</span>page<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>&nbsp;</p>
<p>Т.к. freshen поддерживает работу с nose, то для его запуска через nose можно использовать такую команду:</p>
<p>nosetests &#8212;with-freshen test.feature</p>
<p>После выполнения тестов, если не было неудачно закончившихся шагов, покажет что все хорошо, иначе покажет на каком степе остановился. Также, freshen поддерживает тэги, которые можно повесить на сценарии и запускать только по тэгам.</p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2011/09/28/funkcionalnoe-testirovanie-s-freshen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Социальные штуки в Django с Redis часть 2</title>
		<link>http://it4it.ru/2011/06/04/socialnye-shtuki-v-django-s-redis-chast-2/</link>
		<comments>http://it4it.ru/2011/06/04/socialnye-shtuki-v-django-s-redis-chast-2/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 13:15:50 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[комментари]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=462</guid>
		<description><![CDATA[В прошлой части я рассказал, как использую Redis в Django для показа онлайн пользователей. Во второй же части я расскажу, как сделать показ новых комментариев для постов (количество у каждого поста и подсветка новых в посте). Разберемся сначала, из каких частей будет состоять вся &#171;индикация&#187;: 1. Тэг, показывающий сколько новых комментариев в топике у данного [...]]]></description>
			<content:encoded><![CDATA[<p>В прошлой части я рассказал, как использую Redis в Django для показа онлайн пользователей. Во второй же части я расскажу, как сделать показ новых комментариев для постов (количество у каждого поста и подсветка новых в посте).</p>
<p>Разберемся сначала, из каких частей будет состоять вся &#171;индикация&#187;:</p>
<p>1. Тэг, показывающий сколько новых комментариев в топике у данного пользователя</p>
<p>2. Функция, возвращающая номера новых комментариев в посте и удаляющая их из базы</p>
<p>3. Функция добавляющая новый комментарий в список &#8216;новых&#8217; для всех пользователей</p>
<p>Для понимания работы этих функций, рассмотрим ключи в базе:</p>
<p>&#8216;users:%username%:posts&#8217; &#8212; содержит номера новых постов</p>
<p>&#8216;users:%username%:%post.id%&#8217; &#8212; содержит id комментариев для поста</p>
<p>&#8216;users:%username%&#8217; &#8212; общее количество новых комментариев</p>
<p>Теперь, рассмотрим функции по работе с базой и их применение для каждого случая.</p>
<p>Все начинается с того, что при сохранении комментария его id записывается в базу для каждого юзера:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> add_comment<span style="color: black;">&#40;</span>sender, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
    comment = kwargs<span style="color: black;">&#91;</span><span style="color: #483d8b;">'instance'</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> redis_db.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users'</span><span style="color: black;">&#41;</span>:
        users = redis_db.<span style="color: black;">smembers</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> comment.<span style="color: black;">author</span>.<span style="color: black;">username</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> users:
            redis_db.<span style="color: black;">sadd</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users'</span>, comment.<span style="color: black;">author</span>.<span style="color: black;">username</span><span style="color: black;">&#41;</span>
            users.<span style="color: black;">add</span><span style="color: black;">&#40;</span>comment.<span style="color: black;">author</span>.<span style="color: black;">username</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        redis_db.<span style="color: black;">sadd</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users'</span>, comment.<span style="color: black;">author</span>.<span style="color: black;">username</span><span style="color: black;">&#41;</span>
        users = redis_db.<span style="color: black;">smembers</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">user</span> <span style="color: #ff7700;font-weight:bold;">in</span> users:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">user</span> == comment.<span style="color: black;">author</span>.<span style="color: black;">username</span>:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> redis_db.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>redis_db.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span> <span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>settings, <span style="color: #483d8b;">'UNREAD_LIMIT'</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>:
                redis_db.<span style="color: black;">incr</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span>
                redis_db.<span style="color: black;">sadd</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>, comment.<span style="color: black;">post</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>, comment.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
                redis_db.<span style="color: black;">sadd</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:posts'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">user</span>, comment.<span style="color: black;">post</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">continue</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            redis_db.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">user</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Работает код просто, сначала достаем список со всеми пользователями (ключ &#8216;users&#8217;), а потом проходимся по каждому и добавляем номер комментария в ключ с номером поста (&#8216;users:%username%:%post.id%&#8217;) и увеличиваем количество новых комментариев.</p>
<p>Данная функция сделана как сигнал и используется при сохранении комментария:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">post_save.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>add_comment, sender=Comment<span style="color: black;">&#41;</span></pre></div></div>

<p>Для отображения количества новых комментариев у каждого поста, используется такой тэг:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">register = template.<span style="color: black;">Library</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
@register.<span style="color: black;">tag</span><span style="color: black;">&#40;</span>name=<span style="color: #483d8b;">'newcom_count'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> get_count_newcom<span style="color: black;">&#40;</span><span style="color: #dc143c;">parser</span>, <span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>:
    bits = <span style="color: #dc143c;">token</span>.<span style="color: black;">split_contents</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bits<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">3</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> NewcomCountNode<span style="color: black;">&#40;</span>bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bits<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">5</span> <span style="color: #ff7700;font-weight:bold;">and</span> bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'as'</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> NewcomCountNode<span style="color: black;">&#40;</span>bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>, bits<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">raise</span> template.<span style="color: black;">TemplateSyntaxError</span>, <span style="color: #483d8b;">&quot;%r tag requires a two argument, username and post_id&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">token</span>.<span style="color: black;">contents</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> NewcomCountNode<span style="color: black;">&#40;</span>template.<span style="color: black;">Node</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, username, count, varname=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">username</span> = template.<span style="color: black;">Variable</span><span style="color: black;">&#40;</span>username<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">count</span> = template.<span style="color: black;">Variable</span><span style="color: black;">&#40;</span>count<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">varname</span> = varname
    <span style="color: #ff7700;font-weight:bold;">def</span> render<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, context<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            username = <span style="color: #008000;">self</span>.<span style="color: black;">username</span>.<span style="color: black;">resolve</span><span style="color: black;">&#40;</span>context<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> template.<span style="color: black;">VariableDoesNotExist</span>:
            username = <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            count = <span style="color: #008000;">self</span>.<span style="color: black;">count</span>.<span style="color: black;">resolve</span><span style="color: black;">&#40;</span>context<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> template.<span style="color: black;">VariableDoesNotExist</span>:
            count = <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">varname</span>:
            context<span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">varname</span><span style="color: black;">&#93;</span> = get_post_newcom<span style="color: black;">&#40;</span>username, count<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">''</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> get_post_newcom<span style="color: black;">&#40;</span>username, count<span style="color: black;">&#41;</span></pre></div></div>

<p>Он используется в темплейтах, как</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: black;">&#123;</span><span style="color: #66cc66;">%</span> newcom_count <span style="color: #dc143c;">user</span>.<span style="color: black;">username</span> post.<span style="color: #008000;">id</span> <span style="color: #ff7700;font-weight:bold;">as</span> newcom <span style="color: #66cc66;">%</span><span style="color: black;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&lt;</span>span style=<span style="color: #483d8b;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;</span><span style="color: #66cc66;">&gt;</span>Функция для работы с базой:<span style="color: #66cc66;">&lt;</span>/span<span style="color: #66cc66;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> get_post_newcom<span style="color: black;">&#40;</span>username, post_id<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        count = redis_db.<span style="color: black;">scard</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>username, post_id<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span>:
        count = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>count<span style="color: black;">&#41;</span></pre></div></div>

<p>Она всего-лишь достает количество новых комментариев, если таких нет, то вернет 0.</p>
<p>В самом посте, чтобы узнать какой комментарий является новым, используем такую функцию:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> del_comment<span style="color: black;">&#40;</span>post, username<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> redis_db.<span style="color: black;">srem</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:posts'</span> <span style="color: #66cc66;">%</span> username, post.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>:
        comments = redis_db.<span style="color: black;">smembers</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>username, post.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        redis_db.<span style="color: black;">delete</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>username, post.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        count = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>redis_db.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> username<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        redis_db.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'users:%s'</span> <span style="color: #66cc66;">%</span> username, count - <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>comments<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        comments = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> comments<span style="color: black;">&#93;</span></pre></div></div>

<p>На вход она принимает instance post и имя пользователя, а на выход отдает список с id комментариев. В своей работе, она также удаляет из ключа новые посты. Передача его в шаблон, позволяет простой проверкой узнавать, новый или нет комментарий.<br />
Я использую во вьюхе вывода поста:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">newcomments = del_comment<span style="color: black;">&#40;</span>post, request.<span style="color: #dc143c;">user</span>.<span style="color: black;">username</span><span style="color: black;">&#41;</span></pre></div></div>

<p>А в шаблоне делаю проверку:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: black;">&#123;</span><span style="color: #66cc66;">%</span> <span style="color: #ff7700;font-weight:bold;">if</span> comment.<span style="color: #008000;">id</span> <span style="color: #ff7700;font-weight:bold;">in</span> newcom <span style="color: #66cc66;">%</span><span style="color: black;">&#125;</span></pre></div></div>

<p>На этом все и заканчивается. Как видно из кода, все достаточно просто, по сравнению с использованием реляционных баз.</p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2011/06/04/socialnye-shtuki-v-django-s-redis-chast-2/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Социальные штуки в Django с Redis часть 1</title>
		<link>http://it4it.ru/2011/04/04/socialnye-shtuki-v-django-s-redis-chast-1/</link>
		<comments>http://it4it.ru/2011/04/04/socialnye-shtuki-v-django-s-redis-chast-1/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 22:06:40 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=452</guid>
		<description><![CDATA[Для одного из сайтов надо было писать начальные социальные штуки, типа количество пользователей онлайн и количество новых комментариев для постов. Т.к. реализация этого с sql базами достаточно затратно по ресурсам и не самое простое дело, то было выбрано nosql хранилище Redis. В нем легко хранить ключи и большое количество значений, которое легко можно получить для [...]]]></description>
			<content:encoded><![CDATA[<p>Для одного из сайтов надо было писать начальные социальные штуки, типа количество пользователей онлайн и количество новых комментариев для постов. Т.к. реализация этого с sql базами достаточно затратно по ресурсам и не самое простое дело, то было выбрано nosql хранилище Redis. В нем легко хранить ключи и большое количество значений, которое легко можно получить для конкретных нужд.</p>
<p>Сначала рассмотрим реализацию индикатора пользователей онлайн вместе с Django.</p>
<p>Рассмотрим сначала теоретическую часть работы такого индикатора. Т.к. в вебе нет каких-либо четких механизмов узанавания, кто сейчас на сайте, то применяется простая практика. Каждую минуту записывается, кто из пользователей зашел на сайт, а раз в 5 минут делается выборка (группировка юзеров в каждую минуту) и вычисляется сколько их было. В моем конкретном примере, все пользователи зарегистрированы, т.е. учитывать анонимов не требуется. В Django для учета каждого пользователя и занесения его в базу очень подходит мидлварь (middleware). При заходе пользователя на любую страницу сайта, миддлварь его обрабатывает и заносит в базу со значением ключа указывающем время (например 23:10). А при запросе счетчиком, будут выбираться 5 ключей (23:10, 23:09, 23:08, 23:07, 23:06) объединяться и отдаваться. Общий процесс можно увидеть на картинке (не моей):</p>
<p><a href="http://it4it.ru/wp-content/uploads/2011/04/presence-online-users-diagram.png"><img class="aligncenter size-full wp-image-458" title="общий вид работы" src="http://it4it.ru/wp-content/uploads/2011/04/presence-online-users-diagram.png" alt="" width="534" height="410" /></a>Начнем рассмотрение кода:</p>
<p>Рассмотрим код миддлвари:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> OnlineUsersMiddleware:
    <span style="color: #ff7700;font-weight:bold;">def</span> process_request<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            dbwork.<span style="color: black;">set_to_key</span><span style="color: black;">&#40;</span>request.<span style="color: #dc143c;">user</span>.<span style="color: #008000;">id</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>Как видно, вся работа миддлвари это получить id юзера и передать его в функцию работы с базой.<br />
Рассмотрим саму функцию dbwork.set_to_key():</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> current_key<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%H:%M'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> set_to_key<span style="color: black;">&#40;</span>user_id<span style="color: black;">&#41;</span>:
    key = current_key<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    redis_db.<span style="color: black;">sadd</span><span style="color: black;">&#40;</span>key, user_id<span style="color: black;">&#41;</span>
    redis_db.<span style="color: black;">expire</span><span style="color: black;">&#40;</span>key, <span style="color: #ff4500;">360</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Первая (current_key) &#8212; выдает нам просто время (ее можно и соввместить впринципе), вторая (set_to_key), получает ключ, добавляет в базу ключ set, в который добавляем пользовательский id и устанавливаем на него время жизни 6 минут.</p>
<p>Далее, рассмотри функцию, которая выводит количество пользователей онлайн:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> get_online<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    now = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    interval = <span style="color: black;">&#91;</span>now - timedelta<span style="color: black;">&#40;</span>minutes=x<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
    interval = <span style="color: black;">&#91;</span>i.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%H:%M'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> interval<span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        online = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>redis_db.<span style="color: black;">sunion</span><span style="color: black;">&#40;</span>interval<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span>:
        online = <span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>online<span style="color: black;">&#41;</span></pre></div></div>

<p>тут interval &#8212; это список наших ключей, который получается получением дельты с текущим временем и 5 минут назад, потом по нему с помощью sunion() получаем все id пользователей, а len &#8212; количество (т.к. мне не нужны были имена, а только количество).</p>
<p>Для получения и выведения этого значения был написан контекст процессор, т.к. значение требуется во всех шаблонах:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> users_online<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    users = get_online<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">'count_users_online'</span>: users<span style="color: black;">&#125;</span></pre></div></div>

<p>Во всех модулях, redis_db это конект к базе редиса через официальный модуль Redis, примерно так открывающий коннект:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">try</span>:
    redis_db = redis.<span style="color: black;">Redis</span><span style="color: black;">&#40;</span>host=<span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>settings, <span style="color: #483d8b;">'REDIS_HOST'</span>, <span style="color: #483d8b;">'localhost'</span><span style="color: black;">&#41;</span>, 
                     port=<span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>settings, <span style="color: #483d8b;">'REDIS_PORT'</span>, <span style="color: #ff4500;">6379</span><span style="color: black;">&#41;</span>, 
                     db=<span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>settings, <span style="color: #483d8b;">'REDIS_DB'</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>, 
                     password=<span style="color: #008000;">getattr</span><span style="color: black;">&#40;</span>settings, <span style="color: #483d8b;">'REDIS_PASS'</span>, <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>,
                     socket_timeout=<span style="color: #ff4500;">0.01</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #ff7700;font-weight:bold;">pass</span></pre></div></div>

<p>Все, после этого можно использовать. Как видно &#8212; делается легко и просто, к тому же не захламляет sql базу и не сказывается на производительности (nosql очень быстр). Вместо использования redis можно использовать тот же memcache.</p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2011/04/04/socialnye-shtuki-v-django-s-redis-chast-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Запуск Django в virtualenv из под cherokee</title>
		<link>http://it4it.ru/2011/02/18/zapusk-django-v-virtualenv-iz-pod-cherokee/</link>
		<comments>http://it4it.ru/2011/02/18/zapusk-django-v-virtualenv-iz-pod-cherokee/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 17:13:24 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Заметки]]></category>
		<category><![CDATA[cherokee]]></category>
		<category><![CDATA[porno]]></category>
		<category><![CDATA[uwsgi]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=444</guid>
		<description><![CDATA[Не так давно, перешел я на использование cherokee, т.к. он новый, стильный, молодежный А вообще, пал выбор на него, т.к. из коробки хорошая работа с wsgi и другими штуками для python и ruby (да, пхп он тоже может).  Также, не надо писать конфиг, есть клевая админка, в которой все функции делаются в пару кликов. Также, [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно, перешел я на использование cherokee, т.к. он новый, стильный, молодежный <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>А вообще, пал выбор на него, т.к. из коробки хорошая работа с wsgi и другими штуками для python и ruby (да, пхп он тоже может).  Также, не надо писать конфиг, есть клевая админка, в которой все функции делаются в пару кликов.</p>
<p>Также, за последнее время начал использовать virtualenv для питоно сайтов, чтобы держать разные версии библиотек и не мешать друг другу. В такое окружение я запихнул 1 старенький интернет-магазин на Django 1.1, хотя в системе работают сайты и с Django 1.2.4, собственно почитать, что такое virtualenx можно <a href="http://virtualenv.openplans.org/">тут</a></p>
<p>Для начала определимся, что нам потребуется в системе:</p>
<ol>
<li>cherokee</li>
<li>uwsgi</li>
<li>python</li>
</ol>
<p>Итак, начнем с создания места расположения нашего django сайта.</p>
<p>У меня все сайты хранятся в /var/www/domain, либо для virtualenv /var/www/virtualenv/domain, что позволяет различать, где что.</p>
<p>Первым делом, требуется установить virtualenv и создать окружение.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pip <span style="color: #c20cb9; font-weight: bold;">install</span> virtualenv
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtualenv
&nbsp;
virtualenv <span style="color: #660033;">--no-site-packages</span> newsite</pre></div></div>

<p>Первая строка устанавливает virtualev (можно также через easy_install), а вторая собственно, создает изолированное пространство, со своим интерпретатором и библиотеками.</p>
<p>После этого, надо установить нужные пакеты в изолированное пространство:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">source</span> newsite<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>activate
&nbsp;
easy_install pip
&nbsp;
pip <span style="color: #c20cb9; font-weight: bold;">install</span> packages</pre></div></div>

<p>При работе в таком окружении, предполагается использование его интепретатора питона (версию можно другую поставить) и если оно активно у вас, то  скрипты будут запускаться изолированно.</p>
<p>Теперь, скопируем в наше окружение проект:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> from<span style="color: #000000; font-weight: bold;">/</span>path to<span style="color: #000000; font-weight: bold;">/</span>path<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>virtualenv<span style="color: #000000; font-weight: bold;">/</span>newsite<span style="color: #000000; font-weight: bold;">/</span>www</pre></div></div>

<p>Раз весь пример на основе Django, то следует рассказать про запускной скрипт.</p>
<p>Наш django-сайт будет работать через wsgi в связке с uwsgi, поэтому создадим в папке сайта файл: <strong>run.py  с содержимым:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'settings'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>
&nbsp;
application = django.<span style="color: black;">core</span>.<span style="color: black;">handler</span>
&nbsp;
s.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>И создадим файл uwsgi.xml с конфигурацией для uwsgi</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;</span>uwsgi<span style="color: #000000; font-weight: bold;">&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>pythonpath<span style="color: #000000; font-weight: bold;">&gt;/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>virtualsites<span style="color: #000000; font-weight: bold;">/</span>aw-d.ru<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">&lt;/</span>pythonpath<span style="color: #000000; font-weight: bold;">&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;</span>module<span style="color: #000000; font-weight: bold;">&gt;</span>RUN<span style="color: #000000; font-weight: bold;">&lt;/</span>module<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>uwsgi<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Все, с настройкой сайта покончено, перейдем к cherokee.</p>
<p>Для начала, запустим админку:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">cherokee-admin -bваш_IP</pre></div></div>

<p>После этого, заходим на этот IP порт 9090, вводим логин и пароль и видим панель управления cherokee. Именно в этой админке, можно делать все настройки сайтов и самого веб-сервера.</p>
<p>Для запуска сайта на Django в cherokee имеется мастер. Его мы и будем использовать:</p>
<p>Идем на вкладку vServers (вверху) затем слева на +, в окне выбираем Platforms &#8212; Django &#8212; Add</p>
<p>В появившемся мастере для Django жмем сразу Next, в путь Django Local Directory вписываем полный путь к джанго проекту, в моем случае /var/www/virtualsites/test/www</p>
<p>На следующем экране:</p>
<p><strong>New Host Name</strong> &#8212; название домена</p>
<p><strong>Document Root</strong> &#8212; где располагается проект</p>
<p>После нажатия на Create, в списке виртуальных серверов появится новый.</p>
<p>По-умолчанию, cherokee для django использует flup, поэтому надо будет изменить способ запуска. Для этого идем во вкладку Sources &#8212; Слева выбираем последний созданый источник (обычно DjangoNN)</p>
<p>В его настройках нам надо поле Interpreter, на такое:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>путь<span style="color: #000000; font-weight: bold;">/</span>до<span style="color: #000000; font-weight: bold;">/</span>uwsgi <span style="color: #660033;">-s</span> 127.0.0.1:<span style="color: #000000;">60407</span> <span style="color: #660033;">-x</span> <span style="color: #000000; font-weight: bold;">/</span>полный<span style="color: #000000; font-weight: bold;">/</span>путь<span style="color: #000000; font-weight: bold;">/</span>до<span style="color: #000000; font-weight: bold;">/</span>файла<span style="color: #000000; font-weight: bold;">/</span>wsgi.xml <span style="color: #660033;">-H</span> <span style="color: #000000; font-weight: bold;">/</span>путь<span style="color: #000000; font-weight: bold;">/</span>до<span style="color: #000000; font-weight: bold;">/</span>виртуального<span style="color: #000000; font-weight: bold;">/</span>окружения<span style="color: #000000; font-weight: bold;">/</span>сайта <span style="color: #660033;">-t</span> <span style="color: #000000;">10</span> <span style="color: #660033;">-M</span> <span style="color: #660033;">-p</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-R</span> <span style="color: #000000;">2000</span> <span style="color: #660033;">-C</span></pre></div></div>

<p>путь до виртуального окружения сайта вида: /var/www/virtualsites/site</p>
<p>Все, сохраняем эту конфигурацию и проверяем, как работает наш сайт.</p>
<p>Сайт должен будет работать, но без статики <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Для настройки статики требуется прописать 1 правило в свойствах виртуального сервера.<br />
Идем в vServers &#8212; выбираем ваш сайт &#8212; вкладка Behavior &#8212; Rule management<br />
Создаем новое нажатием на +<br />
В появившемся окне выбираем Manual &#8212; Rule type &#8212; Directory, в Web Directory вписываем ваш урл для статики (я обычно использую /static) и жмем Add, пото заходим Handler и в Document Root вписываем полный путь до папки со статикой.</p>
<p>Все, после сохранения конфигурации и перезагрузки cherokee, ваш сайт должен работать.</p>
<p>Если сайт не работает, то следует проверить строку для запуска uwsgi, просто скопируйте всю строку из Interpreter в консоль и запустите, если wsgi процесс запустится, значит здесь проблем нет.</p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2011/02/18/zapusk-django-v-virtualenv-iz-pod-cherokee/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Наваял свою аплоадилку-сокращалку картинок</title>
		<link>http://it4it.ru/2010/10/10/navayal-svoyu-aploadilku-sokrashhalku-kartinok/</link>
		<comments>http://it4it.ru/2010/10/10/navayal-svoyu-aploadilku-sokrashhalku-kartinok/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 22:53:02 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Всякое]]></category>
		<category><![CDATA[flask]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[мой проект]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=441</guid>
		<description><![CDATA[И так, в ходе изучения python фреймворка flask и подключения домой 50 мбитного интернета, наваял сайт для аплоада картинок. Из реализованного сейчас только аплоад картинок, получение короткой ссылки на нее и установление доступа по паролю на нее Собственно, сам сайт вот сайтик Планирую в ближайшее время сделать: - возможность сокращения ссылок - аплоад картинки по [...]]]></description>
			<content:encoded><![CDATA[<p>И так, в ходе изучения python фреймворка flask и подключения домой 50 мбитного интернета, наваял сайт для аплоада картинок. Из реализованного сейчас только аплоад картинок, получение короткой ссылки на нее и установление доступа по паролю на нее <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Собственно, сам сайт вот <a href="http://int18h.ru">сайтик</a></p>
<p>Планирую в ближайшее время сделать:</p>
<p>- возможность сокращения ссылок</p>
<p>- аплоад картинки по URL</p>
<p>- статистику по просмотру картинки втечение месяца</p>
<p>- сменить домен (это наверно первое <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>- возможно заменить выдачу только картинки по ссылке на страницу, где будет некоторая информация о картинке, а также всякие социальные кнопки</p>
<p>- добавить twitter авторизацию и добавление сразу ссылки в твиттер</p>
<p>- если кто сделать дизайн, сменить дизайн (могу я помечтать?)</p>
<p>О багах, прошу писать либо сюда комменты, либо в твиттер, жаббер, аську, буду только рад <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2010/10/10/navayal-svoyu-aploadilku-sokrashhalku-kartinok/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>hgweb на lighttpd</title>
		<link>http://it4it.ru/2010/05/14/hgweb-na-lighttpd/</link>
		<comments>http://it4it.ru/2010/05/14/hgweb-na-lighttpd/#comments</comments>
		<pubDate>Fri, 14 May 2010 08:20:00 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[hgweb]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[mercurial]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=436</guid>
		<description><![CDATA[Опять давно ничего не писал А сегодня решил напомнить, что я жив и рассказать, как поднять свой hg репозитарий с web мордой на веб-сервере Lighttpd. Предположим, что mercurial и Lighttpd у вас уже установлены, а репозитарии hg будут храниться в /var/www. Т.к. hgweb мы будем запускать через fastcgi (единственный возможный на lighttpd, не считая прокси), [...]]]></description>
			<content:encoded><![CDATA[<p>Опять давно ничего не писал <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  А сегодня решил напомнить, что я жив и рассказать, как поднять свой hg репозитарий с web мордой на веб-сервере Lighttpd.</p>
<p>Предположим, что mercurial и Lighttpd у вас уже установлены, а репозитарии hg будут храниться в /var/www. Т.к. hgweb мы будем запускать через fastcgi (единственный возможный на lighttpd, не считая прокси), то нам потребуется .fcgi скрипт, который будет создавать wsgi сервер с сокетом. Т.к. у меня кучка django сайтов, то я сделал папку /var/www/fcgi, в которой все их и храню <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>1. Создадим такую папку и положим в файл hgweb.fcgi такой код:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> mercurial <span style="color: #ff7700;font-weight:bold;">import</span> demandimport<span style="color: #66cc66;">;</span> demandimport.<span style="color: black;">enable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;HGENCODING&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">&quot;UTF-8&quot;</span>
<span style="color: #ff7700;font-weight:bold;">from</span> mercurial.<span style="color: black;">hgweb</span>.<span style="color: black;">hgwebdir_mod</span> <span style="color: #ff7700;font-weight:bold;">import</span> hgwebdir
<span style="color: #ff7700;font-weight:bold;">from</span> mercurial.<span style="color: black;">hgweb</span>.<span style="color: black;">request</span> <span style="color: #ff7700;font-weight:bold;">import</span> wsgiapplication
<span style="color: #ff7700;font-weight:bold;">from</span> flup.<span style="color: black;">server</span>.<span style="color: black;">fcgi</span> <span style="color: #ff7700;font-weight:bold;">import</span> WSGIServer
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> make_web_app<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> hgwebdir<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hgweb.conf&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> wsgiapplication2<span style="color: black;">&#40;</span>app_maker<span style="color: black;">&#41;</span>:
    application = app_maker<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> run_wsgi<span style="color: black;">&#40;</span>env, respond<span style="color: black;">&#41;</span>:
        path = env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'PATH_INFO'</span><span style="color: black;">&#93;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hgweb.fcgi/'</span>,<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
        env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'PATH_INFO'</span><span style="color: black;">&#93;</span> = path
    <span style="color: #ff7700;font-weight:bold;">return</span> application<span style="color: black;">&#40;</span>env, respond<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">return</span> run_wsgi
&nbsp;
WSGIServer<span style="color: black;">&#40;</span>wsgiapplication2<span style="color: black;">&#40;</span>make_web_app<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>2. Тамже, положим файл hgweb.conf с конфигурацией нашего сервера:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>paths<span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">/</span>repo_name = <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>repo
<span style="color: #7a0874; font-weight: bold;">&#91;</span>web<span style="color: #7a0874; font-weight: bold;">&#93;</span>
style = gitweb
allow_archive = bz2 gz <span style="color: #c20cb9; font-weight: bold;">zip</span>
baseurl =</pre></div></div>

<p>В секции [paths] определяются все репозитории, которые будут видны в hgweb.</p>
<p>Baseurl &#8212; устанавливает префикс в url для доступа к репозитарию. В моем случае, ссылка будет http://example.com/repo_name.</p>
<p>3. Создадим репозиторий hg, либо склонируем его с локальнйо машины по ssh <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>repo
&nbsp;
hg init
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>repo
&nbsp;
hg clone . <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span><span style="color: #c20cb9; font-weight: bold;">login</span><span style="color: #000000; font-weight: bold;">@</span>example.com<span style="color: #000000; font-weight: bold;">//</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>repo</pre></div></div>

<p>При клонировании по ssh, важно не забыть именно два слэша, после адреса.</p>
<p>4. Конфигурируем lighttpd.</p>
<p>Создаем новый конфиг, я назвал его 15-hgweb.conf, имя значения не имеет впринципе <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Кладем в папочку и включаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conf-available<span style="color: #000000; font-weight: bold;">/</span>
&nbsp;
<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>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conf-available<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>-hgweb.conf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conv-enabled<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">15</span>-hgweb.conf</pre></div></div>

<p>Содержимое файла 15-hgweb.conf:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$HTTP</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;host&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> == <span style="color: #ff0000;">&quot;hg.example.com&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
&nbsp;
    server.document-root = <span style="color: #ff0000;">&quot;&quot;</span>
    server.errorlog = <span style="color: #ff0000;">&quot;/var/log/lighttpd/hgweb.error.log&quot;</span>
    accesslog.filename = <span style="color: #ff0000;">&quot;/var/log/lighttpd/hgweb.access.log&quot;</span>
    accesslog.format = <span style="color: #ff0000;">&quot;%h %l %u %f %t &quot;</span><span style="color: #000000; font-weight: bold;">%</span>r<span style="color: #ff0000;">&quot; %&amp;gt;s %b &quot;</span><span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>Referer<span style="color: #7a0874; font-weight: bold;">&#125;</span>i<span style="color: #ff0000;">&quot; &quot;</span><span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>User-Agent<span style="color: #7a0874; font-weight: bold;">&#125;</span>i<span style="color: #ff0000;">&quot;&quot;</span>
    server.follow-symlink = <span style="color: #ff0000;">&quot;enable&quot;</span>
&nbsp;
    url.rewrite-once = <span style="color: #7a0874; font-weight: bold;">&#40;</span>
    <span style="color: #ff0000;">&quot;^/(.*)$&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;/hgweb.fcgi/$1&quot;</span>,
    <span style="color: #7a0874; font-weight: bold;">&#41;</span>
    fastcgi.server = <span style="color: #7a0874; font-weight: bold;">&#40;</span>
        <span style="color: #ff0000;">&quot;/hgweb.fcgi&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>
        <span style="color: #ff0000;">&quot;main&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>
        <span style="color: #ff0000;">&quot;socket&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;/tmp/hgweb.socket&quot;</span>,
        <span style="color: #ff0000;">&quot;check-local&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;disable&quot;</span>,
        <span style="color: #ff0000;">&quot;bin-path&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;/path/to/hgweb.fcgi&quot;</span>,
        <span style="color: #ff0000;">&quot;broken-scriptfilename&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;enable&quot;</span>,
        <span style="color: #ff0000;">&quot;min-procs&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">1</span>,
        <span style="color: #ff0000;">&quot;max-procs&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">1</span>,
        <span style="color: #7a0874; font-weight: bold;">&#41;</span>
     <span style="color: #7a0874; font-weight: bold;">&#41;</span>
   <span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
    alias.url = <span style="color: #7a0874; font-weight: bold;">&#40;</span>
       <span style="color: #ff0000;">&quot;/static&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;/usr/share/mercurial/templates/static&quot;</span>,
    <span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
    <span style="color: #007800;">$HTTP</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;querystring&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> =~ <span style="color: #ff0000;">&quot;cmd=unbundle&quot;</span>  <span style="color: #7a0874; font-weight: bold;">&#123;</span>
       auth.backend = <span style="color: #ff0000;">&quot;htpasswd&quot;</span>
       auth.backend.htpasswd.userfile = <span style="color: #ff0000;">&quot;/path/to/passwd&quot;</span>
       auth.require = <span style="color: #7a0874; font-weight: bold;">&#40;</span>   <span style="color: #ff0000;">&quot;&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>
              <span style="color: #ff0000;">&quot;method&quot;</span>  =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;basic&quot;</span>,
              <span style="color: #ff0000;">&quot;realm&quot;</span>   =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;gigimon Repo&quot;</span>,
              <span style="color: #ff0000;">&quot;require&quot;</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;valid-user&quot;</span>
        <span style="color: #7a0874; font-weight: bold;">&#41;</span>
       <span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Последняя секция с авторизацией нужна для возможности делать push в репозитории. Если хотите сделать его публичным дял просомтра, либо убрать возможность пуша, то можете ее полностью убрать.</p>
<p>Также, для пуша требуется, чтобы в lighttpd был настроен SSL, в дефолтной поставке дебиана такое есть. Проверить можно в /etc/lighttpd/lighttpd.conf , обычно в самом низу:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$SERVER</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">&quot;socket&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> == <span style="color: #ff0000;">&quot;:443&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    ssl.engine = <span style="color: #ff0000;">&quot;enable&quot;</span>
    ssl.pemfile = <span style="color: #ff0000;">&quot;/etc/lighttpd/lighttpd.pem&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Файл с паролями, который указывается в auth.backend.htpasswd.userfile, создается командой htpasswd входящей в apache2-utils<br />
5. Теперь, если хотим разрешить пуш некоторым лицам, нам требуется настроить сам репозиторий через файл hgrc</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>repo<span style="color: #000000; font-weight: bold;">/</span>.hg<span style="color: #000000; font-weight: bold;">/</span>hgrc
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>web<span style="color: #7a0874; font-weight: bold;">&#93;</span>
allow_push = user1, user2
description = <span style="color: #ff0000;">&quot;example.com development&quot;</span></pre></div></div>

<p>Также, помимо разрешения, в этом файле задаются многие параметры для репозитория. Я использую авто апдейт кода при пуше в него, через строку:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>hooks<span style="color: #7a0874; font-weight: bold;">&#93;</span>
changegroup.upd = hg update</pre></div></div>

<p>После перезагрузки lighttpd</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><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>lighttpd restart</pre></div></div>

<p>По вашему адресу, должен будет появиться и работать hgweb, надеюсь у вас он появился <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2010/05/14/hgweb-na-lighttpd/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title>Создание VPN сети с помощью OpenVPN</title>
		<link>http://it4it.ru/2010/01/26/sozdanie-vpn-seti-s-pomoshhyu-openvpn/</link>
		<comments>http://it4it.ru/2010/01/26/sozdanie-vpn-seti-s-pomoshhyu-openvpn/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 23:13:12 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[Всякое]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=433</guid>
		<description><![CDATA[Потребовалось мне тут на досуге, реализовать VPN сеть для пары десятков компьютеров, находящихся в разных точках Земли. Для этого выбрал OpenVPN, а для сервера использовал свой VPS, который видят все. Итак, первое что нам необходимо, это установить OpenVPN apt-get install openvpn После этого, настрйока сервера и клиентов сводится к генерации ключей, раздачи их клиентам и [...]]]></description>
			<content:encoded><![CDATA[<p>Потребовалось мне тут на досуге, реализовать VPN сеть для пары десятков компьютеров, находящихся в разных точках Земли. Для этого выбрал OpenVPN, а для сервера использовал свой VPS, который видят все.</p>
<p>Итак, первое что нам необходимо, это установить OpenVPN</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> openvpn</pre></div></div>

<p>После этого, настрйока сервера и клиентов сводится к генерации ключей, раздачи их клиентам и написании 2-х конфигов (для сервера и клиентов).</p>
<p>Идем в папку /usr/share/openvpn/easy-rsa/2.0 (в этйо папке хранятся скрипты для создания ключей)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>openvpn<span style="color: #000000; font-weight: bold;">/</span>easy-rsa<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.0</span></pre></div></div>

<p>Теперь, начнем генерацию ключей:</p>
<p>1. Редактируем файл vars, который хранит значения по-умолчанию (чтобы не вводить кучу раз)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">nano</span> vars</pre></div></div>

<p>В самом низу, меняем</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">KEY_COUNTRY</span>=<span style="color: #ff0000;">&quot;RU&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">KEY_PROVINCE</span>=<span style="color: #ff0000;">&quot;Moscow oblast&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">KEY_CITY</span>=<span style="color: #ff0000;">&quot;Moscow&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">KEY_ORG</span>=<span style="color: #ff0000;">&quot;my-network&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">KEY_EMAIL</span>=<span style="color: #ff0000;">&quot;root@mynet.ru&quot;</span></pre></div></div>

<p>Теперь экспортиуре этот файл и генерируем корневой сертификат:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">source</span> .<span style="color: #000000; font-weight: bold;">/</span>vars
.<span style="color: #000000; font-weight: bold;">/</span>clean-all
.<span style="color: #000000; font-weight: bold;">/</span>build-ca</pre></div></div>

<p>После, генерируем ключ сервера:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>build-key-server server</pre></div></div>

<p>На последние 2 вопроса, отвечаем Y44</p>
<p>После, генерируем  ключ Диффи-Хэлмана</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>build-dh</pre></div></div>

<p>Он делается несколько минут, придется подождать</p>
<p>Теперь, генерируем ключи для каждого клиента</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>build-key client_name</pre></div></div>

<p>После этого, отдаем клиентам их ключи, а также файл ca.crt</p>
<p>Для большей защиты, на файлы server.key установить права 600, а на server.crt и dh1024.pem права 644</p>
<p>Теперь надо написать конфиг сервера.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">port <span style="color: #000000;">1194</span> <span style="color: #666666; font-style: italic;">#порт, на котором работать (рекомендуемый)</span>
proto udp <span style="color: #666666; font-style: italic;">#протокол, можно tcp</span>
dev tun <span style="color: #666666; font-style: italic;">#устройство, которое будет использоваться</span>
ca путь_до_файла_ca.crt
cert путь_до_файла_server.crt
key путь_до_файла_server.key
<span style="color: #c20cb9; font-weight: bold;">dh</span> путь_до_файла_dh1024.pem
server 10.10.10.0 255.255.255.0 <span style="color: #666666; font-style: italic;">#подсеть и маска для ВПН сети, из нее будут выдаваться адреса клиентам</span>
client-to-client <span style="color: #666666; font-style: italic;">#разрешаем общение между клиентами</span>
ifconfig-pool-persist <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>openvpn<span style="color: #000000; font-weight: bold;">/</span>ipp.txt <span style="color: #666666; font-style: italic;">#это позволит выдавать клиентам один и тот же IP</span>
comp-lzo <span style="color: #666666; font-style: italic;">#компрессия</span>
max-clients <span style="color: #000000;">28</span> <span style="color: #666666; font-style: italic;">#максимальное количество клиентов</span>
keepalive <span style="color: #000000;">10</span> <span style="color: #000000;">120</span> <span style="color: #666666; font-style: italic;">#каждые 10 секунд пинг, если нет ответа 120 секунд, то откидывать клиента</span>
persist-key <span style="color: #666666; font-style: italic;">#хранить ключи в памяти, не перечитывать с диска</span>
persist-tun <span style="color: #666666; font-style: italic;">#позволять держать соединение</span>
status <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>openvpn-status.log <span style="color: #666666; font-style: italic;">#статус сервера</span>
verb <span style="color: #000000;">6</span> <span style="color: #666666; font-style: italic;">#уровень отладки (нормально 2)</span>
log-append <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>openvpn.log <span style="color: #666666; font-style: italic;">#файл логов</span></pre></div></div>

<p>Теперь нам надо подготовить конфиг для клиентов.</p>
<p>На Windows, OpenVPN устанавливается в C:Program FIlesOpenVPN, а конфиг в папке config (логично <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Создадим в ней новый конфиг openvpn.ovpn и кинем в нее же сгенерированные ключи и сертификаты.</p>
<p>Впишем в конфиг следующее:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">client <span style="color: #666666; font-style: italic;">#указываем что мы клиент</span>
nobind <span style="color: #666666; font-style: italic;">#не цепляться за интерфейс</span>
dev tun <span style="color: #666666; font-style: italic;">#используемое устройство</span>
proto udp <span style="color: #666666; font-style: italic;">#протокол</span>
remote IP_сервера порт <span style="color: #666666; font-style: italic;">#куда конектиться</span>
resolv-retry infinite <span style="color: #666666; font-style: italic;">#количество попыток, infinite-бесконечно</span>
persist-key <span style="color: #666666; font-style: italic;">#хранить ключ в памяти</span>
persist-tun <span style="color: #666666; font-style: italic;">#держать соединение</span>
comp-lzo <span style="color: #666666; font-style: italic;">#сжатие</span>
ns-cert-type server
ca ca.crt <span style="color: #666666; font-style: italic;">#ключи</span>
cert название.crt
key название.key</pre></div></div>

<p>После этого, запустим OpenVPN, кликнем Connect, дождемся, когда компьютерики станут зелеными (это будет значить, что к серверу успешно подключились). Теперь можно открыть cmd и пропинговать шлюз, если пакеты ходят, то значит что все хорошо <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2010/01/26/sozdanie-vpn-seti-s-pomoshhyu-openvpn/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Настройка VPN сервера на Win2003 через шлюз с Linux</title>
		<link>http://it4it.ru/2010/01/15/nastrojka-vpn-servera-na-win2003-cherez-shlyuz-s-linux/</link>
		<comments>http://it4it.ru/2010/01/15/nastrojka-vpn-servera-na-win2003-cherez-shlyuz-s-linux/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 22:22:50 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[Всякое]]></category>
		<category><![CDATA[gre]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pptp]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[windows 2003]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=425</guid>
		<description><![CDATA[Был очень большой перерыв в бложике, писать было не о чем И вот на работе появилась задача, подключить 1 комп ко внутренней сети. Думал сначала взять OpenVPN, но решил, что незачем плодить сущности и пусть сервер поработает хоть немного. Итак, все описаное мной, было проверено на Windows 2003 EN. Приступим: 1. Для начала нам надо [...]]]></description>
			<content:encoded><![CDATA[<p>Был очень большой перерыв в бложике, писать было не о чем <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  И вот на работе появилась задача, подключить 1 комп ко внутренней сети. Думал сначала взять OpenVPN, но решил, что незачем плодить сущности и пусть сервер поработает хоть немного.</p>
<p>Итак, все описаное мной, было проверено на Windows 2003 EN. Приступим:</p>
<p>1. Для начала нам надо включить RRAS сервер (routing and remove access ), для этого идем Administrative tools &#8212; Routing and Remote access, увидим свой сервер, жмем правой кнопкой на него Configure and Enable Routing and Remote server, запустится мастер, ничего сложного, проходим его до конца.</p>
<p>2. Появится пункт IP Routing, открываем его, идем в пункт NAT/Basic Firewall, жмем правой кнопкой New Interface, добавляем внутренний и внешний интерфейс. Заходим</p>
<figure><a href="http://www.it4it.ru/wp-content/uploads/2010/01/vpn1.png"><img class="aligncenter size-medium wp-image-426" title="Окно с интерфейсами" src="http://www.it4it.ru/wp-content/uploads/2010/01/vpn1-450x319.png" alt="Окно с интерфейсами" width="450" height="319" /></a>У меня интерфейс to-optima идет к интернет-шлюзу (Linux машина) и он считается внешним, Lan &#8212; внутренняя сеть.</p>
<p>После этого,  правой кнопкой на внешнем интерфейсе, Properties. отмечаем галчоками Enable NAT Interface (если вам надо чтобы через этот интерфейс пользователи могли выходить в интернет) и Enable a basic firewall.</p>
<p><a href="http://www.it4it.ru/wp-content/uploads/2010/01/vpn2.png"><img class="aligncenter size-medium wp-image-427" title="настройка внешнего интерфейса" src="http://www.it4it.ru/wp-content/uploads/2010/01/vpn2-379x450.png" alt="настройка внешнего интерфейса" width="379" height="450" /></a></figure>
<p>Затем идем в Services and Ports и ставим галочку напротив  VPN Gateway (PPTP).</p>
<p>В настройках внутреннего интерфейса, должен быть выбран пункт: Private interface connected  to private network</p>
<p>3. Затем идем в пункт Remote Access Policies жмем правой и new remote access policy. Появистя мастер, походим его тыкая кнопку вперед. После его появления, жмем правой кнопкой &#8212; Properties. В первом же окне, ставим галочку у Grant remote access permission. Затем На вкладках Authentication и Ecnryption выбираем методы авторизации и шифрования (советую выбрать MS-CHAP 2, а в шифровании все пункты).</p>
<p>4.  Идем в пункт Ports &#8212; Properties. Здесь мы видем возможные способы подключения (PPPOE, PPTP, L2TP). Я оставил только PPTP. Чтобы выключить остальные, выбираем их, жмем кнопку Configure и пункт maximum ports до нуля. Но, следует отметить, что требуется установить нужное количество соединений в нужном способе подключения (у меня 5 соединений в PPTP), в конечном итоге у вас должно получиться что-то типа этого:</p>
<figure><a href="http://www.it4it.ru/wp-content/uploads/2010/01/vpn3.png"><img class="aligncenter size-full wp-image-428" title="Итоговая картина подключений" src="http://www.it4it.ru/wp-content/uploads/2010/01/vpn3.png" alt="Итоговая картина подключений" width="431" height="91" /></a></figure>
<p>5. Выбираем в меню свой сервер, правой кнопкой &#8212; Properties, первое меню настраиваем так:</p>
<figure><a href="http://www.it4it.ru/wp-content/uploads/2010/01/vpn4.png"><img class="aligncenter size-full wp-image-429" title="Настройки 1" src="http://www.it4it.ru/wp-content/uploads/2010/01/vpn4.png" alt="Настройки 1" width="403" height="424" /></a></figure>
<p>Теперь идем на вкладку IP и там есть 2 выбора, либо отдавать IP клиентам по DHCP (если он у вас настроен) либо из пула адресов (у меня из пула, соответственно его надо добавить нажав по кнопке Add).</p>
<p>Внизу, выбираем внутренний адаптер.</p>
<p>6. Теперь надо дать нужным пользователям возможность заходить по VPN. У меня все пользователи в домене, поэтому идем:  Administrative tools &#8212; Active Directory users, ищем нужного юзера, заходим в его настройки Properties, открываем вкладку Dial-In и ставим галочки:</p>
<figure><a href="http://www.it4it.ru/wp-content/uploads/2010/01/vpn5.png"><img class="aligncenter size-medium wp-image-430" title="Настройка юзера" src="http://www.it4it.ru/wp-content/uploads/2010/01/vpn5-384x450.png" alt="Настройка юзера" width="384" height="450" /></a></figure>
<p>После этого, настройка на Windows 2003 заканчивается. Если у вас нету перед ним шлюза на Linux, то можете пробовать подключиться (главное не забудьте правильно выставить настройки шифрования в подключении у клиента).</p>
<p>Для тех, у кого есть шлюз на Linux, потребуется сделать несколько действий</p>
<p>1. В правила iptables сделать DNAT порта VPN  tcp 1723 и протокола gre. Это можно сделать следующими правилами:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$IPT</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">1723</span> <span style="color: #660033;">-j</span> DNAT <span style="color: #660033;">--to-destination</span> <span style="color: #007800;">$your_server</span>
<span style="color: #007800;">$IPT</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-p</span> gre <span style="color: #660033;">-j</span> DNAT <span style="color: #660033;">--to-destination</span> <span style="color: #007800;">$your_server</span></pre></div></div>

<p>Ну и не забыть конечно разрешить FORWARD между внешним и внутренним интерфейсами протокола gre.</p>
<p>Также требуется подгрузить модуль ip_nat_pptp (в 5 дебиане он есть точно сразу)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">modprobe ip_nat_pptp</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2010/01/15/nastrojka-vpn-servera-na-win2003-cherez-shlyuz-s-linux/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Установка на Debian 5 — lighttpd + mod_deflate</title>
		<link>http://it4it.ru/2009/10/06/ustanovka-na-debian-5-lighttpd-mod_deflate/</link>
		<comments>http://it4it.ru/2009/10/06/ustanovka-na-debian-5-lighttpd-mod_deflate/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 21:41:02 +0000</pubDate>
		<dc:creator>gigimon</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bzip]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[веб сервер]]></category>
		<category><![CDATA[сжатие]]></category>

		<guid isPermaLink="false">http://www.it4it.ru/?p=417</guid>
		<description><![CDATA[После переезда с 1 хостера к другому, решил сменить apache2 на Lighttpd. Т.к. VPS мой на Debian 5 и там есть только Lighttpd версии 1.4.19, в которой нету такого нужного модуля, как mod_deflate, для сжатия передаваемых данных. Данный модуль появился только с версии 1.5, в 1.4 есть лишь mod_compress, который умеет только статчиеские файлы сжимать. [...]]]></description>
			<content:encoded><![CDATA[<p>После переезда с 1 хостера к другому, решил сменить apache2 на Lighttpd. Т.к. VPS мой на Debian 5 и там есть только Lighttpd версии 1.4.19, в которой нету такого нужного модуля, как mod_deflate, для сжатия передаваемых данных. Данный модуль появился только с версии 1.5, в 1.4 есть лишь mod_compress, который умеет только статчиеские файлы сжимать. К счастью, патч, реализующий mod_deflate,  доступен практически ко всей ветке 1.4. В этой статье рассмотрим, как доабвить mod_deflate модуль.</p>
<p>Для начала, установим пакет build-essential для сборки lighttpd в .deb пакет</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> build-essential</pre></div></div>

<p>Затем надо скачать сорцы lighttpd и патча:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #7a0874; font-weight: bold;">source</span> lighttpd
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>redmine.lighttpd.net<span style="color: #000000; font-weight: bold;">/</span>attachments<span style="color: #000000; font-weight: bold;">/</span>download<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">632</span><span style="color: #000000; font-weight: bold;">/</span>lighttpd-1.4.19.mod_deflate.patch</pre></div></div>

<p>Патчим:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> lighttpd-1.4.19
<span style="color: #c20cb9; font-weight: bold;">patch</span> <span style="color: #660033;">-p1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>lt; ..<span style="color: #000000; font-weight: bold;">/</span>lighttpd-1.4.19.mod_deflate.patch</pre></div></div>

<p>Теперь соберем в .deb пакет:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">dpkg-buildpackage</pre></div></div>

<p>После выполнения команды, у вас наверняка появится ошибка подобно этой:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">dpkg-checkbuilddeps: Unmet build dependencies: debhelper <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&amp;</span>gt;= 5.0.0<span style="color: #7a0874; font-weight: bold;">&#41;</span> cdbs libssl-dev zlib1g-dev libbz2-dev libattr1-dev libpcre3-dev libmysqlclient15-dev libldap2-dev libfcgi-dev libgdbm-dev libmemcache-dev liblua5.1-<span style="color: #000000;">0</span>-dev dpatch patchutils pkg-config uuid-dev libsqlite3-dev libxml2-dev</pre></div></div>

<p>Это означает, что нехватает этих пакетов для сборки. Надо их установить:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span>  cdbs libssl-dev zlib1g-dev libbz2-dev libattr1-dev libpcre3-dev</pre></div></div>

<p>После их установки, еще раз выполняем команду</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">build-essential</pre></div></div>

<p>Если по окончанию программы никаких ошибок не выявится, вы должны будете увидеть в папке на 1 уровень выше множество .deb пакет (примерно такого вида)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ..
<span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span>
rwxr-xr-x <span style="color: #000000;">8</span> root root   <span style="color: #000000;">4096</span> <span style="color: #000000;">2007</span>-08-08 <span style="color: #000000;">19</span>:09 lighttpd-1.4.19
<span style="color: #660033;">-rw-r--r--</span> <span style="color: #000000;">1</span> root src     <span style="color: #000000;">861</span> <span style="color: #000000;">2007</span>-08-08 <span style="color: #000000;">19</span>:07 lighttpd_1.4.19-<span style="color: #000000;">5</span>.dsc
<span style="color: #660033;">-rw-r--r--</span> <span style="color: #000000;">1</span> root src    <span style="color: #000000;">2000</span> <span style="color: #000000;">2007</span>-08-08 <span style="color: #000000;">19</span>:<span style="color: #000000;">12</span> lighttpd_1.4.19-5e_amd64.changes
<span style="color: #660033;">-rw-r--r--</span> <span style="color: #000000;">1</span> root src  <span style="color: #000000;">287998</span> <span style="color: #000000;">2007</span>-08-08 <span style="color: #000000;">19</span>:<span style="color: #000000;">12</span> lighttpd_1.4.19-<span style="color: #000000;">5</span>_amd64.deb</pre></div></div>

<p>Теперь установим Lighttpd:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">dpkg</span> <span style="color: #660033;">-i</span> lighttpd_1.4.19-<span style="color: #000000;">5</span>_amd64.deb</pre></div></div>

<p>Теперь скопируем сам модуль mod_deflate, в папку модулей Lighttpd (патч не патчит make файл, поэтому надо ручками)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>lighttpd-1.4.19<span style="color: #000000; font-weight: bold;">/</span>debian<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>mod_deflate.so <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>lighttpd</pre></div></div>

<p>Проверим, установился ли модуль и видит его lighttpd:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">lighttpd <span style="color: #660033;">-V</span>
lighttpd-1.4.19 <span style="color: #7a0874; font-weight: bold;">&#40;</span>ssl<span style="color: #7a0874; font-weight: bold;">&#41;</span> - a light and fast webserver
Build-Date: Oct  <span style="color: #000000;">5</span> <span style="color: #000000;">2009</span> 01:<span style="color: #000000;">35</span>:<span style="color: #000000;">25</span>
&nbsp;
Event Handlers:
&nbsp;
+ <span style="color: #000000; font-weight: bold;">select</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>generic<span style="color: #7a0874; font-weight: bold;">&#41;</span>
+ poll <span style="color: #7a0874; font-weight: bold;">&#40;</span>Unix<span style="color: #7a0874; font-weight: bold;">&#41;</span>
+ rt-signals <span style="color: #7a0874; font-weight: bold;">&#40;</span>Linux <span style="color: #000000;">2.4</span>+<span style="color: #7a0874; font-weight: bold;">&#41;</span>
+ epoll <span style="color: #7a0874; font-weight: bold;">&#40;</span>Linux <span style="color: #000000;">2.6</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
- <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>poll <span style="color: #7a0874; font-weight: bold;">&#40;</span>Solaris<span style="color: #7a0874; font-weight: bold;">&#41;</span>
- kqueue <span style="color: #7a0874; font-weight: bold;">&#40;</span>FreeBSD<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
Network handler:
&nbsp;
+ sendfile
&nbsp;
Features:
&nbsp;
+ IPv6 support
+ zlib support
+ <span style="color: #c20cb9; font-weight: bold;">bzip2</span> support
+ crypt support
+ SSL Support
+ PCRE support
+ mySQL support
+ LDAP support
+ memcached support
+ FAM support
+ LUA support
+ xml support
+ SQLite support
+ GDBM support</pre></div></div>

<p>Следует обратить внимание на наличие строки bzip2, если она присутствует, то mod_deflate установился.</p>
<p>После этих манипуляций, надо настроить сам модуль. Для этого создаем конфиг и впишем в него нужные опции (они будут действовать для всех хостов) и включим:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">nano</span> <span style="color: #660033;">-w</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conf-available<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">10</span>-deflate.conf
&nbsp;
<span style="color: #666666; font-style: italic;">#включением</span>
&nbsp;
deflate.enabled = <span style="color: #ff0000;">&quot;enable&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#степень компрессии</span>
&nbsp;
deflate.compression-level = <span style="color: #000000;">9</span>
deflate.mem-level = <span style="color: #000000;">9</span>
deflate.window-size = <span style="color: #000000;">15</span>
deflate.bzip2 = <span style="color: #ff0000;">&quot;enable&quot;</span>
deflate.min-compress-size = <span style="color: #000000;">200</span>
deflate.output-buffer-size = <span style="color: #000000;">4096</span>
deflate.work-block-size = <span style="color: #000000;">512</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#типы файлов, которые сжимать</span>
&nbsp;
deflate.mimetypes = <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;text/html&quot;</span>, <span style="color: #ff0000;">&quot;text/plain&quot;</span>, <span style="color: #ff0000;">&quot;text/css&quot;</span>, <span style="color: #ff0000;">&quot;text/javascript&quot;</span>, <span style="color: #ff0000;">&quot;text/xml&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<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>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conf-available<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">10</span>-deflate.conf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>lighttpd<span style="color: #000000; font-weight: bold;">/</span>conf-enabled<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">10</span>-deflate.conf</pre></div></div>

<p>После этого рестартим Lighttpd и проверяем с помощью Opera DragonFly или FF FireBug (ну или чем вам удобно смотреть HTTP заголовки) на предмет сжатия.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><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>lighttpd restart</pre></div></div>

<p>Все, после этого должно все работать <img src='http://it4it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Надеюсь это вам помогло</p>
]]></content:encoded>
			<wfw:commentRss>http://it4it.ru/2009/10/06/ustanovka-na-debian-5-lighttpd-mod_deflate/feed/</wfw:commentRss>
		<slash:comments>68</slash:comments>
		</item>
	</channel>
</rss>

