Pull to refresh
  • by relevance
  • by date
  • by rating

Июльская нервотрёпка — VDS, SEO и один стартап

Lumber room
Успокоил чешущиеся по делу руки, купил VDS на firstvds.ru.
Как ни странно, матюгался всего три дня.
И вот почему=)

По сути надо было просто захостить один маленький клиентский сайтик. И я решил не теребить камрада, который оказывает мне поддержку по хостингу (чтоб он прописал ещё один сайтец), и попросту купить VDS для собственных мелких постоянных нужд — типа как захостить кого-то, perl-скрипт запустить, просто поэкспериментировать — ну вы понимаете.

Зарегистрировал, выбрал план VDS-Разгон (400 мгц и 96 RAM), — резонно подумав, что должно хватить, что у меня всего лишь один вордпресс-сайт, а остальные — статика или мелкие скриптики.

Оплатил даже — на полгода 1500 рублей. Перенёс сайты. И уже через час после того как сайты заработали на новом сервере, матюгаясь, бежал менять план на VDS-отрыв, где дают 600 мгц и 160 оперативки, но уже за 600 рублей в месяц.

Посмотрел в top, увидел, что даже 600 мгц не справляются с вордпрессом, плюнул, пошёл настраивать nginx — благо он там прям из панельки и ставится. Поставил, поднастроил апач, поднастроил nginx, плюнул, поставил eAccelerator, поднастроил, — вроде пошустрее — но всё равно — крутится вордпресс как больной слон — особенно если людей туда понабежит. Да и грузится долго.

Чтож поделать, — остаётся только или докупать память (что крайне не хочется делать, потому что отпуск на носу), или перетаскивать вордпресс обратно, на камрадовский хостинг. Есть, конечно, вариант, — оптимизировать сам wordpress, — долго. Ну, или написать свой нормальный плагин кеширования, — ни один из тех, что просмотрел — работать не хотел.

Помимо всего прочего уже давно было поменять на блоге урлы — из идиотских archives/id_статьи на человекочитаемые — /eto_nazvanie_posta

Теперь ждать нового апдейта Яндекса — поднастроил редиректы, но уверен что всё равно будут косяки и сейп мне не гонять еще месяца два точно.

Зато наконец-то нашёл силы настроить SVN+Trac и начать писать свой маленький робо-стартап, основной целью которого будет создание уникальных RSS-лент и нормальная поддержка чтения этих лент с маббил и прочих маленьких девайсиков.

Если кому-то будет надо — могу потом написать статью — что-нибудь типа — «как поднять Apache2.2+PHP5+eAccelerator+Nginx+SVN+Trac так, чтобы это всё не рухнуло». Сомневаюсь, что будет профессионально — ставил-то бОльшую часть в первый раз — раньше всё хостеры делали как-никак=)
Total votes 19: ↑12 and ↓7 +5
Views 383
Comments 35

PHP: Уменьшаем исходящий трафик (или изобретаем очередной велосипед)

Lumber room
В связи с разработкой мобильной версии сайта столкнулся с проблемой — передается много данных, как следствие на мобильном телефоне тратится много денег, было решено написать несколько функций предназначенных для уменьшения передаваемых данных
Читать дальше →
Total votes 1: ↑5.5 and ↓-4.5 +10
Views 524
Comments 27

Интеграция со службами каталогов при разработке корпоративных порталов на платформе LAMP

Lumber room

Решаемая бизнес-задача / сфера применения


Веб-разработчики с завидной регулярностью получают заказы на создание корпоративных порталов. Под порталами в данном случае понимаются внутренние сайты предприятий, предоставляющие информацию и сервисы для собственных сотрудников и наиболее близких партнёров.

Подавляющее большинство крупных предприятий уже активно использует единую авторизацию на основе служб каталогов, доступ к которым осуществляется по Lightweight Directory Access Protocol (LDAP).

Совершенно естественно, что заказчики заинтересованы в интеграции разрабатываемого портала со службами каталогов, а разработчикам выгодно использовать внешнюю систему авторизации с точки зрения сокращения объёма работ в проекте. И хотя в ряд коробочных продуктов класса «Система управления информацией» встроена интеграция со службами каталогов, разработчикам, тем не менее, приходится решать различные технические и организационные вопросы.

