воскресенье, 8 ноября 2015 г.

Master-Slave WAL-репликация PostgreSQL на Rhel/Centos 6.5


Master-сервер: 192.168.100.122
Hostname: server2.domain.com

Slave-сервер: 192.168.100.175
Hostname: server1.domain.com

Postgresql Version: 9.4.1
Linux version: CentOS 6.5

Шаг 1 (оба сервера). Скачивание и установка репозитория

#yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-2.noarch.rpm
После выполнения должен появиться файл /etc/yum.repos.d/pgdg-94-centos.repo с включенным репозиторием. Если он не появился по каким-то причинам, то выполнить следующее:

# vi /etc/yum.repos.d/centos.repo
add the following lines
[centos-6-base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
enabled=1


Шаг 2 (оба сервера). Установка необходимых пакетов PostgreSQL.

Для начала можно попробовать установить пакет
# yum install postgresql94-server postgresql94-contrib

Если в процессе установки возникли ошибки связанные с публичными ключами, то их нужно исправить:

# cd /etc/pki/rpm-gpg# rpm --import RPM-GPG-KEY-CentOS-6
Затем можно приступить к установке минимального набора пакетов:
# yum install postgresql94 postgresql94-libs postgresql94-server

Следующее действие — инициализация базы банных.
# service postgresql-9.4 initdb
Включить при старте системы
# chkconfig postgresql-9.4 on

Шаг 3 (оба сервера). Запуск postgresql.

# service postgresql-9.4 start
Starting postgresql service: [ OK ]


Проверка состояния postgresql:
# service postgresql-9.4 status
postmaster (pid
ХХХХ) is running...

Шаг 4 (оба сервера). Подготовительные работы.

При установке PostgreSQL создает в системе пользователя "postgres" для того, чтобы можно было производить начальные операции с базами данных. Необходимо настроить доступ через ssh между серверами, чтобы упростить файловые операции.

Задать пароль пользователю postgres
# passwd postgres
Залогиниться в систему как пользователь postgres
# su - postgres

Сгенерировать ключи ssh для пользователя postgres (сделать на обоих серверах одинаково):

На master-server:
$ ssh-keygen -t rsa
$ ssh-keygen -t dsa
$ cd /var/lib/pgsql/.ssh
$ cat id_rsa.pub >>authorized_keys
$ cat id_dsa.pub >>authorized_keys


На slave-server:
$ ssh-keygen -t rsa
$ ssh-keygen -t dsa
$ cd /var/lib/pgsql/.ssh
$ cat id_rsa.pub >>authorized_keys
$ cat id_dsa.pub >>authorized_keys

Обмен ключами между серверами.
 
На master-server:
$ cd /var/lib/pgsql/.ssh
$ cp authorized_keys server2_authorized_keys
$ scp server2_authorized_keys postgres@server1:/var/lib/pgsql/.
ssh/.
$ rm -rf authorized_keys


На slave-server:
$ cd /var/lib/pgsql/.ssh
$ cat server2_authorized_keys >>authorized_keys
$ scp authorized_keys postgres@server2:/var/lib/pgsql/.
ssh/.

Теперь можно протестировать соединение между серверами выполнив простую команду с отдалённой стороны.
 
С master-сервера на slave-сервере
$ ssh server1 date

Со slave-сервера на master-сервере
$ ssh server2 date


Шаг 5. Настройка master-сервера

# su - postgres

Создание специального пользователя rep от имени которого будет проводиться репликация данных.
$ psql -c "CREATE USER rep REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'redhat';"

Нужно настроить
доступ к базе данных с других серверов, а также дать этому специальному пользователю доступ со slave-сервера к СУБД.

$ cd /var/lib/pgsql/9.4/data
$ vi pg_hba.conf
host replication rep 192.168.100.175/32 md5
:wq

Далее нужно отредактировать главный файл конфигурации:

$ vi postgresql.conf

Найдите указанные параметры, раскомментируйте, если нужно.

listen_addresses = 'localhost,192.168.100.122'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on

Сохранить и закрыть.

Перезапустите master-сервер, чтобы применить изменения в конфигурации.
# service postgresql-9.4 restart

Шаг 6. Настройка Slave-сервера.

Перед началом необходимо погасить базу данных на slave-сервере.

# service postgresql-9.4 stop

Далее нужно удалить файлы базы данных и импортировать данные с master-сервера. Предпочтительно не удалять каталог с данными, но, если позволяет место на диске, переименовать существующий /var/lib/pgsql/9.4/data.

$ cd /var/lib/pgsql/9.4/data
$ rm -rf *
$ pg_basebackup -D /var/lib/pgsql/9.4/data -h 192.168.100.122 -U rep


Через какое-то время должно быть сообщение об успешном завершении
NOTICE: pg_stop_backup complete, all required WAL segments have been archived

Теперь необходимо внести изменения в файлы конфигурации на slave-сервере:

$ cd /var/lib/pgsql/9.4/data

Нужно настроить доступ к базе данных с других серверов, а также с master-сервера на slave-сервер для репликации, при смене ролей. Для смены ролей в файл pg_hba.conf (но не в конец файла) добавить строки описывающие доступ.

$ vi pg_hba.conf
host replication rep 192.168.100.122/32 md5
:
wq

Далее внести изменения в главный файл конфигурации на slave-сервере.

$ vi postgresql.conf

Так как на slave-сервер скопирован файл конфигурации с master-сервера, то изменения нужно внести только в IP-адреса, к которым будет привязан сервис.

listen_addresses = 'localhost,192.168.100.175'
wal_level = 'hot_standby'
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 1
hot_standby = on
:
wq

Создание файла для восстановления recovery.conf на slave-сервере.

$ cd /var/lib/pgsql/9.4/data
$ vi recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=192.168.100.122 port=5432 user=rep password=redhat'
trigger_file = '/tmp/postgresql.trigger.5432'
:
wq

Теперь можно запустить PostgreSQL на slave-сервере.
# server postgresql-9.4 start

Тестирование репликации

На master-сервере:
$ su - postgres
$psql
#CREATE TABLE rep_test (test varchar(40));
INSERT INTO rep_test VALUES ('data one');
INSERT INTO rep_test VALUES ('some more words');
INSERT INTO rep_test VALUES ('lalala');
INSERT INTO rep_test VALUES ('hello there');
INSERT INTO rep_test VALUES ('blahblah');
\q


На slave-сервере можно произвести проверку наличия таблицы созданной на master-сервере
$ su - postgres
$psql
#SELECT * FROM rep_test;

      test    
-----------------
 data one
 some more words
 lalala
 hello there
 blahblah
(5 rows)


Теперь можно попробовать сделать вставку данных в таблицу на slave-сервере :
 
#INSERT INTO rep_test VALUES ('oops');
ERROR:  cannot execute INSERT in a read-only transaction

Ошибка связана с тем, что slave-сервер работает только в режиме для чтения. Это позволяет содержать базу данных в целостном состоянии.

пятница, 15 мая 2015 г.

Noname USB звуковая карта.

Досталась мне в руки и в вечное пользование неизвестное поделие китайский мастеров-самоучек под общим название USB-звуковуха. Поиск по интернетам опознал её как простой стерео цифро-аналоговый преобразователь (ЦАП). На входе USB type B, на выходе 3,5 мм стерео разъём и рукоятка громкости. Собрано довольно неплохо, как внешне, так и внутри.

"А внутре у неё неонка". Взаимодействие с USB обеспечивает микруха TI PCM2706, она по шине I2S передаёт сигнал на ЦАП Cirrus Logis CS4344 (говорят, что он простой, дешёвый, но используется в некоторых поделиях Cambridge Audio), полученный аналоговый сигнал усиливается двумя операционниками TDA1308 по одному на канал. Питание по USB.

Подключение в среде Windows прошло банально. Устройство определилось, автоматически были установлены системные драйверы. Звук появился. Заработали все используемые мной программы, включая Guitar Rig (надо было в настройках ASIO4ALL отключить неиспользуемую аналоговую встроенную в материнку звуковушку) и Rocksmith 2014.

По Linux (дистрибутив ALT Linux KDesktop 7) всё оказал сложнее. Системой устройство определилось криво. Всё из-за того, что те, кто программировал PCM2706 поленились вбить туда значения VID:PID и они остались в виде 0000:0000. Тем не менее, в миксере появилось какое-то  устройство, через которое звук пошёл. VLC и QMMP проблем не испытали.

Далее игры и приложение для работы с гитарой Rakarrack. В играх звука нет, в jackd - тоже. Полазив по конфигурации jackd, "покурив маны" и содержимое /proc/asound я догадался, что usb-звук в системе настроился как hw:2. Указав сие имя в качестве устройства вывода звука в jackd я получил звук гитары в наушниках. Осталось поиграться с настройками jackd  в части уменьшения задержек.

В играх звука по-прежнему нет. Наиболее вменяемые логи давала игра X3:Reunion. Эта игра использует как OpenAL так и ALSA для вывода звука. По логам было видно, что программа не может найти звуковое устройство. Перепробовал несколько вариантов настройки как ALSA так и OpenAL я упирался в то, что ищется устройство, которое должно быть дефолтным. Осталось последнее средство, которое в результате и заработало. А именно... нужно было поменять порядок инициализации звуковых устройств. В моём файле /etc/modprobe.d/alsa-modindex.conf  это выглядит как:


# китайскую поделку ставим как 0
options snd_usb_audio index=0

#usb-кабель Rocksmith для подключения гитары будет 1
options snd_usb_audio vid=0x12ba pid=0x00ff index=1


#встроенный в видеокарту(!) звук отключаем нафиг
blacklist snd-hda-intel

После перезапуска модулей ядра - (ура!) всё заработало с теми же самыми конфигами, которые были ДО подключения USB ЦАП.

Впечатления. Звук по субъективному восприятию хуже, чем выдавала моя старенькая Creative SB Live! 5.1, но намного лучше,  чем выдаёт встроенная в материнку AC97 с коей и сравниваю. Басы глубже, верхи резче, средние чище. В общем и целом впечатления приятные, буду пользоваться постоянно.

четверг, 8 января 2015 г.

Сербия. День пятый.

Сегодня последний день нашего пребывания в Белграде. Праздники закончились, и те зваетные места, куда мы хотели пойти открылись для посетителей.

Мы пошли в военно-исторический музей, который находится на территории крепости Калемегдан. Часть внешней экспозиции мы видели в первый день нашего посещения, теперь же мы прошли в сам музей и прогулялись по самой крепости.

Музей довольно большой, два этажа, залы небольшие, но их много. Представлены оружие, доспехи, униформа и прочие сопутствующие вещи. Охватывается период от III века до нашей эры до событий Сербско-Хорватской войны. В экспозиции представлен даже обломок сбитого сербами F-117 Stelth.

Всё было очень интересно и познавательно. Мы провели там полтора часа и то просто потому, что ребёнку стало скучно и он стал убегать, прятаться и громко кричать, чем изрядно надоел. Хорошо, что мы были практически единственными посетителями.

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

Не обошлось без приключений: спускаясь со стены вниз к подножию крепости, развалинам римского периода и парку я сверзился с лестницы. Там совсем не убирают снег, скользко. К счастью, ничего не повредил. Я отделался синяком на спине, лестница - лёгким испугом.

Обратный подъем в крепость тоже был не самым простым. Есть дорожка, но и она была засыпана снегом. Охранник, дежуривший в нижнем парке, любезно подсказал дорогу. Нам сильно помогли поручни, иначе было бы сложно. Но сам подъём все же доставил некоторое удовольствие.

Вдоволь нагулявшись мы пошли в уже ставшее нам таким родным кафе. За несколько обедов там накопилась некоторая скидка, что дало нам возможность выбрать пиццу бесплатно. После обеда я на улице продегустировал "кувано вино" - местный аналог глинтвейна. Довольно вкусно, особенно на морозе.

Наш самолёт только в 11 вечера так, что есть время прогуляться напоследок.

Что было попробовано:
пиво Jelen (Олень) - светлое, лёгкое, но без характерной для европейских лагеров горчинки.
пиво Niksicko - светлое и тёмное, нефильтрованное. Оригинальное варится в Черногории (я там пил), по лицензии - в Сербии. Типичный европейский лагер, но тоже без горчинки. Неплотное.
ракия Dunja - очищенная самогонка из айвы, прикольно, но много не выпьешь. Сильный фруктовый привкус.
лимончелла - дали комплиментом как дижестив в одном из ресторанчиков итальянской кухни, который мы нашли совершенно случайно. Самодельная. Очень вкусно.
кувано вино - аналог глинтвейна на основе местного дешёвого вина. 

Что отмечено:
Огромные порции еды. Салат и основное блюдо - это просто пережор.
Экономили на отоплении в отеле, но спать было не холодно под толстыми одеялами.
Потрясный лифт в отеле 1926 года изготовления.
В городе очень много книжных магазинов и библиотек. Есть даже киоски в которые вы можете принести свои книги и взять другие на обмен.
За 5 дней мы увидели только 4 кошки. Зато очень много собачьего дерьма в стороне от центральных улиц.
Отопление столиков на улице. Раньше я такого нигде не видел.
Даже центральные улицы чистятся плохо. В Москве гораздо чище в центре города. И это при том, что в Сербии  25% безработных. На стенах очень много граффити.
Народ доброжелателен, молодёжь хорошо говорит по-английски, те, кому за 45 иногда знают русский.

Есть что-то такое в этом городе, что оседает где-то внутри. Вернёмся через пару-тройку лет... наверное.

среда, 7 января 2015 г.

Сербия. День четвёртый.

Сегодня проснулись как-то поздно, после 9 часов. Позавтракали, потом мне нужно было немного поработать. В итоге вышли только около половины двенадцатого. А путь наш лежал в старинный район под название Земун.

Когда-то это была одинокая деревенька на берегу Дуная, но со временем город её поглотил и туда стали ходить автобусы. Чем мы и воспользовались. Как добраться до ближайшей автобусной остановки нам подсказали на ресепшене, а дальше было несложно.

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

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

Приехали в Земун, нашли пешеходную зону с достопримечательностями, походили, посмотрели. Прошлись по набережной с утками и лебедями. Затем поднялись на холм до башни Миллениум она же Милениумска Кула, она же Кула на Гардошу. Построена на руинах крепости в 1896 году в память о тысячелении того момента как венгры свалили с этого места.

Место интересное, местная архитектура тоже самобытная. И вид неплохой. Только вот гарью там пахнет, пожар был в башне.

Спустились вниз, поплутали маленько в поисках местечка где можно поесть, расстроились и вернулись обратно в Старый город. Уж там-то есть испробованные нами работающие места.

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

Стемнело, на улицах стала появляться жизнь в виде проспавшихся горожан и туристов. Вчера, между прочим, примерно в 8 вечера на улицах почти никого уже не было, все разошлись по домам. И Даже ресторанчики грустили в запустении.

вторник, 6 января 2015 г.

Сербия. День третий.

Сегодня погуляли ударно. Прошлись до музея Николы Тесла. К счастью сегодня он был открыт. Сам музей на первом этаже двухэтажного особняка. На втором же размешается библиотека и туда просто так не пропускают. Сама экспозиция маленькая. В основном там действующие модели изобретений Теслы, урна с его прахом и немного личных вещей. Как это все работает - фиг его знает. Много знаний утрачено или уничтожено. А ведь мог быть огромный прорыв в электроэнергетике.
После музея мы прошлись до места где строится огромный храм Святого Савы, немного там прогулялись, зашли в кофейню и придумали что далее мы пойдём до музея железнодорожного транспорта, сядем на трамвай и поедем до музея науки и техники.
Железнодорожный музей был закрыт, пришлось отделаться снимком "паровозика из Ромашково". Купили, используя смесь русского, сербского и английского,  билеты на трамвай в ближайшей "союзпечати". Билеты дорогие, примерно 80р. Билет представляет собой смарт-карту, на которую пишется число поездок. При входе в транспорт билет надо приложить к считывателю и поездка спишется. Как в московском метро. Длительность поездки не ограничена. При необходимости, заплатив, на карту можно записать ещё поездки.
Подойдя к зданию музея науки и техники мы решили пойти куда-нибудь ещё. Ибо ремонт. Но на поверку музей работал, хотя и только один этаж. Было много всяких интересных штучек. Дитё толком не давало рассмотреть, постоянно что-то трогало, куда-то уносилось. Хоть мы и были там единственными посетителями, но всё равно как-то неловко было. Что получилось, то и сфоткал.
Из музея вышли с мыслью что пора бы и поесть. Пошли в сторону уже знакомой нам местности, но по дороге наткнулись на семейный ресторанчик итальянской кухни. Мелкому пасту, нам пиццу. Всё вкусно. Попросили счёт, нам вместе со счётом принесли самодельную лимончеллу - очень вкусную.
После обеда решили прогуляться в ещё один райончик, на туристической карте обозначенный как нечто разлекательное. На самом деле там улочка полная ресторанчиков национальной кухни. Только вот место откровенно туристическое и мы там останавливаться не стали. Сделали кружок и побрели в сторону своего отеля ибо уже стали уставать.
А вечер на улицах, наверное, будет полнолюдным. Ибо - Рождество.

А вот и нет... После 7 вечера на улицах ни-ко-го. Всё закрыто, кроме нескольких ресторанов. Это просто кошмар какой-то. Даже продуктовые магазины закрылись в 6 вечера.  Такие вот праздники там.

понедельник, 5 января 2015 г.

Сербия. День второй.

Сегодняшним планом было посетить музей Николы Теслы и пройтись по другим достопримечательностям, что располагаются по пути. В музей не попали - сегодня у сербов праздник Туциндан и некоторые заведения по этому поводу предпочитают не работать. На улицах полно торговцев, которые предлагают желающим дубовые веники. Активизируются лавочки продающих "кувано вино" - горячий слабоалкогольный напиток что-то типа глинтвейна.

Вот и музей тоже не работал. Но мы почти не расстроились. Почти - это потому, что расстроился только я, так как наступил на собачью какашку. Как и в любом городе мира - чем дальше от центральных улиц, тем больше собачьих какашек на тротуарах.

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

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

воскресенье, 4 января 2015 г.

Сербия. День первый.

Первый день начался практически за сутки до того как.... А всё началось с того, что за сутки до самолёта умер винт в RAID одного подшефного сервера.  До этого сервер проработал без нареканий и перезагрузок в течении 1200 с копейками дней. Диск скончался так хитро, что система ушла в панику, потом ребутнулась, потом при проверке файловых систем оно замечательно грохнуло системный раздел и раздел с бекапами. Alles kaput. Четыре часа я с техниками хостинга пытался честно заставить их загрузиться со внешнего носителя и попробовать оживить хоть что-то. Затем они два часа меняли диск и ещё 8 часов перестраивали массив. В это время я со своим инженером уводил остальные сервера на другую схему работы, так как погибший сервер выполнял роль балансера нагрузки и сервера резервного копирования. Ирония судьбы.
Вот и получается, что к тому моменту как мы сели в самолёт я не спал более суток. Первый сегмент прошел нормально. Потом три часа в транзитном порту, затем второй рейс в Белград, в течении которого сынишка замечательно уснул, а я ему завидовал. Кстати, не реклама, но заметка: на рейсе AirSerbia в эконом-классе бесплатно наливают вискарик, водочку или пивко.
В Белград мы прилетели почти в полночь. Нас встретил таксист из отеля. Дорогу плохо помню. Нам дали ключи от номера. Мысли были только о принять душ и упасть спать.
Отель в самом центре города, крохотный, номеров на 7 или 8. Занимает 2 этажа 4-этажного здания. В номере прохладно, отопление еле тёплое. Одна большая комната с кроватью и диваном, санузел и закрытый балкончик. Мебель под винтаж. Ничего лишнего, просторно. Интернет есть и почти не тормозной.
Утром после завтрака пошли прогуляться. Погода ветреная, около 0. Город представляет собой архитектурный кошмар. Смешение стилей и направлений. Цены как дома. Цену в динарах надо уменьшать на 45-50% и получаете эквивалент в рублях.
С едой проблем никаких, с общением тоже. Все с кем общался говорят по-английски в той или иной степени. Магазинчик с продуктами прям напротив отеля, что удобно. Банкоматов в округе тоже много.
До обеда прошлись с целью разведки, дабы наметить маршруты и точки общепита. Посте обеда планируем вылазку в Белградскую крепость, она весьма недалеко.

Недалеко от нашего отела начинается территория под названием Калемегдан. Это некий мыс с очень высоким холмом в месте слияния рек Сава и Дунай. Там находятся Белградская крепость (в которой находится военно-исторический музей, был закрыт), зоопарк, просто парк. Место интересное и требует больше чем час на прогулку, но погода не позволила. На берегу рек дул очень сильный и холодный ветер, что испортило прогулку. Ограничились мы только просмотром экспозиции под открытым небом и быстрым обозрением самой крепости.

Мелкий захотел кушать. Вбил себе в голову. что ему нужно в KFC. Прогулялись, зашли... Вывод - гадюшник. Лучше уж макдак, как средство последней надежды. Решили найти другое место. Это решение превратилось в прогулку по городским улицам в поисках пристойного заведения. Много забегаловок для перекуса на бегу или просто баров. Заведения где можно поесть супчика нашлось не сразу, но нашлось. Там было много местных и русскоязычное меню. Поели телечу чорбу - нажористый суп с мясом, салат, блины для пацана. В счет включили аж 20% чаевых.

Когда мы вышли из кафе было уже темно. Город освещён не очень красиво. Но мы обратили внимание на другую штуку: местные так любят сидеть в кафешках на улице, что им под столики ил на столики ставят обогреватели  - такие стеклянные трубы с раскалённой спиралью, или стеклянные пирамиды с огнём от газовой горелки. Выглядит это очень необычно и красиво в темноте. Мимо проходишь и ощущается тепло на расстоянии в пару метров.

P.S. А в номере всё-таки прохладно....

среда, 31 декабря 2014 г.

Японо-китайские тату

Просто чтоб не забыть и не накосячить: 



С Новым годом!

Привет, друзья!
Да, каюсь, пипец как давно не писал. Но самом деле и писать особо не о чем. Домашняя жизнь проходит ровно. Вся активность на работе. Особенно "порадовали" три проекта. выполняемых одновременно. Но мы справились.
Из планом на ближайшее будущее - посетить Сербию в период с 3 по 8 января. Разумеется, путевые заметки и фотоальбом будут.
Не теряйте :-).

