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

<channel>
	<title>Персональный блог Валерия Леонтьева &#187; IT</title>
	<atom:link href="http://valera.ws/category/it/feed/" rel="self" type="application/rss+xml" />
	<link>http://valera.ws</link>
	<description>Маленький блог для публикации интересных личных заметок</description>
	<lastBuildDate>Tue, 20 Apr 2010 19:23:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Debian 5 и датчики температуры для Intel Atom (330)</title>
		<link>http://valera.ws/2010.03.14~debian-5-coretemp-intel-atom/</link>
		<comments>http://valera.ws/2010.03.14~debian-5-coretemp-intel-atom/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 10:24:19 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Intel Atom]]></category>
		<category><![CDATA[ION]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=379</guid>
		<description><![CDATA[Проблема: если на платформу ION с процессором Intel Atom (вообще — любым, но у меня Atom 330) установить Debian Linux 5, то датчики температцры процессора &#8220;из коробки&#8221; не заработают. Связано это с тем, что в моделу ядра coretemp.ko не включена поддержка этого семейства процессоров. А sensors-detect не умеет их находить. О том, как включить поддержку [...]]]></description>
			<content:encoded><![CDATA[<p>Проблема: если на платформу ION с процессором Intel Atom (вообще — любым, но у меня Atom 330) установить Debian Linux 5, то датчики температцры процессора &#8220;из коробки&#8221; не заработают. Связано это с тем, что в моделу ядра coretemp.ko не включена поддержка этого семейства процессоров. А sensors-detect не умеет их находить. О том, как включить поддержку и получать сведения о температуре, написано далее.<span id="more-379"></span> На самом деле все очень просто. Процессоры семейства Atom придерживаются старой архитектуры X86 и работают аналогично другим процессорам от Intel, т.е. их поддержка в моделу ядра есть, просто она не включена. Чтобы исправить положение, нужно пересобрать модуль ядра, который отвечает за работу с датчиками. Процедура довольно простая и по шагам описана ниже.  Кроме обновления самого модуля, требуется обновить скрипт sensors-detect, чтобы он научился находить новые датчики.</p>
<p>Debian 5.0. Как обычно, сначала требуется обновить систему. А затем:</p>
<p>0) Если еще не установлены, то устанавливаем</p>
<p>#lm-sensors  apt-get install lm-sensors</p>
<p>1) Сливаем свежую версию (2010-02-19) sensors-detect. Файл можно <a href="http://www.mediafire.com/file/umcjzryjm01/sensors-detect.rar">взять готовый</a> или выдернуть <a href="http://www.mediafire.com/file/umcjzryjm01/sensors-detect.rar" target="_blank">из официальных билдов</a>.</p>
<p>Файл должен быть положен в: /usr/sbin/sensors-detect и иметь права 755.</p>
<p>2) Готовимся к сборке модуля ядра:</p>
<p>#apt-get install build-essential linux-headers-$(uname -r) linux-source-$(uname -r | awk -F&#8217;-&#8217; &#8216;{print $1}&#8217;)</p>
<p>3) Патчим исходники стандартного дебиановского модуля coretemp</p>
<p>#cd /usr/src<br />
#wget http://mabene.icomedias.com/coretemp.patch<br />
#tar jxvf linux-source-$(uname -r | awk -F&#8217;-&#8217; &#8216;{print $1}&#8217;).tar.bz2<br />
#cd linux-source-$(uname -r | awk -F&#8217;-&#8217; &#8216;{print $1}&#8217;)<br />
#patch -p1 &lt; ../coretemp.patch</p>
<p>Здесь вы получите сообщение о неполном патче файла. Не пугайтесь, все хорошо. Последний кусок патча не применился, т.к. патч для Ubuntu, а в Debian сырец чуточку другой. Доведем патчинг до конца руками:</p>
<p>#nano drivers/hwmon/coretemp.c</p>
<p>Находим почти в конце файла строки:</p>
<p>/* check if family 6, models 0xe, 0xf, 0&#215;16, 0&#215;17 */<br />
if ((c-&gt;cpuid_level &lt; 0) || (c-&gt;x86 != 0&#215;6) ||<br />
!((c-&gt;x86_model == 0xe) || (c-&gt;x86_model == 0xf) ||<br />
(c-&gt;x86_model == 0&#215;16) || (c-&gt;x86_model == 0&#215;17))) {</p>
<p>И заменяем их на:</p>
<p>/* check if family 6, models 0xe, 0xf, 0&#215;16, 0&#215;17, 0&#215;1A, 0&#215;1C */<br />
if ((c-&gt;cpuid_level &lt; 0) || (c-&gt;x86 != 0&#215;6) ||<br />
!((c-&gt;x86_model == 0xe) || (c-&gt;x86_model == 0xf) ||<br />
(c-&gt;x86_model == 0&#215;16) || (c-&gt;x86_model == 0&#215;17) ||<br />
(c-&gt;x86_model == 0&#215;1A) || (c-&gt;x86_model == 0&#215;1C))) {</p>
<p>Суть этой замены в том, что в комментарий и оператор добавляем еще лэйблы двух семейств (одно из них как раз Atom): (c-&gt;x86_model == 0&#215;1A) || (c-&gt;x86_model == 0&#215;1C)</p>
<p>4) Собираем (билдим) модуля ядра</p>
<p>#make -j 4 -C /lib/modules/$(uname -r)/build M=/usr/src/linux-source-$(uname -r | awk -F&#8217;-&#8217; &#8216;{print $1}&#8217;)/drivers/hwmon/ modules</p>
<p>5) Копируем полученный собранный модуль ядра в нужное место:</p>
<p>#cp drivers/hwmon/coretemp.ko /lib/modules/$(uname -r)/kernel/drivers/hwmon/coretemp.ko</p>
<p>7) modprobe coretemp</p>
<p>Если ошибок нет, то все ок.</p>
<p>8) #sensors-detect (всегда отвечаем утвердительно)</p>
<p>9) #sensors (радуемся):</p>
<p>coretemp-isa-0000<br />
Adapter: ISA adapter<br />
Core 0:      +13.0°C  (crit = +95.0°C)</p>
<p>coretemp-isa-0001<br />
Adapter: ISA adapter<br />
Core 1:      +17.0°C  (crit = +95.0°C)</p>
<p>coretemp-isa-0002<br />
Adapter: ISA adapter<br />
Core 2:      +12.0°C  (crit = +95.0°C)</p>
<p>coretemp-isa-0003<br />
Adapter: ISA adapter<br />
Core 3:      +16.0°C  (crit = +95.0°C)</p>
<p>P.S. Если призагрузке модуля ядра coretemp у вас возникала такая ошибка:</p>
<p># modprobe coretemp<br />
insmod /lib/modules/2.6.26-2-686/kernel/drivers/hwmon/coretemp.ko<br />
FATAL: Error inserting coretemp (/lib/modules/2.6.26-2-686/kernel/drivers/hwmon/coretemp.ko): No such device</p>
<p>то описанное выше решение именно для вас.</p>
<p>P.S.S. Спасибо: <a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/296478">https://bugs.launchpad.net/ubuntu/+source/linux/+bug/296478</a>, <a href="http://www.didier-segura.fr/?p=66">http://www.didier-segura.fr/?p=66</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2010.03.14~debian-5-coretemp-intel-atom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Пакетная обработка изображений с помощью ImageMagick</title>
		<link>http://valera.ws/2009.10.19~imagemagick-batch-processing/</link>
		<comments>http://valera.ws/2009.10.19~imagemagick-batch-processing/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 07:19:53 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=358</guid>
		<description><![CDATA[Иногда возникает необходимость пакетной обработки изображений: изменить размеры, цветовые характеристики, наложить водяной знак или копирайт. Для проведения таких операций для Windows существует куча софта, с которым надо разбираться. В Linux-е все намного проще. Достаточно установить* пакеты ImageMagick-а и написать небольшой скрипт.

Моя задача была в том, чтобы проставить копирайты и уменьшить размеры изображений для вставки на [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда возникает необходимость пакетной обработки изображений: изменить размеры, цветовые характеристики, наложить водяной знак или копирайт. Для проведения таких операций для Windows существует куча софта, с которым надо разбираться. В Linux-е все намного проще. Достаточно установить* пакеты ImageMagick-а и написать небольшой скрипт.<br />
<span id="more-358"></span><br />
Моя задача была в том, чтобы проставить копирайты и уменьшить размеры изображений для вставки на сайт. Учесть было необходимо тот факт, что есть изображения горизонтальные и вертикальные. После некоторого времени вспоминания синтаксиса shell-скриптов для bash и чтения очень добротного <a href="http://www.imagemagick.org/script/command-line-tools.php" target="_blank">мануала по ImageMagick Console Tools</a> родился на свет следующий скрипт:</p>
<p><script src="http://pastie.org/660242.js"></script></p>
<p>Пакетная обработка фотографий на Линуксе — это просто!</p>
<p>* — apt-get install imagemagick</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.10.19~imagemagick-batch-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Определение версии браузера</title>
		<link>http://valera.ws/2009.09.16~browser-version-detection/</link>
		<comments>http://valera.ws/2009.09.16~browser-version-detection/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 08:49:27 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[браузеры]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=347</guid>
		<description><![CDATA[Вчера возникла задача определения версии браузера посетителя сайта, чтобы выводить сообщение об устаревшей версии браузера. Гуглинг не дал готового кода. PHP функция get_browser вообще нормально не работает. Пришлось написать PHP-код определения весии браузера самому. Итак, задача из HTTP-заголовка UserAgent получить название и версию браузера пользователя, а затем сравнить версию с некими барьерными версиями (по каждому [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера возникла задача определения версии браузера посетителя сайта, чтобы выводить сообщение об устаревшей версии браузера. Гуглинг не дал готового кода. PHP функция <a href="http://us2.php.net/manual/en/function.get-browser.php" target="_blank">get_browser</a> вообще нормально не работает. Пришлось написать PHP-код определения весии браузера самому.<span id="more-347"></span> Итак, задача из HTTP-заголовка UserAgent получить название и версию браузера пользователя, а затем сравнить версию с некими барьерными версиями (по каждому браузеру). Если браузер старше барьерных версий, будем выводить сообщение об ошибке.</p>
<p>Детектить версии нужно только популярных в СНГ немобильных версий браузеров, поэтому в моем коде определяется только Opera, Firefox, Safari, Internet Explorer и Google Chrome. Если вам потребуется определить версии большего числа браузеров, код можно легко дополнить.</p>
<p>Чтобы не раскидывать функции по проекту, весь код я оформляю в классы. Создадим статический класс, в котором будут два метода: определение версии браузера и сравнение версии с данными барьерными версиями по каждому из браузеров. Назовем его BrowserUtils.</p>
<p><script src="http://pastie.org/618513.js"></script> Класс состоит из двух методов: определение браузера и его версии и сравнении полученной версии с пороговыми версиями по разным браузерам. Использовать класс очень просто:  <script src="http://pastie.org/618518.js"></script></p>
<p>Единственный нюанс по коду есть у Safari. Все версии этого браузера всегда посылали в UserAgent тег Safari/build, где buld — версия их движка. Это большая первая цифра, например 528.16. Так версии Safari отображаются в Google Analytics. Но более поздние версии стали писать свою версию в теге Version. Выглядит это примерно так: Version/4.0.2.</p>
<p>Так как мне требовалось выводить версию пользователю, я использовал код считывания версии из тега Version, а для старых версий не детектит номер версии.</p>
<p><a href="http://valera.ws/files/browser_detection.zip">Скачать</a> PHP-код определения версии браузера.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.09.16~browser-version-detection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка Redmine на Debian с СУБД Postgres. Работа по HTTPS.</title>
		<link>http://valera.ws/2009.04.24~redmine-debian-postgres-https/</link>
		<comments>http://valera.ws/2009.04.24~redmine-debian-postgres-https/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 09:20:51 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=307</guid>
		<description><![CDATA[Стала задача установить хорошую современную систему управления задачами и багтрекинга. Выбор пал на Redmine. Фактически, Remine — это улучшенный Trac. Написан Redmine на Ruby. Основное отличие от Trac по функционалу — работа с несколькими разными проектами в связке. Кроме того, у Redmine намного шире функционал, и сделан он добротней.
Как обычно, для установки некоего нового программного [...]]]></description>
			<content:encoded><![CDATA[<p>Стала задача установить хорошую современную систему управления задачами и багтрекинга. Выбор пал на <a href="http://www.redmine.org/">Redmine</a>. Фактически, Remine — это улучшенный <a href="http://trac.edgewall.org/">Trac</a>. Написан Redmine на Ruby. Основное отличие от Trac по функционалу — работа с несколькими разными проектами в связке. Кроме того, у Redmine намного шире функционал, и сделан он добротней.</p>
<p>Как обычно, для установки некоего нового программного обеспечения в Линуксе сразу идем в Гугл и ищем подходящие HOWTO. По Редмайну я нашел несколько разных HOWTO, из которых каждый понемногу мне помог (см. ссылки внизу).<br />
<span id="more-307"></span></p>
<h2>Установка</h2>
<p><strong>Сначала ставим нужные пакеты.</strong></p>
<p><em># </em><em>apt-</em><em>get </em><em>install </em><em>ruby </em><em>rake </em><em>ruby1.8-</em><em>dev </em><em>rubygems </em><em>libmysql-</em><em>ruby </em><em>librmagick-</em><em>ruby </em><em>ruby-</em><em>pkg-</em><em>tools </em><em>build-</em><em>essential </em><em>postgresql </em><em>libdbd-</em><em>pg-</em><em>perl </em><em>libapache-</em><em>dbi-</em><em>perl </em><em>libapache2-</em><em>mod-</em><em>perl2 </em><em>libdigest-</em><em>sha1-</em><em>perl </em><em>postgresql-</em><em>common </em><em>postgresql-</em><em>contrib-8.3 </em><em>libpgsql-</em><em>ruby1.8 </em><em>libpgsql-</em><em>ruby </em><em>postgresql-</em><em>server-</em><em>dev-8.3 </em><em>libopenssl-</em><em>ruby</em></p>
<p>Вроде ничего не упустил :)</p>
<p><strong>Далее</strong><strong> устанавливаем</strong><strong> ruby gems.</strong></p>
<p><em># gem install rails mongrel mongrel_cluster </em></p>
<p><strong>Добавляем путь к </strong><strong>gems в переменную </strong><strong>PATH</strong>. Для этого редактируем файл <em>/</em><em>etc/</em><em>profile</em>. Добавляем путь в конец  переменной (два раза в файле, перед путем двоеточие). У меня получилось так:</p>
<p><em># head -n 8 /etc/profile<br />
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))<br />
# and Bourne compatible shells (bash(1), ksh(1), ash(1), &#8230;).if [ "`id -u`" -eq 0 ]; then<br />
PATH=&#8221;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/lib/gems/1.8/bin&#8221;<br />
else<br />
PATH=&#8221;/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin&#8221;<br />
fi</p>
<p></em></p>
<p><strong>Подготавливаем базу</strong></p>
<p>Я решил использовать Postgres. С MySQL у меня была как минимум одна проблема: с кодировкой. Неправильно работали длины полей для русских текстов в UTF-8.</p>
<p>Из-под рута:</p>
<p><em># su postgres</em></p>
<p><em>#createuser redmine &#8211;no-superuser &#8211;no-createdb &#8211;no-createrole &#8211;login &#8211;pwprompt –encrypted</em></p>
<p><em>#createdb &#8211;owner=redmine &#8211;encoding=utf-8 redmine</em></p>
<p><em>#</em><em>exit</em></p>
<p>Пароль для пользователя введен redmine.</p>
<p><strong>Скачиваем </strong><strong>Redmine</strong></p>
<p>На момент написания записи самый свежий стабильный релиз был 0.8.</p>
<p><em># mkdir /var/www/rails_apps</em></p>
<p><em># cd /var/www/rails_apps</em></p>
<p><em># svn co http://redmine.rubyforge.org/svn/branches/0.8-stable redmine-0.8</em></p>
<p>Все команды далее выполняются из каталога  <em>/</em><em>var/</em><em>www/</em><em>rails_</em><em>apps/</em><em>redmine-0.8</em>.</p>
<p><em># </em><em>cd /</em><em>var/</em><em>www/</em><em>rails_</em><em>apps/</em><em>redmine-0.8</em></p>
<p><strong>Конфигурируем доступ к базе</strong></p>
<p>Создаем файл config/database.yml со следующим содержимым:</p>
<p><em>production:<br />
adapter: postgresql<br />
database: redmine<br />
host: localhost<br />
username: redmine<br />
password: redmine</em></p>
<p><strong>Конфигурируем</strong><strong> SMTP</strong></p>
<p><em># cp config/email.yml.example config/email.yml</em></p>
<p><em># vim config/email.yml</em></p>
<p>Внесите изменения в соответствии с настройками вашего SMTP-сервера.</p>
<p><strong>Заполняем базу данных</strong></p>
<p><em># rake db:migrate RAILS_ENV=&#8221;production&#8221;</em></p>
<p><em># rake redmine:load_default_data RAILS_ENV=&#8221;production&#8221;</em></p>
<p><strong>Проверим, что все поставилось хорошо:</strong></p>
<p><em># mongrel_rails start &#8211;environment=production</em></p>
<p>Redmine должен работать по адресу <a href="http://localhost:3000/">http://localhost:3000</a>. Для авторизации используйте логин и пароль admin. Не забудьте его позже своевременно изменить.</p>
<p><strong>Настройка</strong><strong> Redmine на</strong><strong> работу</strong><strong> через</strong><strong> apache and mongrel_cluster по</strong><strong> HTTPS</strong></p>
<p>Создайте файл <em>config/</em><em>mongrel_</em><em>cluster.</em><em>yml</em> следующего содержания:</p>
<p><em>group: www-data<br />
log_file: log/mongrel.log<br />
port: &#8220;9000&#8243;<br />
cwd: /var/www/rails_apps/redmine-0.8<br />
environment: production<br />
user: www-data<br />
pid_file: log/mongrel.pid<br />
servers: 2</em></p>
<p>Проверьте, что все ОК:</p>
<p><em># mongrel_rails cluster::start</em></p>
<p>Теперь вы должны получить доступ к Redmine на портах 9000 и 9001.</p>
<p>Для того, чтобы кластер поднимался после ребута, выполняем:</p>
<p><em># mkdir /etc/mongrel_cluster</em></p>
<p><em># ln -s /var/www/rails_apps/redmine-0.8/config/mongrel_cluster.yml /etc/mongrel_cluster/redmine.yml</em></p>
<p><em># cp /var/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d</em></p>
<p><em># chmod +x /etc/init.d/mongrel_cluster</em></p>
<p><em># /usr/sbin/update-rc.d -f mongrel_cluster defaults</em></p>
<p><strong>Настраиваем </strong><strong>apache2</strong></p>
<p><em># a2enmod proxy</em></p>
<p><em># a2enmod proxy_http</em></p>
<p><em># a2enmod proxy_balancer</em></p>
<p><em># a2enmod rewrite</em></p>
<p><em># a2enmod headers</em></p>
<p>Создайте файл <em>/</em><em>etc/</em><em>apache2/</em><em>sites-</em><em>available/</em><em>redmine</em> со следующим содержимым:</p>
<p>NameVirtualHost *:443<br />
&lt;VirtualHost *:443&gt;<br />
ServerAdmin xxx@xxx.xx<br />
ServerName redmine # <strong>Измените</strong> <strong>имя сервера, чтобы виртуальный хост подхватился</strong>!<br />
DocumentRoot /var/www/rails_apps/redmine-0.8/public/<br />
RequestHeader set X_FORWARDED_PROTO &#8216;https&#8217;</p>
<p>&lt;Directory /var/www/rails_apps/redmine-0.8/public/&gt;<br />
Options FollowSymLinks<br />
AllowOverride None<br />
Order allow,deny<br />
Allow from all<br />
&lt;/Directory&gt;</p>
<p>SSLEngine on<br />
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA;+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
SSLCertificateFile /var/www/conf/mobicon.crt<br />
SSLCertificateKeyFile /var/www/conf/mobicon.key<br />
&lt;Location /&gt;<br />
AuthType Basic<br />
AuthName &#8220;Mobicon-Media&#8221;<br />
AuthBasicProvider ldap<br />
<strong> </strong>AuthLDAPUrl ldap://localhost/ou=people,dc=mobicon-media,dc=com?cn<br />
Require ldap-group cn=mobicon,ou=groups,dc=mobicon-media,dc=com<br />
SSLRequireSSL<br />
&lt;/Location&gt;</p>
<p>ProxyPass /images !<br />
ProxyPass /stylesheets !<br />
ProxyPass /javascripts !<br />
ProxyPass /favicon.ico !<br />
ProxyPass /static !<br />
ProxyPass /holding !<br />
ProxyPass /templates !<br />
ProxyPass / balancer://redmine_cluster<br />
ProxyPreserveHost On</p>
<p>&lt;Proxy balancer://redmine_cluster&gt;<br />
BalancerMember <a href="http://127.0.0.1:9000/">http://127.0.0.1:9000</a><br />
BalancerMember <a href="http://127.0.0.1:9001/">http://127.0.0.1:9001</a><br />
Order allow,deny<br />
Allow from all<br />
&lt;/Proxy&gt;</p>
<p>RewriteEngine On<br />
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f<br />
RewriteRule ^/(.*)$ balancer://redmine2_cluster%{REQUEST_URI} [P,QSA,L]</p>
<p>ErrorLog /var/log/apache2/redmine.error.log<br />
LogLevel warn<br />
CustomLog /var/log/apache2/redmine.access.log combined<br />
ServerSignature On<br />
AddDefaultCharset Off<br />
&lt;/VirtualHost&gt;</p>
<p>Затем выполните:</p>
<p><em># ln -s /etc/apache2/sites-available/redmine /etc/apache2/sites-enabled/redmine</em></p>
<p><em># /</em><em>etc/</em><em>init.</em><em>d/</em><em>apache2 </em><em>restart</em></p>
<p><strong>Все настроено и готово к использованию!</strong></p>
<h2>Ссылки</h2>
<p><a href="http://blog.josefsson.org/2008/10/17/redmine-on-debian-lenny-using-lighttpd/">http://blog.josefsson.org/2008/10/17/redmine-on-debian-lenny-using-lighttpd/</a></p>
<p><a href="http://www.drinkingbird.net/blog/articles/2008/02/27/setting-up-a-redmine-site-on-ubuntu">http://www.drinkingbird.net/blog/articles/2008/02/27/setting-up-a-redmine-site-on-ubuntu</a></p>
<p><a href="http://www.redmine.org/wiki/redmine/RedmineInstall">http://www.redmine.org/wiki/redmine/RedmineInstall</a></p>
<p><a href="http://ubuntuforums.org/showthread.php?t=674598&amp;highlight=redmine">http://ubuntuforums.org/showthread.php?t=674598&amp;highlight=redmine</a></p>
<p><a href="http://www.drinkingbird.net/blog/articles/tag/redmine">http://www.drinkingbird.net/blog/articles/tag/redmine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.24~redmine-debian-postgres-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Установка Tomcat 5.5 в Debian Lenny</title>
		<link>http://valera.ws/2009.04.22~install-tomcat-debian-lenny/</link>
		<comments>http://valera.ws/2009.04.22~install-tomcat-debian-lenny/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 18:36:42 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=304</guid>
		<description><![CDATA[Все проще простого. Сервер есть в виде пакета в репозиториях Debian, так что необходимо просто установить нужные пакеты и произвести минимальные настройки.

Apache Tomcat — это веб-контейнер (сервер приложений, application server), разработанный в Apache Software Foundation (ASF). Tomcat реализует спецификации от Sun Microsystems сервлетов и JavaServer Pages (JSP), обеспечивая окружение для Java кода и его выполнения [...]]]></description>
			<content:encoded><![CDATA[<p>Все проще простого. Сервер есть в виде <a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=6&amp;url=http%3A%2F%2Fpackages.debian.org%2Fstable%2Fweb%2Ftomcat5.5&amp;ei=A23vSfrPL8eQ_QaLhJ3pDg&amp;usg=AFQjCNFU63lPyXfXwqCxhdMvt9fSzwX89w&amp;sig2=MRt-ouIKPwaH0aufEhNXKg" target="_blank">пакета</a> в репозиториях Debian, так что необходимо просто установить нужные пакеты и произвести минимальные настройки.</p>
<p><span id="more-304"></span></p>
<p>Apache Tomcat — это веб-контейнер (сервер приложений, application server), разработанный в Apache Software Foundation (ASF). Tomcat реализует спецификации от Sun Microsystems сервлетов и JavaServer Pages (JSP), обеспечивая окружение для Java кода и его выполнения веб-сервером. Для Tomcat существуют инструменты конфигурирования, однако конфигурировать его можно и вручную черех XML-файлы. Tomcat включает собственный HTTP-сервер.</p>
<p>Для начала на компьютере должен быть установлен пакет JDK 5. Если его нет, установите из репозиториев Debian&#8217;а:</p>
<p><em>#apt-get update</em></p>
<p><em>#apt-get install sun-java5-jdk</em></p>
<p>Убедитесь, что JDK уставновился:</p>
<p><em>#java -version</em></p>
<p>Вывод выглядит примерно так:</p>
<p>java version “1.5.0_17″<br />
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)<br />
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)</p>
<p><strong>Установка Apache Tomcat</strong></p>
<p>Выполните команду</p>
<p><em>#apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps </em></p>
<p><em></em>Веб-сервер установлен и запущен. Убедиться в этом можно, перейдя в браузере по адресу <em>http://localhost:8180/</em>.</p>
<p>Заускается и останавливается сервер Tomcat так:</p>
<p><em>#/etc/init.d/tomcat5.5 [start | stop | restart]</em></p>
<p><strong>Конфигурация приложений ‘admin’ и ‘manager’</strong></p>
<p>Необходимо настроить вашему пользователю роли admin and manager. Например, это можно сделать с пользователем ‘tomcat’. Остановите сервер и отредактируйте файл <em>/var/lib/tomcat5.5/conf/tomcat-users.xml</em>. Он должен выглядеть примерно так:</p>
<p>&lt;?xml version=&#8217;1.0&#8242; encoding=&#8217;utf-8&#8242;?&gt;<br />
&lt;tomcat-users&gt;<br />
&lt;role rolename=&#8221;admin&#8221;/&gt;<br />
&lt;role rolename=&#8221;manager&#8221;/&gt;<br />
&lt;role rolename=&#8221;tomcat&#8221;/&gt;<br />
&lt;user username=&#8221;tomcat&#8221;<br />
password=”tomcatpassword”<br />
roles=&#8221;tomcat,admin,manager&#8221;/&gt;<br />
&lt;/tomcat-users&gt;</p>
<p>Запустите сервер.</p>
<p>Теперь вы можете открыть приложение manager по адресу <em>http://localhost:8180/manager/html</em>, а приложение admin — <em>http://localhost:8180/admin/</em>. Авторизуйтесь в сервисах под юзером ‘tomcat’ с паролем ‘tomcatpassword’.</p>
<p>Перевод <a href="http://www.debianadmin.com/how-to-setup-apache-tomcat-55-on-debian-etch.html" target="_blank">источника</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.22~install-tomcat-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1680&#215;1050 на базе Intel 945 в Debian</title>
		<link>http://valera.ws/2009.04.18~1680x1050-intel-945-debian/</link>
		<comments>http://valera.ws/2009.04.18~1680x1050-intel-945-debian/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 14:54:43 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=301</guid>
		<description><![CDATA[Есть ноутбук со свтроенной графикой на базе чипсета Intel 945 (HP Compac nx7300). Есть Debian Linux 5.0 на этом ноутбуке. Есть внешний 20-дюймовый монитор Philips 200WP, родное разрешение которого 1680&#215;1050. Задача: подключить монитор Philips к ноутбуку в качестве внешнего монитора (вместо встроенного дисплея). Сходу, втыкнув VGA-кабель от монитора в ноут, решить задачу в Линуксе не [...]]]></description>
			<content:encoded><![CDATA[<p>Есть ноутбук со свтроенной графикой на базе чипсета Intel 945 (HP Compac nx7300). Есть Debian Linux 5.0 на этом ноутбуке. Есть внешний 20-дюймовый монитор Philips 200WP, родное разрешение которого 1680&#215;1050. Задача: подключить монитор Philips к ноутбуку в качестве внешнего монитора (вместо встроенного дисплея). Сходу, втыкнув VGA-кабель от монитора в ноут, решить задачу в Линуксе не удалось (в Windows все сразу хорошо заработало). Картинка была как-бы размазана по горизонтали, то есть неправильно были выставлены частоты.<br />
<span id="more-301"></span></p>
<p>В поисках решения начал мучать Гугл. Большого количества материалов не было, но несколько тем, касающихся чипсета Интела, разрешения 1680&#215;1050 и Убунту было. В большинстве материалов упоминалось решение с использованием софтины 915resolution. Но практически сразу выяснилось, что она устарела и в последних версиях Debian и Ubuntu ее нет смысла использовать вовсе.</p>
<p>В продолжении изысканий по теме я познакомился с программой xrandr (раньше работал с ее визуальным гномовским заменителем Параметры-&gt;Разрешение экрана), которая кстати умеет много чего хорошего. Именно с помощью нее настраиваются в том числе виртуальные мониторы (когда два монитора показывают разную картинку). Но нужды в этом мне не было, она использовалась только для установки режима после подключения внешнего монитора. (Режим — это сочетание разрешения, частот и еще каких-то там циферок.)</p>
<p>Далее нашел упоминание еще одной замечательной софтины — gtf. Она очень нужна для того, чтобы определить правильные параметры режима моего внешнего монитора.</p>
<p>Так же познакомился таки с системой видеовыходов в ОС. Как то раньше разбираться с этим не приходилось. А вот по мере изучения Линуксов все больше и больше приходится вдаваться в такие тонкости :) Ну да ладно. Если выполнить в консоли команду xrandr, то она покажет вам в ответ ваши текущие видеовыходы и подключенные на них мониторы. Вывод будет примерно такой:</p>
<p><em>feedbee@debian:~$ xrandr</em><br />
Screen 0: minimum 320 x 200, current 1680 x 1050, maximum 2048 x 2048<br />
VGA connected 1680&#215;1050+0+0 (normal left inverted right x axis y axis) 433mm x 271mm<br />
1280&#215;800       60.0 +<br />
1680&#215;1050x74.9   74.9*<br />
[...]<br />
LVDS connected 1280&#215;800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm<br />
1280&#215;800       60.0 +   60.0*<br />
[...]<br />
TV disconnected (normal left inverted right x axis y axis)</p>
<p>Такой вывод говорит, что у меня в системе один «экран» (Screen 0). Показаны его разрешения (текущее и экстремумы). Разрешения имеют значения, если мы раздвигаем мониторы (то есть делаем на каждый разную картинку; тогда они оба должны помещаться в экран). Так же показано, что у меня есть 3 видеовыхода: VGA, LVDS, TV. По  VGA подключен внешний монитор, LVDS — это встроенный дисплей ноутбука. TV-выход не подключен. Звездочка напротив режима обозначает, что он активный.</p>
<p>Чтобы заставить мой внешний монитор показывать нормальную картинку, надо было выяснить его нормальный рабочий режим, добавить этот режим в список и активировать, когда я подключаю внешний монитор (последнее можно делать не выключая ноутбука и без перезагрузки).</p>
<p>Чтобы определить нужный режим и активировать его, надо сделать следующее:</p>
<p style="margin-bottom: 0cm">1)Выключить ноут.</p>
<p style="margin-bottom: 0cm">2)Подключить внешний монитор.</p>
<p style="margin-bottom: 0cm">3)Включить ноут и сразу зукройте его (или переключитесь на внешний монитор Fn+F4), т.е. работать сейчас вы будите через внешний монитор с неродным разрешением.</p>
<p style="margin-bottom: 0cm">4)Выполнить <em>~$ gtf 1680 1050 60</em><br />
Я получил от команды такой вывод:<br />
<em>~$ gtf 1680 1050 60</em><br />
# 1680&#215;1050 @ 60.00 Hz (GTF) hsync: 65.22 kHz; pclk: 147.14 MHz<br />
Modeline &#8220;1680&#215;1050_60.00&#8243;  147.14  1680 1784 1968 2256  1050 1051 1054 1087  -HSync +Vsync<br />
Это и есть рассчитанные параметры режима для моего внешнего монитора.</p>
<p style="margin-bottom: 0cm">5)Полученную строку добавить в /etc/X11/xorg.conf в Section &#8220;Monitor&#8221;. Получится так:<br />
Section &#8220;Monitor&#8221;<br />
Identifier	&#8220;Универсальный монитор&#8221;<br />
Option		&#8220;DPMS&#8221;<br />
Modeline &#8220;1680&#215;1050x74.9&#8243;  187.00  1680 1800 1976 2272  1050 1053 1059 1099 -hsync +vsync<br />
EndSection</p>
<p style="margin-bottom: 0cm">6)Перезапустить X-сервер (Ctrl+Backspace).<br />
После этого остается только переключить нужный режим на нужный видеовыход. Это делается командой:</p>
<p><em>~$ </em><em>xrandr &#8211;output VGA &#8211;mode 1680&#215;1050x74.9</em></p>
<p>Ее удобно добавить в скрипт, который потом просто запускать после подключения внешнего монитора.</p>
<p>Чтобы сбросить режим на нормальный для ноутбучного дисплея, просто выполните:</p>
<p><em>~$ xrandr &#8211;auto</em></p>
<p>P.S. Выход был найден благодаря <a href="http://forums.debian.net/viewtopic.php?p=210202&amp;sid=18c11b5eb193a4399ca4cbbfd206e4a4" target="_blank">http://forums.debian.net/viewtopic.php?p=210202&amp;sid=18c11b5eb193a4399ca4cbbfd206e4a4</a></p>
<p>Так же полезной оказалась страничка <a href="https://answers.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+question/26807 " target="_blank">https://answers.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+question/26807 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.18~1680x1050-intel-945-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google отсудил домен google.by</title>
		<link>http://valera.ws/2009.02.18~googleby/</link>
		<comments>http://valera.ws/2009.02.18~googleby/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 12:59:19 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[байнет]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=298</guid>
		<description><![CDATA[С недавнего времени белорусская версия Гугла доступна на домене второго уровня google.by.
Долгое время белорусская версия была доступна по адресу google.com.by из-за того, что домен google.by был занят. Если точнее, то он был выкуплен Денисом Кораблевым из компании activemedia.by (я так и не понял, какую должность он там занимает — руководитель компании?). В это время на [...]]]></description>
			<content:encoded><![CDATA[<p>С недавнего времени белорусская версия Гугла доступна на домене второго уровня <a href="http://google.by/">google.by</a>.</p>
<p>Долгое время белорусская версия была доступна по адресу <a href="http://google.com.by/">google.com.by</a> из-за того, что домен google.by был занят. Если точнее, то он был выкуплен Денисом Кораблевым из компании activemedia.by (я так и не понял, какую должность он там занимает — руководитель компании?). В это время на сайте крутился поисковый интерфейс Гугла, который вел на сам google.com, продавалась контекстная реклама и ссылки с главной страницы. Правда в сентябре 2008 <a href="http://habrahabr.ru/blogs/bynet/39819/">сайт закрылся</a>.</p>
<p><span id="more-298"></span>Вчера новостному проекту <a href="http://electroname.com/story/1792">electroname.com</a> и сайту <a href="http://netnews.by/2009/02/17/k-novosti-googleby-stal-oficialno-google-belarus/">netnews.by</a> представитель Гугла Дмитрий Шоломко прокомментировал ситуацию и сообщил, что еще в декабре домен google.by отсужен у activemedia.by в Верховном Суде Республики Беларусь. Так же он сообщил: &#8220;Сейчас ведутся подготовительные работы к запуску сервисов Google на этом домене, и через некоторое время он будет функционировать в обычном режиме сайта Google&#8221;. Эту информацию electroname.com также подтвердила Алла Забровская, директор по связям с общественностью Google Russia.</p>
<p>Кстати, мне не известны случаи до этого, когда домен в зоне .by был кем-то у кого-то отсужен. Не известны даже случаи подачи таких исков. Так что, вероятно, ситуацию с google.by можно считать хорошим прецедентом в BY-нете. Правда есть одно &#8220;но&#8221;. По словам Дмитрия Шоломко, они обратились в суд с иском о нарушении прав на товарный знак и фирменное наименование, т.к. google.by в свое время копировал сайт google.com. Т.е. объектом иска выступал все же не сам домен непосредственно, а факт копирования интерфейса.</p>
<p>Жаль только, что этот процесс достойно не освещался в СМИ, так, как это происходит на западе и даже в России. Все прошло очень тихо.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.02.18~googleby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian Lenny, wifi и Broadcom</title>
		<link>http://valera.ws/2009.02.15~debian-lenny-wifi-i-broadcom/</link>
		<comments>http://valera.ws/2009.02.15~debian-lenny-wifi-i-broadcom/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 21:14:21 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=293</guid>
		<description><![CDATA[В своей недавней записи я рассказал как настроить работу Wi-fi на базе карточки от Broadcom в Debian Linux Etch. Сегодня вышла новая версия Debian — 5.0 Lenny, в которой обвновлена версия ядра Linux сразу до версии 2.6.26 (с 2.6.18). В связи с этим перестал работать старый Бродкомовский драйвер, и потребовалась установка нового.  Благо, что [...]]]></description>
			<content:encoded><![CDATA[<p>В своей <a href="http://valera.ws/2008.11.24~nastrojka-wi-fi-debian/" target="_blank">недавней записи</a> я рассказал как настроить работу Wi-fi на базе карточки от Broadcom в Debian Linux Etch. Сегодня вышла новая версия Debian — 5.0 Lenny, в которой обвновлена версия ядра Linux сразу до версии 2.6.26 (с 2.6.18). В связи с этим перестал работать старый Бродкомовский драйвер, и потребовалась установка нового. <span id="more-293"></span> Благо, что установить новый драйвер очень просто, так как мы имеем свежее ядро Linux, под которое есть нормальные Бродкомовские дрова. Всю необходимую информацию о драйверах и установке можно получить на сайте <a href="http://linuxwireless.org/en/users/Drivers/b43" target="_blank">http://linuxwireless.org/en/users/Drivers/b43</a>.</p>
<p>В прошлый раз я писал, что у меня ноутбук HP Compaq nx7300 с сетевой Broadcom BCM4311 802.11b/g WLAN (rev 01). Эта карточка числится в списке поддерживаемых драйвером bc43 при условии свежести ядра (2.6.24 или старше). Чтобы проверить, какая карта у вас, выполните команды:</p>
<p>update-pciids<br />
lspci -nn</p>
<p>В выводе последней команды в конце у меня есть следующая строка:<br />
10:00.0 Network controller [0280]: Broadcom Cor poration BCM4311 802.11b/g WLAN [14e4:4311] (rev 01)</p>
<p>Это и ест ь мой сетевой адаптер  Broadcom  BCM4311.</p>
<p>Поддерживаются карты:</p>
<ul>
<li>bcm4303 (802.11b-only chips, uses b43legacy)</li>
<li>bcm4306 (Rev. 2 uses b43legacy, Rev. 3 uses b43)</li>
<li>bcm4309 (only the 2.4GHz part)</li>
<li>bcm4311 rev 1 / bcm4312</li>
<li>bcm4311 rev 2 / bcm4312 (needs patches for 2.6.24)</li>
<li>bcm4312 (only the 2.4GHz part)</li>
<li>bcm4318</li>
</ul>
<p>Для карты BCM4306 Rev 2 или для работы с лишь 802.11b режимом используется дрвйвер b43legacy. Во всех других случаях используется b43. Об установке b43 и поговорим :)</p>
<p>Для ядер 2.6.25 и выше надо выполнить лишь 2 следующие пачки команд, и все:</p>
<p>wget http://bu3sch.de/b43/fwcutter/b43-fwcutter-011.tar.bz2<br />
tar xjf b43-fwcutter-011.tar.bz2<br />
cd b43-fwcutter-011<br />
make<br />
cd ..</p>
<p>export FIRMWARE_INSTALL_DIR=&#8221;/lib/firmware&#8221;<br />
wget http://mirror2.openwrt.org/sources/broadcom-wl-4.150.10.5.tar.bz2<br />
tar xjf broadcom-wl-4.150.10.5.tar.bz2<br />
cd broadcom-wl-4.150.10.5/driver<br />
sudo ../../b43-fwcutter-011/b43-fwcutter -w &#8220;$FIRMWARE_INSTALL_DIR&#8221; wl_apsta_mimo.o</p>
<p>Тем самым мы скачали и собрали b43-fwcutter, которому затем подсунули скачанный драйвер. Он его &#8220;вставил&#8221; в систему. Все, сетевая работает.</p>
<p>Про настройку сетевой читайте в <a href="http://valera.ws/2008.11.24~nastrojka-wi-fi-debian/" target="_self">старом посте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.02.15~debian-lenny-wifi-i-broadcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Фокусы с nginx</title>
		<link>http://valera.ws/2009.01.26~nginx-magic/</link>
		<comments>http://valera.ws/2009.01.26~nginx-magic/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 14:23:05 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=276</guid>
		<description><![CDATA[Вчерашний вечер я посвятил возне с http-сервером nginx в качестве фронтэнда к apache. Как известно, nginx — легковесный надежный HTTP-сервер, написанный Игорем Сысоевым (сотрудником Rambler). Он отлично подходит для выдачи статических страниц, особенно под нагрузкой. Обычно настраивается связка nginx+apache, в которой nginx  обслуживает все входящие на сервер запросы, статические файлы отдает своими силами, а [...]]]></description>
			<content:encoded><![CDATA[<p>Вчерашний вечер я посвятил возне с http-сервером nginx в качестве фронтэнда к apache. Как известно, <a href="http://nginx.net/" target="_blank">nginx</a> — легковесный надежный HTTP-сервер, написанный <a href="http://sysoev.ru" target="_blank">Игорем Сысоевым</a> (сотрудником <a href="http://rambler.ru" target="_blank">Rambler</a>). Он отлично подходит для выдачи статических страниц, особенно под нагрузкой. Обычно настраивается связка nginx+apache, в которой nginx  обслуживает все входящие на сервер запросы, статические файлы отдает своими силами, а запросы на динамическое содержимое проксирует на apache.</p>
<p>Так вот, по настройке работы данной пары в связке в Интернете есть море статей, в том числе на русском, и об этом писать смысла нет. А расскажу я вам лучше о тех нюансах, с которыми вчера столкнулся при настройке nginx на работу в нужном ладе, и заодно покажу и прокомментирую свою конфигурацию этого сервера.</p>
<p><span id="more-276"></span></p>
<h2>Моя конфигурация</h2>
<p>Для начала, что собственно требовалось сделать? Сервер настраивался для <a href="http://habrometr.ru" target="_blank">Хаброметра</a>. Он должен был выдавать статику (лого и css) и динамику (собственно страницы сайта и png-хаброметры). При этом, надо было учесть, что хаброметр создается на лету в том случае, если не лежит в кэше (а кэш чистится каждые 2 часа при запросе новых данных). Страницы сайта также необходимо кэшировать. Вот такая была задача.</p>
<p>Реализацию решено было сделать следующим образом. nginx при обработке запроса должен следовать следующим правилам:</p>
<ol>
<li>Если  запрошена статика, то просто вернуть ее (вся статика в папочке stuff).</li>
<li>Если запрошена страница сайта, нужно проверить кэш; если в кэше файл не найден, передать запрос бэкэнду apache. Кэш страниц должен чиститься с заданной частотой (для разных страниц частота разная).</li>
<li>Если запрошен информер, то нужно проверить кэш на наличие файла. Если файла там нет, передать  запрос бэкэнду.</li>
</ol>
<p>Для кэширования хаброметров выбрана файловая система. Все сгенерированные информеры складываются в каталог /image_cache/ и он чистится каждые 2 часа при обновлении исходных данных. Рисуются информеры и кладутся в этот каталог PHP-скриптом при  соответствующем запросе.</p>
<p>Для кэширования  страниц сайта выбран memcache, т.к. с ним легко и удобно работать (как из nginx, так и из PHP) и он сам может чистить кэшированные странички через заданный интервал времени, что ФС делать не может без дополнительных скриптов. Да и работать memcache будет побыстрее, т.к. все добро складируется в оперативке.</p>
<p>Получилась следующая конфигурация сервера:</p>
<p># cat /etc/nginx/nginx.conf</p>
<pre>user www-data;
worker_processes 2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;</pre>
<pre>events {
    worker_connections  2048;
}</pre>
<pre>http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  65;
    tcp_nodelay        on;
    gzip  on;
    add_header Habrometr "hacker_mode_enabled;)";</pre>
<pre>    server {
        listen       80;
        server_name  habrometr.server.valera.ws habrometr.ru www.habrometr.ru;
        access_log  /var/log/nginx/habrometr.access.log;
<pre>        location / {
            root   /home/habrometr/public_html;
            index  index.html index.htm;
            if (-f $document_root/image_cache${uri}) {
                rewrite ^.*$ /image_cache/$uri last;
                break;
            }

            set $memcached_key "habrometr$uri";
            memcached_pass localhost:11211;
            # если в memcached не найден ресурс, передаем запрос на апач
            error_page 404 502 504 = @backend;
            add_header Content-Type "text/html; charset=UTF-8";
            gzip on;
            gzip_proxied any;
            gzip_types application/octet-stream;
    }</pre>
</pre>
<pre>    location @backend {
        set $proxy_uri http://habrometr.ru:99999$request_uri;
        proxy_pass $proxy_uri;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X_Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 20;
    }</pre>
<pre>    location /image_cache/ {
        root   /home/habrometr/public_html;
        expires modified +2h; # кэш истекает через 2 часа после модификации файла
    }</pre>
<pre>    location /stuff/ {
        root   /home/habrometr/public_html;
        expires 30d;
    }</pre>
<pre>    location ~ /\.ht {
        deny  all;
    }</pre>
<pre>}</pre>
<p>Учитывая приведенный выше сценарий, вся конфигурация должна быть понятна. Замечу лишь, что http://habrometr.ru:99999 — это apache, которому будут перенаправляться запросы. Порт я, конечно, изменил, в реальности обычно используют 8080 или что-то типо того.</p>
<h2>Фокусы</h2>
<p>А теперь о том, что нетривиального в этой конфигурации (во всяком случае для новичка в этой области).</p>
<h3>Версия</h3>
<p>Во-первых, сервер у меня работает на Debian 4.0. Весь софт я естественно ставил из  стандартных репозиториев. Поставил оттуда и nginx. Установленный nginx оказался версии 0.4 при наличии последней версии 0.7 со значительным <a href="http://sysoev.ru/nginx/changes.html" target="_blank">списком изменений</a>.</p>
<p>Выяснилось, что версия 0.4 не умеет делать много из того, что было нужно. В частности:</p>
<ol>
<li>флаг modified не сузествует для директивы expire, а мне это необходимо было для указания времени устаревания кэша информеров (2 часа после создания: expire modified +2h);</li>
<li>proxy_pass не умел использовать переменные, а мне требовалась эта возможность;</li>
<li>memcached не использовал переменную $memcached_key для определения ключа, т.е. нельзя было задать ключ нужного формата.</li>
</ol>
<p>В принципе, все эти проблемы можно было решить обходными извращенскими путями, но делать этого совсем не хотелось, по этому я просто поставил свежую версию nginx из сырцов. Благо, делается это очень просто.</p>
<p>Перед тем, как описать процесс установки, замечу, что по умолчанию при сборке из исходников все файлы nginx складывает в каталог /usr/local/nginx. Его, конечно, можно изменить (&#8211;prefix=). Но обратите внимание, что установленных из пакетов nginx раскидывает свои файлы по соответствующим каталогам системы (/etc, /var/log, /var/run и т.д.), что лично мне определенно нравится больше, чем /usr/local/nginx/*. По этому я откомпилировал nginx из сырцов с  настройками на системные каталоги, а потом вместо make install просто вручную заменил старый бинарный файл сервера в каталоге /usr/sbin на новый (/usr/sbin/nginx). Больше значимых файлов после сборки для сервера нет. Конфиг, естественно, остается тот же самый.</p>
<p>Итак, установка nginx на Debian etch из исходников поверх установленного пакета старой версии.</p>
<pre># wget http://sysoev.ru/nginx/nginx-0.7.31.tar.gz
# tar xzf nginx-0.7.31.tar.gz
# cd nginx-0.7.31
# apt-get install libpcre3 libpcre3-dev libpcrecpp0
# /etc/init.d/nginx stop;
# ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module
--without-mail_pop3_module --without-mail_imap_module
--without-mail_smtp_module --prefix=/var/lib/nginx
--sbin-path=/usr/sbin --conf-path=/etc/nginx/
--error-log-path=/var/log/nginx --http-log-path=/var/log/nginx
--pid-path=/var/run --lock-path=/var/lock
# make
# cd objs
# cp -f ./nginx /usr/sbin
# /etc/init.d/nginx start;</pre>
<p>После этого уже должен быть запущен и обслуживать запросы свежий сервер nginx, который умеет все нужные нам штуки.</p>
<h3>Документы из memcached</h3>
<p>Когда nginx отдает напрямую файлы, он передает заголовок Content-type в соответствии с типом данного файла. Когда nginx проксирует apache, Content-type приходит от apache. Но когда nginx забирает документа из memcached, то Content-type не устанавливается. А значит, используется дефалтный. А дефалтный у нас по конфигу   default_type  application/octet-stream;, и это правильно. В этом случае при отдаче документа из кэша будет неправильно передаваться тип и некоторые браузеры предложат сохранить бинарный файл, вместо того чтобы открыть HTML-страницу. Чтобы ситуацию исправить, в случае отдачи из memcached устанавливаем заголовки (и, кстати, сжатие тоже) дополнительно:</p>
<pre>set $memcached_key "habrometr$uri";
memcached_pass localhost:11211;
error_page 404 502 504 = @backend;
add_header Content-Type "text/html; charset=UTF-8";
gzip on;
gzip_proxied any;
gzip_types application/octet-stream;</pre>
<p>При этом из memcached мы получаем только HTML в UTF-8.</p>
<h3>Мухи отдельно, котлеты отдельно.</h3>
<p>В  качестве отдельной магии хотелось бы выделить сам способ выделения хаброметров по имени файла и обслуживания их по-особому. В секции location / выделяем эти файлы:</p>
<pre>if (-f $document_root/image_cache${uri}) {
    rewrite ^.*$ /image_cache/$uri last;
    break;
}</pre>
<p>Если файл находим в кэше, то просто возвращаем его пользователю, сообщая что файл можно закешировать до времени следующего обновления (модификация файла + 2 часа):</p>
<pre>location /image_cache/ {
    root   /home/habrometr/public_html;
    expires modified +2h;
}</pre>
<p>Обратите внимание на наличие флага last у rewrite и директивы break; за ней. Без использования этих двух директив мне не удалось заставить nginx 0.4 (на 0.7 я не проверял) сразу перейти в секцию location /image_cache/, т.е. после обнаружения файла он переходил к проскированию, что неверно.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.01.26~nginx-magic/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Хабро́метр — новый сервис логирования и отображения значений кармы и хабросилы</title>
		<link>http://valera.ws/2009.01.14~habrometr/</link>
		<comments>http://valera.ws/2009.01.14~habrometr/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 14:38:59 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[рейтинг]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=269</guid>
		<description><![CDATA[Хаброметр — сервис логирования значений кармы, хабрасилы и позиции в рейтинге хабрапользователя и отображения этой информации на информерах, которые можно вставить в профиль, блог, форум и т.д.
 


Для этих целей уже давно был написан Кармаграф от Goodrone . Но развитие его сейчас заморожено, а сам движок сломался и значения счетчиков не обновляется с прошлого года [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://habrometr.server.valera.ws/">Хаброметр</a> — сервис логирования значений кармы, хабрасилы и позиции в рейтинге хабрапользователя и отображения этой информации на информерах, которые можно вставить в профиль, блог, форум и т.д.</p>
<p><a href="http://habrometr.server.valera.ws/?action=user_page&amp;user=feedbee"><img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_425x120.php" alt="Хаброметр feedbee" /></a> <img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_88x120.php" alt="Хаброметр feedbee" /></p>
<p><img title="Хаброметр feedbee" src="http://habrometr.server.valera.ws/habrometr_88x15.php" alt="Хаброметр feedbee" /></p>
<p><span id="more-269"></span></p>
<p>Для этих целей уже давно был написан <a href="http://habrahabr.ru/blogs/ilhh/10994/">Кармаграф</a> от <a class="user_link" href="http://goodrone.habrahabr.ru/">Goodrone</a> . Но развитие его сейчас заморожено, а сам движок сломался и значения счетчиков не обновляется с прошлого года (на момент написания). Это и подтолкнуло написать свой кармаграф именно сейчас.</p>
<p>Считать ли само слово «кармаграф» названием конкретного сервиса от Goodrone, либо же наименованием класса сервисов (или самого графика) — не знаю. Чтобы не заморачиваться с этим вопросом, свой кармаграф решил назвать иначе — Хаброметр. Ведь не только карму он считает и показывает, но еще хабрасилу и позицию в рейтинге (все, что выдает на данный момент API Хабра). Хаброметр отличается от Кармаграфа не смотря на визуальную схожесть дизайна основного информера. Конечно, я постарался взять все лучшее у Кармаграфа. Основное отличие Хаброметра — информеров будет несколько разных видов. Уже сейчас доступны три вида — кармаграфик, табло и минитабло.</p>
<p>Итак, пару слов о том что получилось. Весь сервис состоит из подсистемы сбора информации и подсистемы ее визуализации. Каждые 2 часа бот собирает информацию о значениях кармы, хабрасилы и позиции в рейтинге (я называю эти данные Хабразначениями) через API Хабра по всем зарегистрированным на сервисе пользователям. Данные сохраняются в базу. В любое время любой желающий может зайти на страницу пользователя и посмотреть историю его Хабразначений. Сейчас показывается история из 500 последних запросов (12 запросов в сутки, получается чуть больше 40 дней). В перспективе отображение определенно изменится, появится календарь. Кроме того, существуют графические информеры, на которых отображаются текущие Хабразначения юзера, максимальные и минимальные значения за время мониторинга и график кармы (наличие определенных компонентов зависит от типа (размера) информера).</p>
<p>Все скрипты написаны на PHP, СУБД используется MySQL (пока во всяком случае). Для рисования используется ImageMagick. Для запуска по расписанию — Cron.</p>
<p>Работает сервис на моем сервере (server.valera.ws), который, к слову, не очень мощный и может не выдержать хабраэффекта. Кстати, с технической точки зрения есть одно существенное отличие работы Хаброметра от Кармаграфа — информеры рисуются не по расписанию после скачки свежих данных, а при первом запросе на отображение информера после обновления данных. Другими словами, после прорисовки информера он кэшируется. Сама прорисовка происходит очень быстро. А кэш чистится после скачки свежих данных. Это позволяет разнести пиковую нагрузку на прорисовку свежих информеров во времени. К тому же, не все зарегистрированные юзеры вообще где-то разместят информеры, а тем более не разместят информеры сразу всех типов. Так что разовая прорисовка всех информеров была бы излишней.</p>
<p>Естественно сервис предоставляется «как есть» и бесплатный для использования. Код Хаброметра я собираюсь открыть, но несколько позже. Сначала требуется отладить его работу, исправить ошибки (которые там наверняка найдутся). Код будет открыт под лицензией GPL 3.</p>
<p>Сейчас сервис работает в режиме beta-тестирования. Буду рад вашим отзывам, багрепортам на e-mail feedbee@gmail.com. В первую очередь хочется добиться стабильности работы и оптимизации ресурсозатрат сервиса. Ну а далее уже заботиться об удобстве пользования.</p>
<p>Первым делом постараюсь доделать запланированные виды информеров. Это 31х31, 88х31 и 350х20. Так же надо будет что-то придумать с расширением цветовых гамм. Когда будет время, поработаю над дизайном страниц сервиса.</p>
<p>P.S. Сайт сервиса (описание системы и бота): <a href="http://habrometr.server.valera.ws/">http://habrometr.server.valera.ws</a>.</p>
<p>P.S.S. Домен такой выбирал не специально, так случилось что server.valera.ws != valera.ws. Потому такой длинный.</p>
<p>P.S.S. Если из-за хабраэффекта накроется мой сервер, уже не кидайте много камней в огород. Пока не было возможности испытать его под нагрузкой.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.01.14~habrometr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