Краткое описание проекта


Проект, который реализовывала наша компания в начале 2008 года, представляет собой функционально насыщенный корпоративный информационный портал холдинга, включающего в себя несколько территориально распределенных компаний. Подразделения холдинга большей частью объединены службой каталогов Microsoft Active Directory (AD).

Платформа для реализации проекта: Linux, Apache, PHP, MySQL, Cetera CMS

Основные причины использования авторизации на основе AD в данном проекте:
  • Обеспечение единого центра управления пользователями (собственно, AD) для системных администраторов компании.
  • Упрощение доступа к порталу сотрудников компании, для которых необходимость ввода лишнего пароля могла стать критической для начала использования портала.
  • Большое количество сотрудников компании (несколько тысяч человек), что делает практически невозможным ввод перечня сотрудников в БД портала и распределение персонала по дереву компаний и отделов и телефонному справочнику, реализованному в рамках портала.

Используемые технологии


Две основные задачи — импорт данных из AD и дальнейшая авторизация пользователей, просматривающих страницы портала.
Импорт данных из AD осуществляется через LDAP. LDAP позволяет получить доступ к информации домена — списку пользователей, групп, компьютеров домена и т.д.
Авторизация пользователя производится средствами Apache, а точнее его модуля mod_ntlm (доступен для версий Apache 1.3.х, для 2.2.х используется модуль mod_auth_sspi). Mod_ntlm авторизует пользователя на этапе обращения к странице, и, если пользователь проходит авторизацию, его данные (имена домена и пользователя) передаются в переменных сервера (для PHP это $_SERVER)

Описание полей AD


В рамках данного проекта требовалось получить следующую информацию о пользователе из AD:
  • полное имя (фамилия, имя, отчество)
  • доменное имя
  • email
  • должность
  • принадлежность к компании/отделу (относительно корпоративной структуры заказчика)

Имя пользователя в домене (его логин) хранится в поле SAMAccountName. Title, Department и Company описывают должность, отдел и компанию. Email хранится в поле Mail, полное имя пользователя содержится в поле Name.

Импорт сотрудников


Всякая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ. Distinguished Name). Имя может выглядеть, например, следующим
образом:
«cn=Иван Петров, ou=Сотрудники, dc=example, dc=com».

Уникальное имя состоит из одного или нескольких относительных уникальных имен (RDN — англ. Relative Distinguished Name), разделённых запятой. Относительное уникальное имя имеет вид ИмяАтрибута=значение. На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами. В силу такой структуры имени записи в каталоге LDAP можно легко представить в виде дерева.
Для выполнения поиска по структуре службы каталога требуется указать путь к корневому элементу, относительно которого будет осуществлен поиск. Также можно указать фильтр, состоящий из перечисления имен атрибутов записи и их значений в формате ИмяАтрибута=Значение.
Предположим, что требуется осуществить импорт сотрудников домена COMPANY.RU. Для этого путь поиска будет, например, такой:
cn=Users, dc=COMPANY, dc=RU

cn=Users указывает на т.н. контейнер под название Users.
При выполнении такого поиска без дополнительной фильтрации в результатах могут присутствовать другие элементы помимо самих пользователей. Например, данные о группах. Для получения в результатах поиска лишь данных о пользователях укажем фильтр:
ObjectCategory=Person.

В некоторых случаях пользователи в AD могут размещаться в т.н. Organizational Units. В таком случае используем путь поиска:
ou=Users-and-computers, dc=COMPANY, dc=RU.

Такой путь подразумевает, что данные об учетных записях находятся в Organizational Unit под названием Users-and-computers.
В процессе импорта может возникнуть потребность определения активности учетной записи пользователя. При импорте может быть интересен атрибут учетной записи UserAccountControl, в котором сохраняются в двоичном виде различные свойства учетной записи. Интересным может быть признак ACCOUNTDISABLE (0x0002). Если данный флаг установлен в атрибуте UserAccountControl, учетная запись считается заблокированной.
Для поиска всех активных пользователей потребуется модифицировать фильтр. Он будет таким:
(&(objectcategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.804:=2)))