воскресенье, 6 июля 2014 г.

Трёхслойный пирог: haproxy + nginx + apache

В одном из наших проектов вызрела надобность горизонтального расширения количества веб-серверов. Первое что пришло на ум - это установка балансировщика нагрузки. Но вот "на беду" параллельно с этим встала задача побыстрее отдавать статический контент. Для решения этой разумеется выбран nginx, хотя до сих пор не парились и работали только с apache. Итак, какие заморочки придумали.
Наши сайты (а у нас их около 70, мы не хостинг, это всё наши)  решили поделить на три кучи:
1. То, что будет балансироваться;
2. То, что не будет балансироваться и обрабатываться только apache;
3. То, что не будет балансироваться и будет обрабатываться nginx.
Решили начать с того, чтобы поднять nginx. Здесь все оказалось просто, документации куча, но есть нюанс... Логика работы такая - всё обрабатывается nginx, а php передаётся в  apache. Однако,  существует такая штука, как динамически создаваемые файлы. Так вот, в этом случае nginx подумает, что обращение за файлом должен обрабатывать он, но файла нет и клиент увидит 404. Решение есть и не одно. Привожу пример конфига nginx:
Первый вариант:
В секции http конфига nginx указываем
http { 
...
#этим мы укажем, что у нас существует некий сервер (apache), который висит на 127.0.0.1
#сам nginx у нас висит на 127.0.0.1:8080 так как есть ещё балансер на внешнем интерфейсе
  upstream nextserver {
    server 127.0.0.1;
  }
#эта секция нужна, чтобы в apache передать реальные адреса клиентов
  set_real_ip_from 50.ххх.ххх.59; # внешний адрес балансера
  real_ip_header   X-Forwarded-For;
  port_in_redirect off;

...
# остальные настройки, а также...
# Load config files from the /etc/nginx/conf.d directory
  include /etc/nginx/conf.d/*.conf;

} # end of http

В каталоге /etc/nginx/conf.d мы держим настройки для каждого домена, который будет обслуживаться nginx. Каждый домен в своём файле. Пример:
server {
    server_name  .domain.net;
    access_log /home/www/domain.net/logs/access_log;
    error_log  /home/www/domain.net/logs/error_log;


    location / {
        root   /home/www/domain.net/httpdocs;

#Проба на файл, если файла нет, оправляемся искать в локацию nextserver, то есть на apache
        try_files $uri $uri/ @nextserver;
    }

 
include /etc/nginx/conf.d/common-config;

}

А в файле /etc/nginx/conf.d/common-config хранится неизменяемая часть, одинаковая для всех доменов:
listen 127.0.0.1:8080;
index index.html index.php;

#Локация nextserver используется для передачи данных в apache так же как передаются данные для обработки php
  location @nextserver {
            proxy_pass   http://nextserver;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   Host $http_host;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location ~ \.(php|htm)$ {
            proxy_pass   http://127.0.0.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  }

Собственно всё. Есть второй вариант обработки не найденного файла. Для этого вносим некоторые изменения в файл /etc/nginx/conf.d/common-config, после чего он выглядит так:
listen 127.0.0.1:8080;
index index.html index.php;
#как только получили код 404 отправляемся за ним на apache
error_page 404 = @notfound;

location @notfound {
            proxy_pass   http://127.0.0.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
}

location ~ \.(php|htm)$ {
            proxy_pass   http://127.0.0.1;
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    Host $http_host;
            proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
}

А файл описания домена выглядит ещё проще
server {
    server_name  .domain.net;
    access_log /home/www/domain.net/logs/access_log;
    error_log  /home/www/domain.net/logs/error_log;

    location / {
        root   /home/www/domain.net/httpdocs;
    }

    include /etc/nginx/conf.d/common-config;
}


Теперь apache. Задача перенастройки apache свелась к тому, чтобы в конфигурациях виртуальных серверов заменить адрес на 127.0.0.1. Затем нужно получить от апача реальный адрес клиента. В nginx мы уже провели подготовку, но этого мало. Проблема решается установкой модуля mod_extract_forwarded, который берет данные из заголовка X-Forwarded-For и передает их в REMOTE_ADDR. Конфигурационный файл модуля примитивен:
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEForder refuse,accept
MEFrefuse all
#Разрешает локальный адрес и адрес балансера
MEFaccept 127.0.0.1 50.ххх.ххх.59
MEFaddenv on
MEFdebug off

И наконец, самое вкусное: haproxy. Впечатления балансер оставляет самое положительное. Работает очень быстро, настройки простые и гибкие. Используем версию 1.5.1, так как там есть пара удобных функций.
global #общие настройки
    log         127.0.0.1 local2 #куда пишем логи
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     10000 #максимальное число коннектов к балансеру
    user        apache #по-умолчанию балансер работает от пользователя haproxy
    group       apache
    daemon


defaults #настройки по-умолчанию
    mode        http
    log         global
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor #это нужно, чтобы заполнить X-Forwаrded-For и передать бекэнду
    option      redispatch
    option      httpchk HEAD / HTTP/1.0
    cookie serv insert
    timeout connect 5000 # default 5 second time out if a backend is not found
    timeout client 10000 # 10 sec
    timeout server 90000 # 10 sec
    maxconn     10000
    retries     3


frontend  main 50.ххх.ххх.59:80 #вешаем балансер на внешний интерфейс
#читаем файлы с именами доменов и в зависимости от того какой домен в каком файле
#используем то или иное правило балансировки
    acl host2apache     hdr_beg(host)   -i -f /etc/haproxy/unbalanced-apache
    acl host2nginx      hdr_beg(host)   -i -f /etc/haproxy/unbalanced-nginx
    acl url_static      path_beg        -i /mrtg /munin

    use_backend nginx           if url_static
    use_backend nginx           if host2nginx
    use_backend apache          if host2apache
    default_backend             balanced #по-умолчанию коннект пойдет на балансировку


#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such

# небалансированный бекэнд для доменов из списка
#---------------------------------------------------------------------
backend apache
    balance     roundrobin
    server      static 127.0.0.1:80 check

backend nginx
    balance     roundrobin
    server      static 127.0.0.1:8080 check
#
#---------------------------------------------------------------------
# round robin balancing between the various backends

# серверы, на которые пойдет распределение нагрузки
#---------------------------------------------------------------------
backend balanced
    balance     roundrobin
    server  web1 50.ххх.ххх.214:80 check
    server  web2 50.ххх.ххх.210:80 check
    server  web3 50.ххх.ххх.211:80 check


Вот такое решение трёхслойного пирога с вишенкой. Извращение, конечно, но работает.