<?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>Insight IT &#187; Unix</title>
	<atom:link href="http://www.insight-it.ru/tag/unix/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Веб-сервер за два вечера</title>
		<link>http://www.insight-it.ru/unix-way/unix/web-server-za-dva-vechera/</link>
		<comments>http://www.insight-it.ru/unix-way/unix/web-server-za-dva-vechera/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 12:59:10 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Beastie]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[веб-сервер]]></category>
		<category><![CDATA[операционная система]]></category>
		<category><![CDATA[сервер]]></category>
		<category><![CDATA[системное администрирование]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/unix-way/unix/veb-server-za-dva-vechera/</guid>
		<description><![CDATA[Многие из вас наверняка все еще помнят те времена, когда компьютерная техника находилась лишь на ранней стадии своего развития. Позволить себе иметь в личном распоряжении персональный компьютер мог далеко не каждый, а о серверном оборудовании и вовсе не могло быть и речи. Но, к счастью, времена меняются, и на сегодняшний день покупка даже серверного оборудования [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/beastie.png" alt="Beastie" title="Beastie: The BSD Daemon" style="float: left" /><br />
Многие из вас наверняка все еще помнят те времена, когда компьютерная техника находилась лишь на ранней стадии своего развития. Позволить себе иметь в личном распоряжении персональный компьютер мог далеко не каждый, а о серверном оборудовании и вовсе не могло быть и речи.</p>
<p>Но, к счастью, времена меняются, и на сегодняшний день покупка даже серверного оборудования связана с достаточно скромными затратами, сопоставимыми с бюджетом покупки настольного компьютера или ноутбука. Но возникает другой вопрос &#8212; а что же с этим оборудованием делать? Вполне логичным ответом было бы: &#171;использовать по прямому назначению&#187;, о чем мы с Вами сегодня и поговорим в компании с замечательным персонажем по имени <em><a href="/tag/beastie" target="_blank">Beastie</a></em> и операционной системой <strong><a href="/tag/freebsd" target="_blank">FreeBSD</a></strong>, с которой он частенько ассоциируется.</p>
<p><span id="more-39"></span><br />
Под &#171;использованием по прямому назначению&#187; конечно же можно было подразумевать множество разных применений, но я  хотел все-таки остановиться на варианте использования в роли веб-сервера, как альтернативу многочисленным услугам по предоставлению shared и VPS хостинга.</p>
<h3>Предистория</h3>
<p>Некоторое время назад ко мне в руки попал простенький сервер, который как раз предполагалось использовать как хостинг для одного из проектов. Оставалось лишь сделать его пригодным для выполнения этой задачи. Казалось бы дело это как минимум не тривиальное, но буквально через пару дней мне довелось убедиться в обратном.</p>
<p>Ассортимент оборудования, спрятанного внутри <strong>1U</strong> корпуса, был вполне стандартным, ничего особенного: процессор <strong>Intel Xeon 5335</strong>, оперативная память <strong>Kingston 2х2 GB ECC Full-buffered</strong>, жесткий диск изначально только один &#8212; <strong>WD 150 GB 10000rpm SATA</strong>, а вот модель материнской платы, к сожалению, на память назвать не могу, вроде что-то от <strong>SuperMicro</strong>, с простенькой встроенной видеокартой, сетевой картой с двумя гигабитными Ethernet портами и встроенным же видимо software RAID-контроллером. Опытный глаз наверняка заметил бы в этом списке сильную недоукомплектацию, особенно проявляющуюся при упоминании процессора в единственном числе, отсутствии RAID, и скромным объемам оперативной памяти. Объясняется это достаточно просто &#8212; проект еще предстоит тестировать перед запуском, а этой платформы для этого будет более чем достаточно.</p>
<p>Перед запуском проекта в открытое плавание естественно предстоит upgrade оборудования.</p>
<h3 style="text-align: right">День первый</h3>
<h4>Подготовка</h4>
<p>Если верить бумажкам, идущим в комплекте с сервером, на единственный жестком диск в магазине установили демо-версию одной из серверных операционных систем от одной мало кому известной корпорации. Смотреть что это за зверь такой у меня особого желания не было, по-этому я не долго думая пошел искать среди своей коллекции дистрибутивов болванку с заранее выбранным <a href="/tag/opensource" target="_blank">opensource</a> решением вопроса об <a href="/tag/os">операционной системе</a> &#8212; <strong><a href="/tag/freebsd">FreeBSD 6.2</a></strong>.</p>
<p>Почему выбор пал именно на эту <a href="/tag/os" target="_blank">ОС</a> объяснить не так уж и просто, но я все же попробую. Выбор был достаточно классический: <em><a href="/tag/unix" target="_blank">Unix</a> vs <a href="/tag/linux" target="_blank">Linux</a></em>, возникали еще некоторые сомнения насчет решений от <em>Sun</em> в виде <em>Solaris</em> и <em>OpenSolaris</em>, но от них я отказался достаточно быстро в основном из-за более чем скромной документации и проприетарного происхождения, попутно закрыв глаза на все положительные отзывы, которые я видел в <a href="/net" target="_blank">Сети</a>.</p>
<p>Так как мне хотелось иметь иметь перед собой <em>конструктор</em> для сбора системы именно таким образом, как было бы удобно мне, а не разработчикам дистрибутива, то список вариантов, выступавших на стороне <a href="/tag/linux" target="_blank">Linux</a> быстро начал сокращаться, начиная с <strong>CentOS</strong>. Предпоследним вычеркнутым из списка дистрибутивов <a href="/tag/linux" target="_blank">Linux</a> был <strong>Debian</strong>, что оставило в нем лишь <a href="/tag/gentoo" target="_blank">Gentoo Linux</a>. Финальный выбор между <a href="/tag/freebsd">FreeBSD</a> и <a href="/tag/gentoo" target="_blank">Gentoo</a> был сделан уже легче: во-первых, по <a href="/unix-way/linux/gentoo-linux-sony-vaio/" target="_blank">своему опыту с ноутбуком</a> я уже понял, что с <a href="/tag/gentoo" target="_blank">Gentoo</a> предстояло бы немало хлопот, а, во-вторых, в новый <em>конструктор</em>, как ни крути, &#171;играть&#187; намного интереснее, чем в старый, так что долго думать не пришлось <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Установка</h4>
<p>Найдя наконец диск с <a href="/tag/freebsd">FreeBSD</a>, я попытался решить следующий возникший вопрос: а как же установить операционную систему с компакт-диска на компьютер, не имеющий соответствующего привода? Так как сервер был запломбирован и находился на гарантии, вариант частично разобрать и подключить обычный привод отпал сразу же, ровно как и вариант с подключением внешнего привода по причине его отсутствия. Подходящее решение было найдено практически сразу же, благо жесткие диски подключались по принципу hotswap: вытащив жесткий диск без развинчивания корпуса, я подключил его к подвернувшемуся под руку настольному компьютеру, обладающему DVD-приводом. Загрузка прошла успешно и я приступил к установке, руководствуясь <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html" target="_blank" rel="nofollow">FreeBSD Handbook</a>, пересказывать его особого желания у меня  нет, остановлюсь лишь на некоторых особенностях этого процесса.</p>
<p>Первым этапом установки, где пришлось задуматься, был <strong>fdisk</strong> (разбиение диска на так называемые <em>slice</em>). Для избежания путаницы для самого себя, я решил, что размещу рабочие директории http-сервера и базы данных в <strong>/var</strong>, которую и выделил в отдельный <em>slice</em>, занимающий б<em>о</em>льшую часть доступного дискового пространства. В ассортимент доступного при установке программного обеспечения я особо вникать не стал, так как знал, что у меня всегда будет возможность заняться им позже, и как следствие этого выбрал что-то очень близкое к стандартному набору <a href="/tag/po" target="_blank">ПО</a>.<br />
Подтвердив установку и подождав достаточно непродолжительный период времени, я перезагрузил систему, вытащив установочный диск в процессе. Установка оказалась на удивление элементарной, что привело к полученной с первой попытки работоспособной системе. Увидев долгожданное приглашение к вводу логина и пароля я убедился, что могу беспрепятственно получить доступ к консоли и сразу же выключил систему, чтобы перенести жесткий диск обратно на сервер.</p>
<p>Так как сетевое подключение еще только предстояло настроить, то на сервер переносить пришлось не только жесткий диск, но и монитор с клавиатурой. На новом оборудовании все так же прекрасно запустилось, и я принялся за настройку подключения. Особых проблем не возникло &#8212; в <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#NETWORK-COMMUNICATION" target="_blank" rel="nofollow">Handbook</a>&#8216;е все более чем качественно задокументировано, самым сложным был процесс выбора драйвера, вернее осознавание того, что он изначально правильно сам установился. Следующей маленькой проблемой было угадывание какой же из <em>Ethernet</em>-портов был только что настроен, и, соответственно, подключение кабеля именно в него, а не в его соседа. После завершения всех манипуляций я с радостью обнаружил, что <strong>ping</strong> от сервера до gateway&#8217;а успешно проходит, что по сути и означало окончание настройки сетевого подключения.<br />
Следущей целью было избавить себя от необходимости пользоваться позаимствованными у другого компьютера клавиатурой и монитором. Дело тоже оказалось достаточно нехитрым, <strong>sshd</strong> установился и настроился вполне самостоятельно где-то в процессе установки, от меня потребовалось лишь создать дополнительного пользователя, написать нехитрую строчку в <strong>rc.conf</strong>: <em>sshd_enable=&#187;YES&#187;</em> и собственно запустить daemon&#8217;а. Этого было вполне достаточно, чтобы набрав на своем <a href="/tag/noutbuk" target="_blank">ноутбуке</a> <strong>ssh</strong> в консоли, с указанием необходимых параметров, получить удаленный доступ к серверу по протоколу <strong>SSH</strong>.</p>
<p>Решив, что для начала этого будет вполне достаточно, я отправился по другим делам, так как тот вечер еще даже не успел подойти к своему завершению.</p>
<h3 style="text-align: right">День второй</h3>
<h4>Программное обеспечение</h4>
<p>Хорошо, вполне работоспособную <a href="/tag/os" target="_blank">операционную систему</a> мы получили. Осталось снабдить ее необходимым <a href="/tag/po" target="_blank">программным обеспечением</a> для выполнения своих обязанностей, определенных нами заранее.</p>
<p>Прежде чем что-либо устанавливать, очень не пожалел, что ознакомился как с соответствующим <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#PORTS" rel="nofollow" target="_blank">разделом handbook&#8217;a</a>, так и с <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">доступным ассортиментом ПО</a>. После этого я перешел-таки собственно к выбору и установке <a href="/tag/po" target="_blank">ПО</a>:</p>
<ul>
<li>Так как одной из основных составных частей практически любого веб-сервера является http-daemon, именно с его выбора я и решил начать. Причем начал еще задолго до описываемых событий, вся многофункциональность <a href="/tag/apache" target="_blank">Apache</a> мне была не нужна, а аналоги <em>mod_auth</em> и <em>mod_rewrite</em> есть и в более легких http-серверах. Cамо веб-приложение, которое там предполагалось располагать, работает по большей части на <a href="/tag/php" target="_blank">PHP</a>, так что ничего особенного от httpd совсем не требовалось. В итоге финальный выбор был между <em>быстрыми</em> и <em>легкими</em> вариантами: <strong>nginx</strong> и <strong><a href="/tag/lighttpd" target="_blank">lighttpd</a></strong>, какой-либо весомой причины по которой я выбрал <strong><a href="/tag/lighttpd" target="_blank">lighttpd</a></strong> с <strong>mod_fastcgi</strong> привести не могу, основным фактором был мой некоторый опыт работы с ним в прошлом, и отсутствие такового в отношении <strong>nginx</strong>. Установка прошла легко и непринужденно с помощью в сжатые сроки найденного в <a href="/tag/google" target="_blank">Google</a> <a href="http://www.cyberciti.biz/faq/howto-setup-lighttpd-fastcgi-php-server/" target="_blank" rel="nofollow">мануала</a>.</li>
<li>Другим немаловажным компонентом сервера является <strong>ftpd</strong>, как известно используемый для передачи файлов. Собственно говоря, если активное его использование не планируется, то особого значения какой именно сервер будет использоваться значения не имеет: любой из доступных устанавливается настраивается в пару простых шагов без каких-либо проблем (если это имеет значение &#8212; я выбрал <strong>vsftpd</strong>, так как мне уже далеко не один раз доводилось его настраивать на домашних компьютерах, и, как следствие, даже инструкция не понадобилась). Но при потенциальной возможности работы через Интернет, этот протокол является достаточно уязвимым, так как не использует никакого шифрования. Эта проблема решается с помощью механизма <em>FTP over SSH</em>, который представляет собой использование <strong>SSH</strong> в роли туннеля для передачи файлов по <strong>FTP</strong>. О том, как воспользоваться этим механизмом вам подскажет <strong>man ssh</strong>, какой-либо дополнительной конфигурации он не требует, разве что настройки соответствующим образом firewall&#8217;а, но об этом я расскажу позже.</li>
<li>Сам <a href="/tag/php" target="_blank">PHP</a> установлен последней доступной в <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">ports</a> версии и , как уже упоминалось, был подключен к <a href="/tag/lighttpd" target="_blank">lighttpd</a> с помощью <strong>mod_fastcgi</strong>, какой-либо дополнительной конфигурации с моей стороны не потребовалось, я разве что выбрал список модулей (в общем-то тоже занятие не сложное, достаточно лишь осознавать какие именно используются, плюс я еще решил <strong><a href="http://www.hardened-php.net/suhosin/" rel="nofollow" target="_blank">Suhosin</a></strong> установить) и просто просмотрел по диагонали все конфиги (в основном сам <strong>php.ini</strong> и <strong>lighttpd.conf</strong>) на предмет их соответствия потребностям моего приложения. Отдельная история возникла с лишь одним модулем &#8212; <em><a href="/tag/blitz" target="_blank">Blitz</a></em>, который на данный момент все еще отсутствует в репозиториях как <a href="/tag/freebsd" target="_blank">FreeBSD</a>, так и подавляющего большинства (если не всех) дистрибутивов <a href="/tag/linux" target="_blank">Linux</a>. Его пришлось устанавливать вручную из исходников по <a href="http://alexeyrybak.com/blitz/blitz_ru.html#install_config.install" target="_blank" rel="nofollow">соответствующему мануалу</a>, что правда тоже дело не хитрое и заняло всего несколько минут.</li>
<li><strong><a href="/tag/subd" target="_blank">СУБД</a></strong> особо выбирать не пришлось &#8212; приложение написано было с расчетом на <strong><a href="/tag/postgresql" target="_blank">PostrgeSQL</a></strong>, ее соответственно и прикручивал к <strong><a href="/tag/php" target="_blank">PHP</a>.</strong> Этот этап был пожалуй одним из самых проблематичных, так как сразу после классического <strong>make install clean</strong> соответствующий daemon запускаться отказался. Какого-либо осознанного сообщения об ошибке <strong>/usr/local/etc/rc.d/postgresqld start</strong> не выводило как в консоль, так и в логи, но тем не менее консольный клиент <strong>psql</strong> и само веб-приложение жаловались на отсутствие запущенной <a href="/tag/subd" target="_blank">СУБД</a>. Этот факт сильно затруднял поиск возможных вариантов решения на просторах <a href="/tag/internet">Сети</a>, так что не найдя ничего полезного я решил заняться диагностикой проблемы и поиском решения для нее самостоятельно. Методом проб и ошибок, перебрав множество возможных вариантов запуска daemon&#8217;а, я пришел к выводу, что у пользователя от имени которого он должен был запускаться явно проблемы с доступом к файловой системе. Видимо так получилось из-за нестандартного расположения самой базы данных &#8212; в директории <strong>/var</strong>. Не смотря на тот факт, что <strong>chown</strong> и <strong>chmod</strong> были использованы по прямому назначению в отношении соответствующих директорий для установления прав доступа. В итоге оказалось, что директория указанная для этого пользователя как домашняя (по памяти пишу, могу ошибиться, но вроде <strong>/usr/local/pgsql</strong>) по каким-то причинам не создалась и соответственно именно этот факт и мешал запуску daemon&#8217;а. Восстановив справедливость в отношении этого пользователя, я обнаружил, что <strong><a href="/tag/postgresql" target="_blank">PostrgeSQL</a></strong> успешно запустился-таки, а мое приложение тоже стало функционировать именно так, как ему было положено. Проверив содержимое соответствующего конфига, я решил его больше не трогать, а то как говорится &#171;premature optimization is the root of all evil&#187;&amp;copyright;. За компанию решил установить веб-интерфейс к <a href="/tag/postgresql" target="_blank">PostrgeSQL</a> &#8212; <strong>phppgadmin</strong>. Собравшись из <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">портов</a>, он повел себя как-то не очень адекватно, совсем не так каким я привык его видеть у себя на <a href="/tag/noutbuk" target="_blank">ноутбуке</a>, разбираться в причинах было не охота &#8212; простое копирование и замена соответствующей директории по <em>ftp</em> буквально за минуту решило проблему.</li>
<li>Вариантов фильтров сетевого трафика в <a href="/tag/freebsd" target="_blank">FreeBSD</a> имеется предостаточно: <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-PF" target="_blank" rel="nofollow">pf</a>, <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPF" target="_blank" rel="nofollow">ipf</a>, <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPFW%22" target="_blank" rel="nofollow">ipfw</a>. Опыта работы ни с одним из них у меня не было, так что выбор происходил из достаточно субъективных критериев &#8212; очевидности принципов работы правил и достаточности документации. Так как я был уверен, что каждый из них сможет обеспечить достаточный уровень безопасности, основываясь на указанных выше критериях в итоге я выбрал <strong>ipf</strong>. Документация позволила легко и непринужденно все установить и настроить, правда за компанию пришлось разбираться и с <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#KERNELCONFIG" rel="nofollow" target="_blank">пересборкой ядра</a>. В качестве базы для построения собственного списка правил я использовал приведенный все там же, в документации, пример. Само собой пришлось доработать его под конкретную систему, но методом проб и ошибок эта задача выполняется достаточно быстро <em>(будте осторожны с 22 портом, используемым для SSH &#8212; очень легко на этом этапе случайно заблокировать самому себе доступ к серверу)</em>. Получившийся в итоге список правил приводить не буду, так как его еще предстоит довести до ума на активно работающей системе.</li>
</ul>
<h3>Заключение</h3>
<p>Не прошло и двух дней, как из простого набора оборудования получился вполне готовый к работе веб-сервер, конечно же доводить до ума его придется еще достаточно долго, но просто стабильно работать он был в состоянии уже тогда. Дальше его отвезли в место постоянного его прибывания, подключили к более-менее приличному интернет-каналу, с моей стороны при этом потребовалось лишь слегка поменять настройки сетевого подключения, и вот &#8212; он уже доступен из <a href="/net" target="_blank">Сети</a>. Практически сразу же обнаружился один мой недочет в плане выбора <a href="/tag/po" target="_blank">ПО</a> &#8212; буквально в первую же ночь после открытия публичного доступа к серверу нашлась масса желающих попытаться подобрать по словарю логин и пароль для доступа к серверу по SSH, но он был открыт лишь для одной учетной записи, у которой было мягко говоря нестандартное имя пользователя, даже его никто за ночь не смог угадать, а до более чем 20-символьного пароля дело так и не дошло. На следующее утро я, не долго думая, установил программу под названием <strong><a href="http://www.freebsd.org/cgi/url.cgi?ports/security/sshguard/pkg-descr" rel="nofollow" target="_blank">sshguard</a></strong>, которая сразу же предотвратила все последующие попытки подобным образом издеваться над сервером. Дальше надо было настроить запись на DNS-сервере для ассоциации домена с IP нашего сервера, настроить почту, закончить работу над самим веб-приложением и много чего еще, но это уже совсем другая история.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/unix/web-server-za-dva-vechera/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Веб-сервер за два вечера</title>
		<link>http://www.insight-it.ru/unix-way/unix/veb-server-za-dva-vechera/</link>
		<comments>http://www.insight-it.ru/unix-way/unix/veb-server-za-dva-vechera/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 12:59:03 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[Beastie]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[веб-сервер]]></category>
		<category><![CDATA[операционная система]]></category>
		<category><![CDATA[сервер]]></category>
		<category><![CDATA[системное администрирование]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=83</guid>
		<description><![CDATA[Многие из вас наверняка все еще помнят те времена, когда компьютерная техника находилась лишь на ранней стадии своего развития. Позволить себе иметь в личном распоряжении персональный компьютер мог далеко не каждый, а о серверном оборудовании и вовсе не могло быть и речи. Но, к счастью, времена меняются, и на сегодняшний день покупка даже серверного оборудования [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/beastie.png" alt="Beastie" title="Beastie: The BSD Daemon" style="float: left" /><br />
Многие из вас наверняка все еще помнят те времена, когда компьютерная техника находилась лишь на ранней стадии своего развития. Позволить себе иметь в личном распоряжении персональный компьютер мог далеко не каждый, а о серверном оборудовании и вовсе не могло быть и речи.</p>
<p>Но, к счастью, времена меняются, и на сегодняшний день покупка даже серверного оборудования связана с достаточно скромными затратами, сопоставимыми с бюджетом покупки настольного компьютера или ноутбука. Но возникает другой вопрос &#8212; а что же с этим оборудованием делать? Вполне логичным ответом было бы: &#171;использовать по прямому назначению&#187;, о чем мы с Вами сегодня и поговорим в компании с замечательным персонажем по имени <em><a href="/tag/beastie" target="_blank">Beastie</a></em> и операционной системой <strong><a href="/tag/freebsd" target="_blank">FreeBSD</a></strong>, с которой он частенько ассоциируется.</p>
<p><span id="more-83"></span><br />
Под &#171;использованием по прямому назначению&#187; конечно же можно было подразумевать множество разных применений, но я  хотел все-таки остановиться на варианте использования в роли веб-сервера, как альтернативу многочисленным услугам по предоставлению shared и VPS хостинга.</p>
<h3>Предистория</h3>
<p>Некоторое время назад ко мне в руки попал простенький сервер, который как раз предполагалось использовать как хостинг для одного из проектов. Оставалось лишь сделать его пригодным для выполнения этой задачи. Казалось бы дело это как минимум не тривиальное, но буквально через пару дней мне довелось убедиться в обратном.</p>
<p>Ассортимент оборудования, спрятанного внутри <strong>1U</strong> корпуса, был вполне стандартным, ничего особенного: процессор <strong>Intel Xeon 5335</strong>, оперативная память <strong>Kingston 2х2 GB ECC Full-buffered</strong>, жесткий диск изначально только один &#8212; <strong>WD 150 GB 10000rpm SATA</strong>, а вот модель материнской платы, к сожалению, на память назвать не могу, вроде что-то от <strong>SuperMicro</strong>, с простенькой встроенной видеокартой, сетевой картой с двумя гигабитными Ethernet портами и встроенным же видимо software RAID-контроллером. Опытный глаз наверняка заметил бы в этом списке сильную недоукомплектацию, особенно проявляющуюся при упоминании процессора в единственном числе, отсутствии RAID, и скромным объемам оперативной памяти. Объясняется это достаточно просто &#8212; проект еще предстоит тестировать перед запуском, а этой платформы для этого будет более чем достаточно.</p>
<p>Перед запуском проекта в открытое плавание естественно предстоит upgrade оборудования.</p>
<h3 style="text-align: right">День первый</h3>
<h4>Подготовка</h4>
<p>Если верить бумажкам, идущим в комплекте с сервером, на единственный жестком диск в магазине установили демо-версию одной из серверных операционных систем от одной мало кому известной корпорации. Смотреть что это за зверь такой у меня особого желания не было, по-этому я не долго думая пошел искать среди своей коллекции дистрибутивов болванку с заранее выбранным <a href="/tag/opensource" target="_blank">opensource</a> решением вопроса об <a href="/tag/os">операционной системе</a> &#8212; <strong><a href="/tag/freebsd">FreeBSD 6.2</a></strong>.</p>
<p>Почему выбор пал именно на эту <a href="/tag/os" target="_blank">ОС</a> объяснить не так уж и просто, но я все же попробую. Выбор был достаточно классический: <em><a href="/tag/unix" target="_blank">Unix</a> vs <a href="/tag/linux" target="_blank">Linux</a></em>, возникали еще некоторые сомнения насчет решений от <em>Sun</em> в виде <em>Solaris</em> и <em>OpenSolaris</em>, но от них я отказался достаточно быстро в основном из-за более чем скромной документации и проприетарного происхождения, попутно закрыв глаза на все положительные отзывы, которые я видел в <a href="/net" target="_blank">Сети</a>.</p>
<p>Так как мне хотелось иметь иметь перед собой <em>конструктор</em> для сбора системы именно таким образом, как было бы удобно мне, а не разработчикам дистрибутива, то список вариантов, выступавших на стороне <a href="/tag/linux" target="_blank">Linux</a> быстро начал сокращаться, начиная с <strong>CentOS</strong>. Предпоследним вычеркнутым из списка дистрибутивов <a href="/tag/linux" target="_blank">Linux</a> был <strong>Debian</strong>, что оставило в нем лишь <a href="/tag/gentoo" target="_blank">Gentoo Linux</a>. Финальный выбор между <a href="/tag/freebsd">FreeBSD</a> и <a href="/tag/gentoo" target="_blank">Gentoo</a> был сделан уже легче: во-первых, по <a href="/unix-way/linux/gentoo-linux-sony-vaio/" target="_blank">своему опыту с ноутбуком</a> я уже понял, что с <a href="/tag/gentoo" target="_blank">Gentoo</a> предстояло бы немало хлопот, а, во-вторых, в новый <em>конструктор</em>, как ни крути, &#171;играть&#187; намного интереснее, чем в старый, так что долго думать не пришлось <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Установка</h4>
<p>Найдя наконец диск с <a href="/tag/freebsd">FreeBSD</a>, я попытался решить следующий возникший вопрос: а как же установить операционную систему с компакт-диска на компьютер, не имеющий соответствующего привода? Так как сервер был запломбирован и находился на гарантии, вариант частично разобрать и подключить обычный привод отпал сразу же, ровно как и вариант с подключением внешнего привода по причине его отсутствия. Подходящее решение было найдено практически сразу же, благо жесткие диски подключались по принципу hotswap: вытащив жесткий диск без развинчивания корпуса, я подключил его к подвернувшемуся под руку настольному компьютеру, обладающему DVD-приводом. Загрузка прошла успешно и я приступил к установке, руководствуясь <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html" target="_blank" rel="nofollow">FreeBSD Handbook</a>, пересказывать его особого желания у меня  нет, остановлюсь лишь на некоторых особенностях этого процесса.</p>
<p>Первым этапом установки, где пришлось задуматься, был <strong>fdisk</strong> (разбиение диска на так называемые <em>slice</em>). Для избежания путаницы для самого себя, я решил, что размещу рабочие директории http-сервера и базы данных в <strong>/var</strong>, которую и выделил в отдельный <em>slice</em>, занимающий б<em>о</em>льшую часть доступного дискового пространства. В ассортимент доступного при установке программного обеспечения я особо вникать не стал, так как знал, что у меня всегда будет возможность заняться им позже, и как следствие этого выбрал что-то очень близкое к стандартному набору <a href="/tag/po" target="_blank">ПО</a>.<br />
Подтвердив установку и подождав достаточно непродолжительный период времени, я перезагрузил систему, вытащив установочный диск в процессе. Установка оказалась на удивление элементарной, что привело к полученной с первой попытки работоспособной системе. Увидев долгожданное приглашение к вводу логина и пароля я убедился, что могу беспрепятственно получить доступ к консоли и сразу же выключил систему, чтобы перенести жесткий диск обратно на сервер.</p>
<p>Так как сетевое подключение еще только предстояло настроить, то на сервер переносить пришлось не только жесткий диск, но и монитор с клавиатурой. На новом оборудовании все так же прекрасно запустилось, и я принялся за настройку подключения. Особых проблем не возникло &#8212; в <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#NETWORK-COMMUNICATION" target="_blank" rel="nofollow">Handbook</a>&#8216;е все более чем качественно задокументировано, самым сложным был процесс выбора драйвера, вернее осознавание того, что он изначально правильно сам установился. Следующей маленькой проблемой было угадывание какой же из <em>Ethernet</em>-портов был только что настроен, и, соответственно, подключение кабеля именно в него, а не в его соседа. После завершения всех манипуляций я с радостью обнаружил, что <strong>ping</strong> от сервера до gateway&#8217;а успешно проходит, что по сути и означало окончание настройки сетевого подключения.<br />
Следущей целью было избавить себя от необходимости пользоваться позаимствованными у другого компьютера клавиатурой и монитором. Дело тоже оказалось достаточно нехитрым, <strong>sshd</strong> установился и настроился вполне самостоятельно где-то в процессе установки, от меня потребовалось лишь создать дополнительного пользователя, написать нехитрую строчку в <strong>rc.conf</strong>: <em>sshd_enable=&#187;YES&#187;</em> и собственно запустить daemon&#8217;а. Этого было вполне достаточно, чтобы набрав на своем <a href="/tag/noutbuk" target="_blank">ноутбуке</a> <strong>ssh</strong> в консоли, с указанием необходимых параметров, получить удаленный доступ к серверу по протоколу <strong>SSH</strong>.</p>
<p>Решив, что для начала этого будет вполне достаточно, я отправился по другим делам, так как тот вечер еще даже не успел подойти к своему завершению.</p>
<h3 style="text-align: right">День второй</h3>
<h4>Программное обеспечение</h4>
<p>Хорошо, вполне работоспособную <a href="/tag/os" target="_blank">операционную систему</a> мы получили. Осталось снабдить ее необходимым <a href="/tag/po" target="_blank">программным обеспечением</a> для выполнения своих обязанностей, определенных нами заранее.</p>
<p>Прежде чем что-либо устанавливать, очень не пожалел, что ознакомился как с соответствующим <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#PORTS" rel="nofollow" target="_blank">разделом handbook&#8217;a</a>, так и с <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">доступным ассортиментом ПО</a>. После этого я перешел-таки собственно к выбору и установке <a href="/tag/po" target="_blank">ПО</a>:</p>
<ul>
<li>Так как одной из основных составных частей практически любого веб-сервера является http-daemon, именно с его выбора я и решил начать. Причем начал еще задолго до описываемых событий, вся многофункциональность <a href="/tag/apache" target="_blank">Apache</a> мне была не нужна, а аналоги <em>mod_auth</em> и <em>mod_rewrite</em> есть и в более легких http-серверах. Cамо веб-приложение, которое там предполагалось располагать, работает по большей части на <a href="/tag/php" target="_blank">PHP</a>, так что ничего особенного от httpd совсем не требовалось. В итоге финальный выбор был между <em>быстрыми</em> и <em>легкими</em> вариантами: <strong>nginx</strong> и <strong><a href="/tag/lighttpd" target="_blank">lighttpd</a></strong>, какой-либо весомой причины по которой я выбрал <strong><a href="/tag/lighttpd" target="_blank">lighttpd</a></strong> с <strong>mod_fastcgi</strong> привести не могу, основным фактором был мой некоторый опыт работы с ним в прошлом, и отсутствие такового в отношении <strong>nginx</strong>. Установка прошла легко и непринужденно с помощью в сжатые сроки найденного в <a href="/tag/google" target="_blank">Google</a> <a href="http://www.cyberciti.biz/faq/howto-setup-lighttpd-fastcgi-php-server/" target="_blank" rel="nofollow">мануала</a>.</li>
<li>Другим немаловажным компонентом сервера является <strong>ftpd</strong>, как известно используемый для передачи файлов. Собственно говоря, если активное его использование не планируется, то особого значения какой именно сервер будет использоваться значения не имеет: любой из доступных устанавливается настраивается в пару простых шагов без каких-либо проблем (если это имеет значение &#8212; я выбрал <strong>vsftpd</strong>, так как мне уже далеко не один раз доводилось его настраивать на домашних компьютерах, и, как следствие, даже инструкция не понадобилась). Но при потенциальной возможности работы через Интернет, этот протокол является достаточно уязвимым, так как не использует никакого шифрования. Эта проблема решается с помощью механизма <em>FTP over SSH</em>, который представляет собой использование <strong>SSH</strong> в роли туннеля для передачи файлов по <strong>FTP</strong>. О том, как воспользоваться этим механизмом вам подскажет <strong>man ssh</strong>, какой-либо дополнительной конфигурации он не требует, разве что настройки соответствующим образом firewall&#8217;а, но об этом я расскажу позже.</li>
<li>Сам <a href="/tag/php" target="_blank">PHP</a> установлен последней доступной в <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">ports</a> версии и , как уже упоминалось, был подключен к <a href="/tag/lighttpd" target="_blank">lighttpd</a> с помощью <strong>mod_fastcgi</strong>, какой-либо дополнительной конфигурации с моей стороны не потребовалось, я разве что выбрал список модулей (в общем-то тоже занятие не сложное, достаточно лишь осознавать какие именно используются, плюс я еще решил <strong><a href="http://www.hardened-php.net/suhosin/" rel="nofollow" target="_blank">Suhosin</a></strong> установить) и просто просмотрел по диагонали все конфиги (в основном сам <strong>php.ini</strong> и <strong>lighttpd.conf</strong>) на предмет их соответствия потребностям моего приложения. Отдельная история возникла с лишь одним модулем &#8212; <em><a href="/tag/blitz" target="_blank">Blitz</a></em>, который на данный момент все еще отсутствует в репозиториях как <a href="/tag/freebsd" target="_blank">FreeBSD</a>, так и подавляющего большинства (если не всех) дистрибутивов <a href="/tag/linux" target="_blank">Linux</a>. Его пришлось устанавливать вручную из исходников по <a href="http://alexeyrybak.com/blitz/blitz_ru.html#install_config.install" target="_blank" rel="nofollow">соответствующему мануалу</a>, что правда тоже дело не хитрое и заняло всего несколько минут.</li>
<li><strong><a href="/tag/subd" target="_blank">СУБД</a></strong> особо выбирать не пришлось &#8212; приложение написано было с расчетом на <strong><a href="/tag/postgresql" target="_blank">PostrgeSQL</a></strong>, ее соответственно и прикручивал к <strong><a href="/tag/php" target="_blank">PHP</a>.</strong> Этот этап был пожалуй одним из самых проблематичных, так как сразу после классического <strong>make install clean</strong> соответствующий daemon запускаться отказался. Какого-либо осознанного сообщения об ошибке <strong>/usr/local/etc/rc.d/postgresqld start</strong> не выводило как в консоль, так и в логи, но тем не менее консольный клиент <strong>psql</strong> и само веб-приложение жаловались на отсутствие запущенной <a href="/tag/subd" target="_blank">СУБД</a>. Этот факт сильно затруднял поиск возможных вариантов решения на просторах <a href="/tag/internet">Сети</a>, так что не найдя ничего полезного я решил заняться диагностикой проблемы и поиском решения для нее самостоятельно. Методом проб и ошибок, перебрав множество возможных вариантов запуска daemon&#8217;а, я пришел к выводу, что у пользователя от имени которого он должен был запускаться явно проблемы с доступом к файловой системе. Видимо так получилось из-за нестандартного расположения самой базы данных &#8212; в директории <strong>/var</strong>. Не смотря на тот факт, что <strong>chown</strong> и <strong>chmod</strong> были использованы по прямому назначению в отношении соответствующих директорий для установления прав доступа. В итоге оказалось, что директория указанная для этого пользователя как домашняя (по памяти пишу, могу ошибиться, но вроде <strong>/usr/local/pgsql</strong>) по каким-то причинам не создалась и соответственно именно этот факт и мешал запуску daemon&#8217;а. Восстановив справедливость в отношении этого пользователя, я обнаружил, что <strong><a href="/tag/postgresql" target="_blank">PostrgeSQL</a></strong> успешно запустился-таки, а мое приложение тоже стало функционировать именно так, как ему было положено. Проверив содержимое соответствующего конфига, я решил его больше не трогать, а то как говорится &#171;premature optimization is the root of all evil&#187;&amp;copyright;. За компанию решил установить веб-интерфейс к <a href="/tag/postgresql" target="_blank">PostrgeSQL</a> &#8212; <strong>phppgadmin</strong>. Собравшись из <a href="http://www.freebsd.org/ports/" rel="nofollow" target="_blank">портов</a>, он повел себя как-то не очень адекватно, совсем не так каким я привык его видеть у себя на <a href="/tag/noutbuk" target="_blank">ноутбуке</a>, разбираться в причинах было не охота &#8212; простое копирование и замена соответствующей директории по <em>ftp</em> буквально за минуту решило проблему.</li>
<li>Вариантов фильтров сетевого трафика в <a href="/tag/freebsd" target="_blank">FreeBSD</a> имеется предостаточно: <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-PF" target="_blank" rel="nofollow">pf</a>, <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPF" target="_blank" rel="nofollow">ipf</a>, <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPFW%22" target="_blank" rel="nofollow">ipfw</a>. Опыта работы ни с одним из них у меня не было, так что выбор происходил из достаточно субъективных критериев &#8212; очевидности принципов работы правил и достаточности документации. Так как я был уверен, что каждый из них сможет обеспечить достаточный уровень безопасности, основываясь на указанных выше критериях в итоге я выбрал <strong>ipf</strong>. Документация позволила легко и непринужденно все установить и настроить, правда за компанию пришлось разбираться и с <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#KERNELCONFIG" rel="nofollow" target="_blank">пересборкой ядра</a>. В качестве базы для построения собственного списка правил я использовал приведенный все там же, в документации, пример. Само собой пришлось доработать его под конкретную систему, но методом проб и ошибок эта задача выполняется достаточно быстро <em>(будте осторожны с 22 портом, используемым для SSH &#8212; очень легко на этом этапе случайно заблокировать самому себе доступ к серверу)</em>. Получившийся в итоге список правил приводить не буду, так как его еще предстоит довести до ума на активно работающей системе.</li>
</ul>
<h3>Заключение</h3>
<p>Не прошло и двух дней, как из простого набора оборудования получился вполне готовый к работе веб-сервер, конечно же доводить до ума его придется еще достаточно долго, но просто стабильно работать он был в состоянии уже тогда. Дальше его отвезли в место постоянного его прибывания, подключили к более-менее приличному интернет-каналу, с моей стороны при этом потребовалось лишь слегка поменять настройки сетевого подключения, и вот &#8212; он уже доступен из <a href="/net" target="_blank">Сети</a>. Практически сразу же обнаружился один мой недочет в плане выбора <a href="/tag/po" target="_blank">ПО</a> &#8212; буквально в первую же ночь после открытия публичного доступа к серверу нашлась масса желающих попытаться подобрать по словарю логин и пароль для доступа к серверу по SSH, но он был открыт лишь для одной учетной записи, у которой было мягко говоря нестандартное имя пользователя, даже его никто за ночь не смог угадать, а до более чем 20-символьного пароля дело так и не дошло. На следующее утро я, не долго думая, установил программу под названием <strong><a href="http://www.freebsd.org/cgi/url.cgi?ports/security/sshguard/pkg-descr" rel="nofollow" target="_blank">sshguard</a></strong>, которая сразу же предотвратила все последующие попытки подобным образом издеваться над сервером. Дальше надо было настроить запись на DNS-сервере для ассоциации домена с IP нашего сервера, настроить почту, закончить работу над самим веб-приложением и много чего еще, но это уже совсем другая история.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/unix/veb-server-za-dva-vechera/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>KDE 4 увидел свет</title>
		<link>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/</link>
		<comments>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 18:37:40 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[программное обеспечение]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/unix-way/linux-unix-way/kde-4-uvidel-svet/</guid>
		<description><![CDATA[Наконец-то наступил тот самый день, которого так долго ждали многие пользователи различных дистрибутивов Linux и многих других unix-like операционных систем. Да-да, сегодня вышла новая major-версия знаменитого K Desktop Environment под номером 4.0! Вкратце перескажу оффициальный пресс-релиз: Набор библиотек, лежащих в основе KDE, был кардинальным образом переделан, изменения произошли в каждой из них. Появилось два новых [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/kde.png" title="K Desktop Environment" alt="KDE Icon" style="margin: 10px; float: right;" /></p>
<p>Наконец-то наступил тот самый день, которого так долго ждали многие пользователи различных дистрибутивов Linux и многих других unix-like операционных систем. Да-да, сегодня вышла новая major-версия знаменитого K Desktop Environment под номером 4.0!</p>
<p><span id="more-24"></span></p>
<p>Вкратце перескажу <a target="_blank" href="http://www.kde.org/announcements/4.0/index.php">оффициальный пресс-релиз</a>:</p>
<p>Набор библиотек, лежащих в основе KDE, был кардинальным образом переделан, изменения произошли в каждой из них. Появилось два новых framework&#8217;а: один мультимедийный.- Phonon, а второй &#8212; Solid &#8212; для интеграции интерфейса для работы с используемым оборудованием в рабочее окружение.</p>
<p>Рабочий стол KDE приобрел новую оболочку под названием Plasma, которая поддерживает огромное количество widget&#8217;ов, эффектов и прочих украшательств.</p>
<p>Все программное обеспечение, входящее в его состав также не осталось без изменений (немного от себя: лично мне больше всего понравились изменения в Kopete &#8212; единственный icq клиент под *nix, в котором появилась возможность использования x-status, которой сильно не хватало, успел заценить его еще некоторое время назад в beta-версии KDE 4). Помимо Konqueror появился новый файловый менеджер под названием Dolphin и просмотрщик документов Okular (основанный на KPDF, но поддерживающий существенно большее количество форматов документов).</p>
<p>Тема рабочего окружения, используемая по-умолчанию также изменилась и называется она теперь Oxygen, на вкус и цвет конечно, но я думаю найдется много людей, которым она прийдется по душе.</p>
<div style="margin: 16px; text-align: center;"><img src="http://www.kde.org/announcements/4.0/screenshots/desktop_thumb.jpg" alt="KDE4 Screenshot" title="KDE 4.0 Screenshot" /></div>
<p>Вот так вот примерно выглядит новинка в стандартном варианте оформления, естественно практически безграничные возможности по модификации пользовательского интерфейса не только никуда не делись, а только преувеличились.</p>
<p>&nbsp;</p>
<p>На личном опыте новый релиз я опробовать еще не успел, но планирую этим делом заняться в ближайшем будующим, наверное сразу же как появятся ebuild&#8217;ы для Gentoo. После чего несомненно поделюсь с Вами впечатлениями.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unix way</title>
		<link>http://www.insight-it.ru/unix-way/unix-way/</link>
		<comments>http://www.insight-it.ru/unix-way/unix-way/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 16:30:16 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Unix way]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[идеология]]></category>
		<category><![CDATA[программное обеспечение]]></category>
		<category><![CDATA[философия]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/programming/unix-way/</guid>
		<description><![CDATA[На эту тему в Сети можно найти несметное количество статей и обсуждений, не удивлюсь если Вам уже доводилось читать что-либо подобное в прошлом или может быть работать в одной из множества операционных систем, разработанных с использованием этой идеологии. За этим словосочетанием скрывается целая философия разработки программного обеспечения, начавшая свое развитие в середине 90-х годов прошлого [...]]]></description>
			<content:encoded><![CDATA[<p>На эту тему в Сети можно найти несметное количество статей и обсуждений, не удивлюсь если Вам уже доводилось читать что-либо подобное в прошлом или может быть работать в одной из множества операционных систем, разработанных с использованием этой идеологии. За этим словосочетанием скрывается целая философия разработки программного обеспечения, начавшая свое развитие в середине 90-х годов прошлого века и воплощенная в огромном количестве операционных систем и в еще большем количестве <a href="/tag/opensource" target="_blank">opensource</a> проектов. В этом тексте я хочу поведать Вам свой взгляд на эту философию с двух точек зрения: программиста и пользователя.</p>
<p>Наиболее точно охарактеризовать то, о чем пойдет речь можно лишь процитировав одного из основателей традиций <a href="/tag/unix" target="_blank">Unix</a> и разработчика <a href="/tag/tekhnologiya" target="_blank">технологии</a> под названием &quot;Unix pipes&quot; &#8212; <a href="http://www.cs.dartmouth.edu/~doug/" target="_blank" rel="nofollow">Douglas&#8217;а Mcllroy&#8217;а</a>:</p>
<blockquote><p>&quot;This is the Unix philosophy:</p>
<dl>
<dd>Write programs that do one thing and do it well.</dd>
<dd>Write programs to work together.</dd>
<dd>Write programs to handle text streams, because that is a universal interface.&quot;</dd>
</dl>
</blockquote>
<p> <span id="more-15"></span></p>
<p>Для начала воспроизведу суть цитаты для тех читателей, кто возможно не знает в достаточной степени английского языка:</p>
<p><cite>Философия написания программ для <a href="/tag/unix" target="_blank">Unix</a> заключается в написании программ, качественно решающих строго одну задачу, но при этом тесно работающих вместе. В качестве стандартного универсального интерфейса между ними предлагается использование стандартных потоков текстовых данных.</cite></p>
<p>Сразу же позволю себе слегка отойти от темы, упомянув что существует также и абсолютно противоположный подход к написанию программного обеспечения, который стоит упомянуть для того, чтобы &quot;почувствовать разницу&quot;. Он используется в большинстве <abbr title="Платное программное обеспечение с закрытым кодом">проприетарных</abbr> программ и заключается в нагромождении максимального количества функционала внутри одного программного продукта, в большинстве случаев с целью получения дополнительных возможностей для построения рекламной компании и, как следствие, более выгодного ведения продаж. К сожалению, при таком подходе разработчики часто забывают о качестве ПО, о возможностях расширение, удобстве использования, возможностях модификации со стороны пользователя и многом другом, но зато в итоге получают продукт, о котором можно указать &quot;установил &#8212; и сразу что-то как-то работает&quot;, но что именно, как оно работает, и как долго еще сможет работать до тех пор пока не начнутся неполадки, и как с ними бороться в случае если они появятся &#8212; остается загадкой для  как для подавляющего большинства пользователей, так и не редко для самих разработчиков тоже.</p>
<p>Закончив лирическое отступление, хочется взглянуть на нашу философию с точки зрения программиста.</p>
<h3 style="text-align: right;">Взгляд с точки зрения программиста</h3>
<p>Философия <a href="/tag/unix" target="_blank">Unix</a> предлагает программисту набор элементарных правил, соблюдение которых не только упростит работу программиста, но и позволит расширить сферу применения получившегося программного продукта с помощью различных вариантов интеграции с другими программами.</p>
<p>Как же это выглядит?</p>
<h4>Одна задача &#8212; одна программа</h4>
<p>С помощью этого правила список действий, требуемых от программиста для написания готовой программы, резко сокращается до двух позиций, одной из которых является собственно реализация задачи. Задачи эти чаще всего элементарны до безобразия и заключается в переработки входных данных, например: вывод содержимого указанного каталога, подсчет длины указанного файла, фильтрация входных данных, отправка локального электронного письма на удаленный сервер (да-да, для приема, сортировки, хранения, чтения, редактирования и отправки электронных писем могут использоваться отдельные программы).</p>
<p>Подобное множество программ решающих элементарные задачи делает количество способов решения какой-либо комплексной задачи стремящимся к бесконечности, ведь при наличии стандартизованного интерфейса комбинировать программы можно в любой последовательности. Для расширения возможностей такого рода комбинирования используются различные скриптовые языке, которых существует достаточно много, наиболее распространенным из которых являются bash скрипты, основанные на командах одноименной оболочки командной строки, используемой по-умолчанию во всех (хотя возможно стоило не использовать громких слов и написать &quot;в большинстве&quot;) дистрибутивах <a href="/tag/linux" target="_blank">Linux</a>.</p>
<h4>Unix pipes</h4>
<p>Этот механизм является основным способом реализации столько раз упоминавшегося выше интерфейса между элементарными программами.  Реализация его поддержки является как раз второй задачей, которая ставится перед программистом, идущим по пути <a href="/tag/unix" target="_blank">Unix</a>. С использованием большинства языков программирования она является тривиальной, особенно это справедливо для C.</p>
<p>На подробностях реализации останавливаться не будем, по этому позволю себе плавно перейти к следующему разделу и продолжить эту тему уже там.</p>
<h3 style="text-align: right;">Взгляд с точки зрения пользователя</h3>
<p>Слово pipes можно переводить по-разному, мне больше нравится вариант <em>потоки</em>,  но также часто используется и дословный перевод &#8212; <em>трубы</em>. Также имеет смысл сразу сказать, что его реализация полностью основывается на командной строке и командах различных ее оболочек, а также тесно интегрирована с устройствами компьютера и файловой системой.</p>
<p>У каждой элементарной программы, соответствующей этой идеологии, должен быть входной и выходной стандартные текстовые потоки &#8212; stdin и stdout соответственно. Механизм unix pipes позволяет перенаправлять эти потоки любой программы произвольным образом с помощью трех простых операторов: |, &gt; и &lt;. Первый из них &#8212; | перенаправляет stdout команды слева от него в stdin команды справа, а &gt; и &lt; предназначены для перенаправление потоков в/из файлы по схожему принципу.</p>
<p>Предлагаю рассмотреть  этот механизм на примерах. Возьмем несколько базовых утилит, имеющихся на практически любой unix-like системе:</p>
<ul>
<li><em>cat</em> &#8212; вывод содержимого указанного первым параметром файла в stdout (по умолчанию stdout в большинстве программ направляется  в консоль)</li>
<li><em>less</em> &#8212; постраничный вывод текста, полученного в stdin в stdout (переключение страниц и некоторые другие функции производятся с клавиатуры, возможны и другие варианты использования, но они нам не нужны)</li>
<li><em>grep</em> &#8212; построчная фильтрация текста, полученного в stdin, вывод только строк, содержащих текст, указанный первым аргументом, и вывод результата в stdout.</li>
</ul>
<p>Начнем с примера, позволяющего прочитать постранично любой файл:</p>
<pre lang="bash">
cat readme.txt | less</pre>
<p>Не смотря на наличие более простых методов достижения той же цели, этот пример наглядно демонстрирует процесс перенаправления ввода-вывода, другими словами с помощью оператора | была создана так называемая pipe, которая и дала название этому механизму. Пример, демонстрирующий перенаправление в файл будет столь же элементарным, хотя может быть с первого взгляда покажется &quot;пострашнее&quot;:</p>
<pre lang="bash">
cat readme.txt | grep unix > readme.txt
</pre>
<p>Этот пример должен был бы удалить из файла все строки, где нет слова &quot;unix&quot;. <em>Маленькое замечание:</em> при использовании такого перенаправления, перед началом передачи данных файл обнуляется. В этом и заключается ошибка данного примера: файл очищается до того, как поток данных успел пройти через фильтрацию <strong>grep</strong>, что приводит к просто очистке файла. Если же Вам все же нужен отфильтрованный список строк &#8212; стоит разместить в другом файле (которым можно было бы подменить исходный при необходимости), просто поменяв его название:</p>
<pre lang="bash">
cat readme.txt | grep unix > meread.txt
</pre>
<p>Если же Вы хотите избежать очищения файла, в который производится запись, необходимо написать символ &gt; дважды, тогда новые данные припишутся в конец:</p>
<pre lang="bash">
cat readme.txt | grep unix >> readme.txt</pre>
<p>В unix-like системах есть еще одна интересная особенность, косвенно связанная с этим механизмом: <em>все устройства являются файлами</em> и соответственно, прикреплены к файловой системе, для них выделена отдельная директория, по традиции называемая /dev. Работа с ними также ведется на тех же правах что и с обычными файлами, например набрав в консоли:</p>
<pre lang="bash">
cat readme.txt > /dev/dsp</pre>
<p>в ответ от компьютера Вы услышите некоторый звук, издаваемый из колонок или наушников.</p>
<h4>Подводим итоги</h4>
<p>С точки зрения простого пользователя использование opensource решений, построенных на базе философии unix, является как минимум нетривиальной задачей &#8212; ведь от него требуется как минимум понимание насколько мощная и гибкая система попала ему/ей в руки.  Отсутствие единственного верного способа решения той или иной задачи ставит большинство людей попросту в тупик, у них начинают разбегаться глаза от десятков тысяч программ, доступа к которым есть у всех пользователей unix-like операционных систем, с помощью набора простой волшебной команды в консоли, состоящей не более чем из трех-четырех слов.</p>
<p>Но если пользователь находит в себе силы понять что за зверь попал ему в руки, он сможет превратить любой компьютер в универсальное устройство по решению любых задач именно тем способом, который удобен <em>пользователю</em>, а не который навязали ему <em>производители</em> <abbr title="Платное программное обеспечение с закрытым кодом">проприетарного</abbr> програмного обеспечения.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/unix-way/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