1.2.840.113556.1.4.804 — т.н. OID (Object IDentifier), данный OID применяется для отбора объектов, выбранный атрибут которых содержит либо все, либо любой из указанных в фильтре битов. Приведенный выше OID признает совпадение, если в атрибуте присутствует любой из указанных битов. 2 — это значение флага ACCOUNTDISABLE. Данный фильтр целиком можно расшифровать так: Атрибут objectcategory равен Person и в атрибуте UserAccountControl не присутствует бит 2 (0x0002)

Пример кода на PHP
<?
/**
* Данный код подключается к AD и получает список всех незаблокированных сотрудников
* контейнера Users из домена СOMPANY.RU
* Выводится имя сотрудника, его email, компания, отдел и должность в соответствии с данными,
* полученными из AD
*/
$ds=ldap_connect("1.2.3.4");
if ($ds) {
$r=ldap_bind($ds,'COMPANY\\admin','adminPassword');
$sr=ldap_search($ds,
"cn=Users, dc=COMPANY, dc=RU",
'(&(objectcategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.804:=2)))');

echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "
";

$info = ldap_get_entries($ds, $sr);
// $info содержит результаты запроса...

for ($i=0; $i<$info["count"]; $i++) {
echo "Name: {$info[$i]['name'][0]}
\n";
echo "Email: {$info[$i]['mail'][0]}
\n";
echo "Company: {$info[$i]['company'][0]}
\n";
echo "Department: {$info[$i]['department'][0]}
\n";
echo "Title: {$info[$i]['title'][0]}
\n";
}

ldap_close($ds);

} else {
echo "Unable to connect to LDAP server";
}
?>

Дополнительная информация по работе с LDAP в PHP может быть получена в документации

Проблемы и решения


Отсутствие в службе каталогов информации о сотрудниках, достаточной для отображения на портале (полные имена, адреса Email, названия подразделений, хобби, поля корпоративной социальной сети и т.д.).


Почти всегда в службе каталогов не содержится вся информация, необходимая для работы портала. Могут отсутствовать как «банальные» данные, например, номер телефона, так и нетипичные для службы каталогов сведения типа «перечень мест предыдущей работы для нужд корпоративной социальной сети». При этом необходимость этих данных для портала сложно недооценивать.

Нашим решением проблемы является хранение учётных записей в службе каталогов, а расширенной информации — в открытой БД портала. Предполагается, что управление списком и ролями пользователей осуществляется в службе каталогов, а всё остальное — задачи портала.

Недостатком решения является необходимость связывания и синхронизации перечней пользователей в службе каталогов и в БД портала.

Важнейшие преимущества:
  • предоставление пользователям возможности самостоятельно дополнять информацию о себе в БД портала с последующей модерируемой загрузкой этих сведений в службу каталогов;
  • возможность быстро настраивать набор полей в профиле пользователя портала без влияния на работу службы каталогов.

Отсутствие в службе каталогов достоверной информации о принадлежности сотрудника к той или иной компании холдинга или отделу


Стандартом де-факто для корпоративных порталов является отображение дерева компаний холдинга и отделов с автоматической привязкой к дереву сотрудников. При этом часто в службе каталогов сотрудники хранятся единым плоским списком с указанием компаний и отделов в каких-либо свойствах пользователей службы каталогов.

Наше решение:
  1. Завести дерево компаний и отделов на портале средствами системы управления контентом, используя данные об организационной структуре, предоставленные заказчиком.
  2. Импортировать сотрудников из службы каталогов со сверкой названий элементов дерева, заведенного в БД портала, с содержимым карточек пользователей службы каталогов.
  3. Пользователей, для которых определить положение в дереве не удалось, импортировать во временную директорию.
  4. По итогам импорта отображать протокол с нотификацией администраторов портала и службы каталогов о недостатках импорта и некачественных записях в службе каталогов.
Rating 0
Views 903
Comments 6

Джимми Уэльс: «Знание – людям»

