<?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>bOntONweb &#187; PHP, SQL</title>
	<atom:link href="http://www.bontonweb.com/category/programmirovanie/php-sql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bontonweb.com</link>
	<description>development</description>
	<lastBuildDate>Thu, 28 Oct 2010 18:45:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>История построения одного веб-портала.</title>
		<link>http://www.bontonweb.com/programmirovanie/istoriya-postroeniya-odnogo-veb-portala.html</link>
		<comments>http://www.bontonweb.com/programmirovanie/istoriya-postroeniya-odnogo-veb-portala.html#comments</comments>
		<pubDate>Sat, 13 Sep 2008 20:10:36 +0000</pubDate>
		<dc:creator>desss</dc:creator>
				<category><![CDATA[PHP, SQL]]></category>
		<category><![CDATA[PROграммирование]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[портал]]></category>

		<guid isPermaLink="false">http://www.bontonweb.com/programmirovanie/istoriya-postroeniya-odnogo-veb-portala.html</guid>
		<description><![CDATA[История построения одного веб-портала. Дмитрий Супруненко (abolabo_at_gmail.com) &#160; &#160; Постовой: Реалити-шоу о домашнем интернет-бизнесе партнерские программы по кликам Качественный контент для сайтов Интернет магазин офисной мебели centeroffice.ru. Предисловие. В последнее время трудно найти крупную компанию, которая не мечтала бы иметь свой корпоративный веб-портал. Сначала какой-нибудь отдел сделает свой сайт, потом другой отдел сделает свой, и [...]]]></description>
			<content:encoded><![CDATA[<p><meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title> 	 	<meta name="GENERATOR" content="OpenOffice.org 2.4  (Linux)" /></p>
<style type="text/css"> 	<!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--> 	</style>
<p style="margin-bottom: 0cm" align="center"><font size="5">История построения одного веб-портала.</font></p>
<p style="margin-bottom: 0cm" align="right"><font size="2">Дмитрий Супруненко (abolabo_at_gmail.com)</font></p>
<p style="margin-bottom: 0cm" align="center">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p>Постовой:<br />
<a href='http://bobrishka.ru'>Реалити-шоу о домашнем интернет-бизнесе</a><br />
<a href="http://2uz.info/">партнерские программы по кликам</a><br />
Качественный <a href='http://www.textbroker.ru'>контент для сайтов</a><br />
<a href='http://centeroffice.ru/'>Интернет магазин офисной мебели centeroffice.ru.</a></p>
<p style="margin-bottom: 0cm" align="center">Предисловие.</p>
<p style="margin-bottom: 0cm">В последнее время трудно найти крупную компанию, которая не мечтала бы иметь свой корпоративный веб-портал. Сначала какой-нибудь отдел сделает свой сайт, потом другой отдел сделает свой, и потом еще один и на каждом сайте свой пароль и попробуй это все запомнить, не то чтобы разобраться что да как. И вот тогда возникает потребность объединить все сайты в один портал. Но как сделать, если они разнесены физически, и даже не находятся в одной сети и связаны посредством интернет? Далее речь пойдет как раз о таком случае, веб-портал с горизонтальным масштабированием (через добавление серверов).</p>
<p style="margin-bottom: 0cm"> Как оно в жизни часто бывает, техническое задание в письменном виде мне предоставлено не было. Было распоряжение начальника о создании пока одного веб-сайта, точнее обновления (как потом оказалось правильнее было бы его все-таки переписать). Вобщем как всегда:)</p>
<p style="margin-bottom: 0cm">В результате всего этого процесса выяснилось, что существует сайт, который является официальным сайтом предприятия и доступный из интернет, а также еще один, сугубо внутренний ресурс доступный только из корпоративной сети. Итого целая куча всяких сайтов, в которых я, будучи недавно принятым на работу, никогда бы не разобрался:).</p>
<p style="margin-bottom: 0cm">Также мне было показан приказ о создании на предприятии веб-портала, который подразумевал единую базу пользователей для всех веб-ресурсов предприятия. <span id="more-172"></span>Стоит сразу читателю прояснить ситуацию с подчинением. Я работаю в отделе, который разрабатывает программы для технологической части бизнес-процесса предприятия, и этот отдел территориально удален от офиса (хвала Господу! <img src='http://www.bontonweb.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ), в котором есть свой отдел ИТ. Вот как раз он разработал  и внедрил официальный и внутрикорпоративный сайты предприятия. Мои же сайты находятся на физически разнесенных веб-серверах службы, в состав которой входит отдел, где я  работаю.</p>
<p><a href="http://blogun.ru/?r=14612"><img src="http://blogun.ru/advert/080426-blogun-468x60.gif" height="60" width="468" /></a></p>
<p style="margin-bottom: 0cm" align="left"> <strong>Что мы имеем.</strong></p>
<p style="margin-bottom: 0cm">Итак, мы имеем один центральный сайт и множество региональных, каждый со своей административной консолью. Каждый сайт предприятия имеет как минимум два окошка для доступа, белый ip-адрес, для доступа из  интернет, и внутренний для доступа из корпоративной сети, центральный DNS-сервер для интернета, реплики его для региональных сетей.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm"><strong>Что требуется и технические условия для этого.</strong></p>
<p style="margin-bottom: 0cm">Требуется объединить базы пользователей всех сайтов с присвоением единого идентификатора каждому пользователю и сделать так, чтобы при путешествии по сайтам предприятия пользователю не надо было каждый раз проходить аутентификацию.</p>
<p style="margin-bottom: 0cm">Ограничения:</p>
<ul>
<li>
<p style="margin-bottom: 0cm">Регистрация 	и изменение профиля пользователя должна 	происходить только на центральном 	сайте.</p>
</li>
<li>
<p style="margin-bottom: 0cm">Доступ 	ко всем сайтам портала должен быть 	децентрализованным. При падении центрального сайта, с 	которого производится аутентификация, 	должен быть альтернативный вход с 	использованием базы пользователей 	регионального сайта для повышения доступности сервиса.</p>
</li>
<li>
<p style="margin-bottom: 0cm">Должны 	использоваться только 80 и 443 порты. 	Данное условие навязано суровой 	реальностью (если сервер стоит где-нибудь 	в конторе, у которой арендуется помещение со их сисадминами, то там, как правило, открываются только 80й 	и 443й порты для работы в интернет арендаторам и добиться открытия 	какого-нибудь еще порта, например для 	репликации базы данных, не представляется 	возможным).</p>
</li>
<li>
<p style="margin-bottom: 0cm">Раздача 	прав доступа не должна производится 	одним кликом. Так как сайты все разные, 	с разным функционалом и своими 	особенностями, то и настройка доступа 	должна быть более тонкая для каждого, 	отдельно взятого пользователя.</p>
</li>
</ul>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p><a href="http://www.setlinks.ru/?pid=25896" target="_blank"><img src="http://static.setlinks.ru/partners/500_45/1.gif" border="0" /></a></p>
<p style="margin-bottom: 0cm"><strong>Как делалось и что получилось.</strong></p>
<p style="margin-bottom: 0cm">Начнем с базы пользователей. На совещании двух отделов по ИТ было принято решение хранить общую базу пользователей на центральном сервере, а на региональных только тех, кто имеет доступ к ресурсу. Стоит напомнить, что права доступа на центральном сайте даются исключительно на ресурс, а права доступа к тем или иным страницам выставляются на каждом сайте отдельно для каждой группы пользователей. Это было сделано по причине разнообразия предоставляемых информационных услуг и невозможности выставить права пользователю одним кликом. Ну, например, мне на сайте нужно пользователя привязать к полю своей таблицы, чтобы он получал ограниченную информацию. Делать привязку идентификатора пользователя к свой таблице через написание отдельной админки не представляется возможным, так как мне надо будет либо перетягивать таблицу на сервер, где стоит админка портала, либо разрешать доступ непосредственно к своей базе, что запрещено техническими условиями(см. выше про открытые порты).</p>
<p style="margin-bottom: 0cm"> Добавление, удаление и изменение данных пользователей происходит по инициативе центрального сервера. Каждый час срабатывает скрипт, который в цикле обходит все сайты. Каждый проход цикла это:</p>
<ul>
<li>
<p style="margin-bottom: 0cm">выборка списка 	пользователей, что сейчас имеют доступ 	к  сайту.</p>
</li>
<li>
<p style="margin-bottom: 0cm">проверка на добавленных 	вручную юзеров(на случай срочного 	предоставления прав доступа. Админ 	регионального сайта может добавить 	юзера со специально сформированным 	идентификатором). Если такие пользователи 	есть, они импортируются в центральную 	базу с присвоением нового идентификатора, 	ну и, соответственно, заменяется ид на 	удаленном ресурсе на новый, уже, так 	сказать, окончательный.</p>
</li>
<li>
<p style="margin-bottom: 0cm">добавление в базу 	тех пользователей, которым недавно 	были даны права на сайт.</p>
</li>
<li>
<p style="margin-bottom: 0cm">удаление тех, у 	которых право доступа отняли. После 	удаления из списка пользователей сайта 	эти пользователи теряют все права 	доступа к страницам. Если с центрального 	сайта кого-то из них опять добавят, он 	будет иметь гостевой уровень доступа. 	Для блокировки доступа ко всем веб-сайтам 	используем поле expired в таблице 	пользователей. В таблице перевязки 	пользователя с группой пользователей 	 регионального сайта также есть поле 	expired, которое случит для блокировки 	доступа пользователя на конкретном 	региональном веб-сайте, а не во всем 	веб-портале.</p>
</li>
<li>
<p style="margin-bottom: 0cm">обновление данных 	пользователя (например, пароль), 	основываясь на поле последнего изменения 	строки в таблице пользователей.</p>
</li>
</ul>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">Чего мы добились подобной схемой? Ответ прост — повышения доступности сайтов. Если бы мы сделали вход на сайт только через центральный сервер, то сильно бы зависели от провайдеров, к которым подключен центральный сайт. В случае, когда центральный сайт не отвечает, мы просто набираем нужный нам адрес в адресной строке броузера и входим на сайт, так сказать, локально, опираясь на список пользователей регионального сервера. Если же мы пытаемся зайти на сайт при работающем центральном сервере, то региональный сервер проверит его доступность и перенаправит пользователя для последующего входа.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm" align="left">Так как все сайты находятся в домене, например yourdomain.com, то в php.ini каждого из веб-серверов прописываем параметр session_cookie_domain = . yourdomain.com. Теперь все куки, выставленные на любом из сайтов будут видны другим сайтам этого домена. Сделано это для того, чтобы идентификатор сессии не менялся при переходе от сайта к сайту.</p>
<p style="margin-bottom: 0cm">Также выставляем время жизни сессии, например, в 15 минут, и записываем время устаревания этой сессии и ip-адрес в базу для каждого пользователя, чтобы избежать (хоть как-то) двойных входов под одним и тем же логином с разных мест.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">На центральном сервере создаем сайт, который будет принимать статистику от региональных чтобы знать какая сессия активна и какому пользователю она принадлежит. Назовем его statistic.yourdomain.com. Этот сайт нам будет также возвращать идентификатор пользователя по идентификатору сессии, когда происходит переход юзера от одного регионального сервера к другому. Естественно, не просто так, а по шифрованному каналу с уникальным ключом шифрации для каждого веб-сервера.</p>
<p style="margin-bottom: 0cm">Далее нужно внимательно изучить <a href="http://www.bontonweb.com/wp-content/uploads/2008/09/redirect_in_websystem.png" target="_blank">схему перенаправления</a>. Не смотря на свою сложность она позволяет пользователю записать в куки только идентификатор сессии и все. Все остальные действия производят сервера.</p>
<p style="margin-bottom: 0cm"> <a href="http://www.bontonweb.com/wp-content/uploads/2008/09/redirect_in_websystem.png" title="Схема перенаправления веб-портала(100кб)"><img src="http://www.bontonweb.com/wp-content/uploads/2008/09/redirect_in_websystem.thumbnail.png" alt="Схема перенаправления веб-портала(100кб)" /></a></p>
<p style="margin-bottom: 0cm"><strong>Послесловие</strong></p>
<p style="margin-bottom: 0cm">Данная статья не является всего лишь теорией, а описывает реально работающую схему. В нашем случае она работает на FreeBSD+apache+php+postgresql+mysql(на центральном сайте), но вполне пригодна и для других программых реализаций.</p>
<p style="margin-bottom: 0cm">Просьба все отзывы и замечания присылать на abolabo_at_gmail.com.</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
<p style="margin-bottom: 0cm">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bontonweb.com/programmirovanie/istoriya-postroeniya-odnogo-veb-portala.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