Lumber room
Translation
Джимми УэльсЕго заваливают предложениями, люди оборачиваются ему вслед, журналисты следят за каждым его движением: у Джимми «Джимбо» Уэльса есть все атрибуты знаменитости, хотя на самом деле он вовсе не суперзвезда. Он – основатель Википедии, онлайновой энциклопедии, которую каждый день используют миллионы человек по всему миру. В штате Википедии – всего пять сотрудников, а число написанных пользователями статей превысило 1,5 млн. В борьбе против вандалов, «троллей» и других «плохих мальчиков» помогают 400 волонтёров.

Имела ли Википедия чётко выстроенную концепцию с момента её появления?

Нет, вовсе нет. Я наблюдал за ростом «open-source движения», использовавшим свободное лицензирование в качестве «социальной модели», и постепенно осознал, что программисты могли бы работать совместно не только над программами. Появилась отличная возможность для совместного редактирования, так что в 2000 году я начал с того, что создал проект Nupedia.

Читать дальше →
Total votes 25: ↑25 and ↓0 +25
Views 308
Comments 7

Основы.htaccess на примерах

Website development *
Translation
В данной статье приведены реальные примеры кода, который автор использует, разрабатывая сайты для своих клиентов. Уровень — чуть выше начального. Предлагаю вашему вниманию выдержки из статьи. Возможны неточности в переводе, если поправите — буду признательна. Если кому-то поможет — буду рада.
Total votes 28: ↑17 and ↓11 +6
Views 73K
Comments 29

Практический CSS/JS: архивируем все!

Client optimization *
Translation
Примечание: ниже частичный перевод статьи «Compress JavaScript and CSS without touching your application code», в которой описывается статичное сжатие CSS- и JS-файлов на сервере и корректная выдача их затем клиенту. Далее даны мои комментарии с более комплексным решением. Приношу извинения, если для кого-то тема будет слишком знакома или неинтересна: в Рунете нормальной статьи на данную конкретную тематику обнаружить не удалось.

Для обеспечения корректного архивирования вашего веб-контента, по-видимому, наиболее общий подход будет заключаться в выполнении по порядку следующих пунктов:

  • Проверить, умеет ли клиент принимать файлы в формате gzip-encoded.
  • Обеспечить соответствующий вывод на стороне сервера через gzip-функции, либо уповать на то, что всем этим займется непосредственно Apache.
  • Поиграться с .htaccess, чтобы обеспечить корректный content type.


читать дальше на webo.in →
Total votes 38: ↑36 and ↓2 +34
Views 2.4K
Comments 68

Caucho Resin — сервер приложений Java/PHP

Java *
Для приложений Java, я имею ввиду, веб-приложений, существует уже достаточное количество серверов, которые уже давно разрабатываются и давно вышли на уровень, достаточный для того, чтобы применять их в самых сложных и ответственных случаях. Думаю, всем знают Apache Tomcat и Jetty — самые известные сервера из списка открытых разработок. Но к этому списку нужно добавить теперь еще и Caucho Resin. В ряде тестов его Pro версия превосходит в производительности Tomcat 6, обладая при этом рядом возможностей «из коробки», которых нет в других серверах или они реализуются при помощи сторонних средств.

И так, Resin — высокопроизводительный HTTP и сервер приложений для Java/PHP приложений, с возможностью масштабироваться и кластеризироваться в начальной конфигурации. Кстати, именно в этом состоит различие между обычной, open-source версией и Pro. В этой версии есть функции автоматического детектирования остановившихся или зависших сессий и рестарта сервера, а также средства мониторинга состояния JVM и потребления памяти. Кластеризация позволяет распределить нагрузку на несколько серверов, при этом сессии будут привязаны к конкретному серверу и мигрируют в фоновом режиме при крахе обслуживающей его ноды. Об этом стоит как то поговорить отдельно, возможно, в отдельной статье — я собираюсь плотно занятся изучением этого сервера и его возможностей, а результат буду публиковать в виде статей.
Читать дальше →
Total votes 11: ↑8 and ↓3 +5
Views 5.8K
Comments 8

Elastic Server On-Demand — мне один виртуальный сервер, два приложения и пиво, пожалуйста!

Website development *
Наша аудитория достаточно профессиональная, чтобы я с самого начала материала стал убеждать вас в пользе и полезности виртуализации. Это сейчас тренд номер один (ну, или, по крайней мере, один из основных) в мире ИТ и это не просто дань моде, а реальная и обоснованная потребность рынка. А теперь вспомните последний раз, когда вы развёртывали виртуализированную инфраструктуру. Например, мой опыт в этом достаточно большой (хотя и односторонний) — я просто люблю иногда тестировать различные ОС и специфические конфигурации приложений, поэтому мне часто приходится развёртывать один или несколько виртуальных серверов. Вот из последних — очень хотел JeOS поставить, специальный дистрибутив Ubuntu, ориентированный на виртуальные среды, однако он никак не хотел даже запускаться после установки. А уж сколько было случаев, когда были сложности с установкой тех или иных программ, обновлений, несовместимости конфигураций — это вообще отдельный разговор. А оказалось, и для этого есть решения. Простое и оригинальное — веб-сервис в стиле web 2.0 (да-да, именно так) для создания и распространения виртуальных серверов, их образов. И так, рассмотрим Elastic Server On-Demand от Cohesive FT.

Читать дальше →
Total votes 27: ↑25 and ↓2 +23
Views 1.5K
Comments 7

Автоматизация разработки web проектов в среде UNIX

Project management *
С какого боку не посмотри, а процесс автоматизации всегда важен. Компаниям он помогает экономить уйму времени-денег, администраторов избавляет от рутины, а людей не посвящённых в детали чужой работы от головной боли.
Я хочу поделиться своим решением по задаче частичной оптимизации и снижения производственных издержек. Мне пришлось написать данный bash скрипт по причинам, которые были озвучены выше. Есть ещё причина,
Хочу сразу предупредить непосвящённых о том, что конфигурация Apache, MySQL может отличаться от приведённой ниже( а так скорее всего и будет). Будьте внимательнее в корректировке путей, когда решите адаптировать этот скрипт под свои цели.

Читать дальше →
Total votes 28: ↑15 and ↓13 +2
Views 786
Comments 17

Анализатор логов PHP-на-Apache

PHP *
Решил написать об одной полезной утилите, которую написал в августе и уже два месяца успешно использую.
Утилита сводит к минимуму усилия по слежению за логами ошибок PHP.
Читать дальше →
Total votes 15: ↑10 and ↓5 +5
Views 12K
Comments 22

Определяем нагрузку на сервер Apache

Lumber room
image

Как получить данные о работе web сервера Apache и представить их в удобном для анализа виде.?

Начнём с получения данных.

Для того этого, необходимо подключить модуль mod_status. Он отслеживает работу сервера и показывает данные в виде обычной html страницы. С его помощью можно узнать:

Читать дальше →
Total votes 21: ↑17 and ↓4 +13
Views 3.6K
Comments 7

Пошаговая установка TRAC на FreeBSD для начинающих

Lumber room

The Trac project


Я не буду описывать ее возможности и для чего эта система нужна, все есть на офф. сайте (http://trac.edgewall.org) или в википедии.
Рассмотрю только установку и настройку детально для новичков (статья посвящена другу Энверу из Рязани, может еще кому пригодиться), тому кто уже с этим сталкивался пользы эта статья не принесет.

Связка FreeBSD + SVN + Apache2 + Trac


Для новичков подробнее о связке и способе работы

Все исходники разрабатываемого ПО лежат в SVN (удобно видеть все изменения и всегда легко сделать откат, если надо).
Trac — система, предоставляющая возможность интерактивной работы прежде всего с svn репозиторием, а так же вики (не считая доп. модулей).
Читать дальше →
Total votes 7: ↑5 and ↓2 +3
Views 713
Comments 4

Краткий обзор MQ (Messages queue) для применения в проектах на РНР. Часть 2

High performance *
Мы продолжаем исследовать тему такого класса ПО как очереди сообщений применительно к РНР веб-системам. В прошлой статье мы рассмотрели некоторое ПО, в частности представителей как самой верхней области (Apache Active MQ, возможности которого находятся на уровне уже корпоративного ПО), так и достаточно простые варианты, например, MQS. Но не рассмотренными остались еще несколько достаточно интересных проектов, так что наше исследование продолжается.
Читать дальше →
Total votes 25: ↑22 and ↓3 +19
Views 6.8K
Comments 6

Сервер дома — AMD, Debian x64, Bind9, Apache 2, PHP5, MySQL5, Trac, Subversion и море удовольствия

Lumber room
Шило в известном месте всё никак не даёт мне покоя.
И решил я поэкспериментировать с установкой сервера дома.

Итак, дано:

1. Домашний интернет с внешним ip на роутере, канал туда/обратно — 8 мбит, провайдер — QWERTY *
2. Бюджет не больше 10 тысяч рублей — чем меньше, тем лучше. **
3. Жгучее желание экспериментов и чего-нибудь эдакого ***

* К сожалению, мой дом не подключает Корбина, у которой более широкие каналы. Приходится довольствоваться тем, что есть
** Получилось путём более-менее реального подсчёта стоимости комплектующих на среднестатический компьютер
*** Для тех, кто хмыкнет и скажет — «эка невидаль, я такое регулярно делаю» — я не так часто что-то настраиваю, больше пишу под уже настроенное, и для меня это чистой воды развлечение — что-то сделать своими руками=)

Ну, все процедуры тут, под катом.

Сразу хочу сказать, что у меня это работает — так, как есть. Дополнительно с бубном я не плясал — но тут вытяжки из моих гуглений и мануалокурений.

Вероятно, что-то можно настроить более гибко или качественно, и я крайне буду рад советам или решениям=)


Читать дальше →
Total votes 44: ↑38 and ↓6 +32
Views 4.1K
Comments 66

Три первых шага к оптимизации LAMP

Website development *
Бытует мнение, что связка LAMP (Linux+Apache+Mysql+PHP) не требует особой настройки и работает «из коробки». Это далеко не так. После того, как я долго убеждал товарища установить кеширующий акселератор PHP xcache, я решил провести небольшой эксперимент и попробовать выключить xcache на своём виртуальном сервере, находящемся под небольшой нагрузкой (около хита в секунду). В реальной жизни нагрузка на процессор мала, а вот память загружена сильно, т.к. её немного (256МБайт).

Результаты эксперимента превзошли все ожидания.
Читать дальше →
Total votes 82: ↑66 and ↓16 +50
Views 5.1K
Comments 84

Происхождение названий некоторых команд Unix

*nix *
Знание истории происхождения вещей и их названий, будь то простой карандаш, автомобиль или команда операционной системы, делает их повседневное использование намного интереснее. В этой заметке я постарался разобраться в причинах странного, казалось бы, наименования некоторых программ, используемых в операционной системе Unix и её родственниках: *BSD, Solaris, HP-UX, Linux и т.д.

Перепечатка моей статьи, написанной, в свою очередь, по мотивам страницы What does {some strange unix command name} stand for?

Читать дальше →
Total votes 112: ↑107 and ↓5 +102
Views 6.8K
Comments 37

Уголок Java-разработчика: библиотеки на каждый день

Lumber room
За все время, проведенное в написании кода на Java, у меня сформировался определенный набор полезных cторонних библиотек, которые прочно засели в classpath, и без которых не обходится ни один день разработки, будь то написание чего-либо «на коленке» или работа над серьезным проектом. Речь идет не о «монстрах» вроде Spring, Struts, Hibernate (это другая история), а скорее об утилитах, которые заполняют пробелы в Java SE API и позволяют сэкономить десяток-другой лишних строк кода/минут тут и там. Этой информацией я бы и хотел поделиться с хабрасообществом — надеюсь, она пригодится особенно тем, кто только начинает штурмовать Java, и позволит немного, но увеличить производительность труда.

Итак, список наиболее часто используемых мной классов и методов с комментариями:
Читать дальше →
Total votes 28: ↑28 and ↓0 +28
Views 3.4K
Comments 3