Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2013-08-30

Защита SSH от брутфорса

Серьезным пацанам не надо обьяснять, что проактивная IDS (Intrusion Detection System) необходима для их серьезных систем. А нам хватит чего попроще. Например, что может быть проще, чем применение iptables для защиты от брутфорсных атак на SSH? Достаточно понизить скорость перебора паролей и атака становится совершенно нерентабельной.

iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 60 --hitcount 4 -j DROP


Всего две строчки — а какой эффект. Не более трех попыток коннекта на 22 порт в минуту.

Заодно можно проверить конфиг sshd, тюнинг не помешает:

Еще? Спросите гугель:



original post http://vasnake.blogspot.com/2013/08/ssh.html

2013-08-29

Виндсерфинг видео

Продолжаем сеять разумное, доброе, вечное — знание о катании на доске с парусом. Сегодня про правильную стойку.

Ролик 1/2, Джем Холл показывает правильную стойку: смотреть на ветер, загружать трапецию, парус дальше от себя на всю длину рук, передней ногой толкать, заднюю согнуть и т.д:



Ролик 2/2, Джем Холл продолжает раскрывать секреты правильной стойки в ситуации «режемся на ветер»:

Благодарим

за любезно предоставленную информацию.

original post http://vasnake.blogspot.com/2013/08/blog-post_28.html

2013-08-28

Plone undo_form

Отмена (undo) операций в Plone/Zope.
Многие знают, что практически любую операцию с контентом можно отменить, воспользовавшись вкладкой undo в ZMI.

Это, конечно, замечательная вкладка, но что делать, если редактору сайта не положено залезать в ZMI по сроку службы субординации?

Вот ответ на этот вопрос знают уже не все. Тайное знание заключается в том, что есть undo_form.

Если набрать адрес типа http://some.plone.site/undo_form
то внезапно появится таблица, очень похожая на ту, что нарисована на вкладке undo ZMI. Для работы с этим интерфейсом отмены вполне достаточно привилегий редактора.

Благодарим
за любезно предоставленную информацию.


original post http://vasnake.blogspot.com/2013/08/plone-undoform.html

2013-08-27

Учебник виндсерфинга

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

Источник:
http://smu.gs/vQBqx1

original post http://vasnake.blogspot.com/2013/08/blog-post_9954.html

2013-08-26

Видео

Еще два виндсерфовых видео. Одно полезное, другое приятное.

Как правильно падать, Джем Холл:

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

Это было полезное видео.
Теперь приятное — нарезка от http://softranger.livejournal.com/333830.html

Медитативно. Но ровно до тех пор, пока не подумаешь о том, сколько они оборудования поломали (да и костей :(

UPD:
На тот случай, если приятное видео запрещено Гугелем, вот альтернатива (без запретных песен): http://youtu.be/5O3SnkZPbcs

original post http://vasnake.blogspot.com/2013/08/blog-post_24.html

2013-08-23

Гомоветер

Кто виндсерфил во внутренних водоемах – «болотах», тот поймет:

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

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

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

Оффшор-гомоветер дует возле берега в 5-6 разных направлениях попеременно, а иногда и одновременно. Забавно бывает неожиданно получить сильный порыв гомоветра с другой стороны паруса. Бич-старт в оффшор-гомоветер тоже способен изрядно развлечь пляжников на берегу.

Оншор-гомоветер на берегу создает впечатление, что дует 10, а выходишь на воду - только 5.

Гомоветер стихает мгновенно, как только ты выходишь на воду.

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



Он такой, гомоветер ака педоветер.

original post http://vasnake.blogspot.com/2013/08/blog-post_23.html

2013-08-22

Хрящик

В закромах нашлось — DataGristle — интересный инструментарий для анализа данных в CSV файлах, написан на Python:

Usage Scenarios
  • Operational Diagnostics 1 - a marketing sentiment analysis company uses it for quickly discovering problems in spreadsheets sent to them by their customers. The spreadsheets were often found to be subtly malformed, or had invalid values that could be difficult to find. gristle_determinator was used to quickly sanity-check and find outliers.
  • Operational Diagnostics 2 - a large data warehousing team uses it whenever their bulk load process breaks on invalid data. Their database's bulkloader does not provide much info in this kind of a case, so they use gristle_freaker to quickly size up the nature of the data in a few problematic columns, gristle_viewer to examine individual records, and gristle_determinator to sanity-check the file structure. This has speed up the problem determination and resolution steps enormously.
  • Feed Analysis - a large data warehousing team uses it whenever they have new potential data sources to analyze. The gristle_determinator quickly finds data quality issues, and identifies characteristics useful for data modeling. On some large complex feeds, it can sometimes perform 8-20 hours of initial analysis in just five minutes.

What's Included
  • gristle_determinator - Analyses csv files and prints information about the file structure and each field within it.
  • gristle_slicer - Selects rows and columns out of csv file.
  • gristle_freaker - Creates frequency distributions of one or more columns of a csv file.
  • gristle_viewer - Displays a single record from a csv file organized in two columns, with labels to the left and values to the right.



Автор DataGristle работает на IBM в теме Data Warehouse, если вам это о чем-то говорит.

original post http://vasnake.blogspot.com/2013/08/blog-post_22.html

2013-08-21

Коррупция

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

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

1. Чувство власти снижает чувство социального неодобрения. Т.е. тем, кто был выше по статусу становилось менее важно что о нем думают, более низшие создания и как они оценивают его деятельность

2. Те, кто считает свою власть легитимной, берут из общих ресурсов то, что считают нужным.

3. Люди, наделенные властью «корректируют» мораль под себя, свои интересы и свое поведение.

4. Лица наделенные властью легче врут ( эксперимент показал, что у них во время вранья гораздо ниже уровень кортизола ( гормона стресса а значит сказать неправду для них не составляет труда и неприятные ощущения их не мучают), чем у тех, кто властью не наделен.

5. Власть усиливает проявление лицемерия. Люди наделенные властью легче осуждают в других то, что позволяют себе.

6. Люди наделенные властью чаще жульничают и ведут себя некорректно по отношению к нижестоящим, просто так, без особой нужды и причины на это.

Однако, естественно не все люди одинаковы и не для всех власть приговор
В целом тенденция «больше-власти, больше ресурсов» характерна для нарциссов. Когда нарцисс оказывается хоть каким-то образом на положении выше, чем все остальные, то его «несет» как Остапа Бендера. Ему надо больше, он чувствует, что его личность растет и ширится над массой серых людишек, и он, великий, имеет право на все. Мораль нарциссу неведома и он иногда ее вынужденно соблюдает, чтобы не побили или чтобы добиться того, что он хочет. Но если вдруг есть шанс быть не наказанным, то тут он развернется на полную катушку. Так что будьте уверены, если к власти рвется личность с признаками нарциссизма, то когда она достигнет желаемого, не сможет себя вести в рамках «людского закона». На входе во власть нарцисс может вообще все что угодно говорить, и даже очень правильно рассуждать и обещать многое. Власть в его руках довольно предсказуемое явление.
Что делать с нарциссам не известно, ибо как правило их желание «больше ресурсов для меня великого» несет их во власть и они просто затаптывают тех, кто готов работать «для дела». И те самые люди, которым набор большей власти не интересен просто отказываются от гонки с беспринципными нарциссами. Между тем за период с 1982 по 2009 распространенность нарциссических черт в обществе выросла на 30%
Другая сторона вопроса о коррупции, почему люди принимают и терпят несправедливое отношение к ним? На этот счет есть теория «оправдания системы» ... согласно которой, люди мотивированы поддерживать и защищать статус кво, то есть, преобладающие социальные, экономические и политические механизмы. В условиях угрозу существующей системы поведение связанное с ее оправданием усиливается. ...
На самом деле это довольно хороший защитный механизм для популяции, который наверное отлично работает на уровне животного мира. Чем больше угрожают нашей стае, тем плотнее надо сомкнуть ряды. Наш вожак так силен, что всех нас подмял под себя? Виват вожаку! Это правильный вожак, надо держаться его стороны, он и врагов победит! И за эту поддержку люди чувствуют себя спокойнее, более благополучно и у них поднимается самооценка. Но животному миру неведом нарциссизм и все наши людские межличностные перипетии.
Таким образом, с точки зрения психологии коррупция очень самоподдерживающаяся система. Это часто образ жизни общества, имеющий глубокие корни в сознании людей. Что-то менять можно только на базе осознания того, что происходит вокруг и почему люди так поступают. Выдергивание отдельных нарциссов, потерявших страх от собственного могущества довольно бесперспективная идея. Даже расстрелы не так чтобы вопрос сильно решали. Нарциссы всегда полагают, что слишком хороши и хитры, чтобы быть пойманными. Ну, и, самое главное у них нет особого осознания, что они делают плохо. И люди будут продолжать поддерживать нарциссов, потому что они обещают то, что люди хотят.



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

original post http://vasnake.blogspot.com/2013/08/blog-post_21.html

2013-08-20

timezone

Правда ведь удобно, когда timestamp в логах показывает твое локальное время? Сразу понятно, когда событие произошло, сейчас, полчаса назад или вчера. Например, чтобы в логах отражалось время для Москвы, Россия, нужно указать зону Europe/Moscow таким примерно способом:

su -l
rm /etc/localtime
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime



Осталось добавить, что этот рецепт проверен лично мною только для CentOS. А еще есть полезная команда tzselect.

original post http://vasnake.blogspot.com/2013/08/timezone.html

2013-08-19

Спрятать от поиска

Один из быстрых и грязных хаков к Plone – как убрать из результатов поиска ссылки на некий документ.

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

Но что делать, если нельзя а хочется? Вот хочется, чтобы на сайте в невидимой папочке лежал невидимый PDF документ, доступный при вводе ведущего к нему URL? Ни папочка, ни документ не должны появляться ни в навигации, ни в результатах поиска. Как?

If you set the expiration date of the content to a past date, it no longer shows up in search results. You then may have to allow content editors to access inactive content, otherwise; that content won't show up in folder listings either. It's the `Access inactive portal content` permission you'll have to customize for that.

That's the most simple way i could think of for this use case.



Легко. Достаточно установить у документа дату устаревания в прошлом (и выставить опцию «исключить из навигации»). Всё, документ пропал из листинга папки и из результатов поиска. С замаскированной папкой сложнее. Ей нельзя установить дату устаревания в прошлом, иначе она пропадет из листингов и управлять ей станет сложно. Лично я в настройках сайта убрал тип «Папка» из списка типов для поиска; в свойствах самой папки установил «исключить из навигации». Так сработало.

original post http://vasnake.blogspot.com/2013/08/blog-post_19.html

2013-08-16

Хостинг для сайта на Plone

Подзаголовок – чем плох FastVPS.

Как вы думаете, сколько стоит самый недорогой (но еще приемлемый) хостинг для веб-сайта построенного на Plone? Документация и мой личный опыт говорят, что надо хостинг не хуже VPS/VDS с 512 RAM и 5 гигабайт дисковой памяти.

Ответ: 270 рублей в месяц.

Я целый день перебирал варианты хостинга VPS/VDS и, в итоге, выбрал самый недорогой из приемлемых: http://www.fastvps.ru/ в варианте OVZ-2.

Характеристики:
  • Цена: 6 EUR = 8.56 USD = 270 RUB.
  • Оплата: PayPal, вебмани, яндексденьги, карты.
  • Датацентры: Эстония, партнер Hetzner Online.
  • Виртуализация: OpenVZ.
  • ОС: Debian 6, CentOS 6.4
  • Ресурсы: 800 мб ОП, 1200 Мгц проц, 1 ядро, 8 Гб диск, 1500 Гб трафик суммарный, 10 Мбит/сек.
  • Возможность попробовать перед оплатой: тестовый период не предоставляется.
Плюсы (для меня) относительно других провайдеров: подозрительно недорого, пейпел, европа; вменяемый сайт.

После разворачивания на этом хостинге сайта (http://clubwindsurf.info/) и проведения небольшого тестирования, появился ответ на вопрос «где кидают». Кидают на канале доступа/трафике.
Мало того, что при превышении суммарного трафика в 1500 гигабайт сайт блокируется, так еще и канал доступа, мягко говоря, не толстый, всего 10 мегабит/сек, ping 30 миллисекунд. С такими параметрами канала, даже включив gzip компрессию отдаваемых страниц, лучшая доступная производительность составляет 350 запросов в секунду при 12 потоках (ApacheBench). Тут мы упираемся в потолок сетевого канала — 15 мегабит. При этом, если такую нагрузку держать больше пяти минут, сайт отключат.

А, между прочим, я тут проводил тесты и обнаружил, что сайт может обслуживать до 5000 запросов в секунду при 5-ти потоках, генерируя трафик в 70 мегабайт/сек. Вероятно тогда я тоже уперся в потолок сетевого интерфейса (гигабитный виртуальный NIC).

Памяти и диска хватает с избытком. Оперативки свободно более 500 мегабайт, на диске осталось не занято более 6 гигабайт, сайту есть куда расти. Вот только с сетью не очень.

Но за такие деньги (менее $10 в месяц) это очень и очень неплохо.

Дополнительные источники информации:

Некоторые тонкости договора:
Дополнительный трафик для VPS может быть куплен по цене 6.9 евро за 100 ГБ на основе предоплаты …

При превышении потребления выделенного трафика, VPS клиента блокируется автоматически. Для разблокировки и оплаты дополнительного трафика (не менее 100 ГБ), клиенту необходимо связаться с Отделом по работе с клиентами. …

При превышении скорости соединения на VPS (на тарифах OVZ) свыше 15.5 мбит/сек на протяжении 5 и более минут, Компания имеет право заблокировать аккаунта до выяснения причин. …

Компания гарантирует сохранение доступности vps-нод на уровне 99% в месяц
Клиент имеет право отказаться от договора без указания причины, заявив Компании об этом в письменной форме или посредством тикет-системы не позднее, чем за «7» календарных дней. …


Знание – сила.

original post http://vasnake.blogspot.com/2013/08/plone.html

2013-08-15

coolest ArcGIS JavaScript app you can write in 100 lines or less

Сто и меньше строк кода на Javascript.
Победители соревнования

Всего 37 участников.

original post http://vasnake.blogspot.com/2013/08/coolest-arcgis-javascript-app-you-can.html

2013-08-14

Просто боевик какой-то

Марк Твен, Приключения Гекльбери Финна:

Then he says, slow and scornful:

"The idea of YOU lynching anybody! It's amusing. The idea of you thinking you had pluck enough to lynch a MAN! Because you're brave enough to tar and feather poor friendless cast-out women that come along here, did that make you think you had grit enough to lay your hands on a MAN? Why, a MAN'S safe in the hands of ten thousand of your kind -- as long as it's daytime and you're not behind him.

"Do I know you? I know you clear through was born and raised in the South, and I've lived in the North; so I know the average all around. The average man's a coward. In the North he lets anybody walk over him that wants to, and goes home and prays for a humble spirit to bear it. In the South one man all by himself, has stopped a stage full of men in the daytime, and robbed the lot. Your newspapers call you a brave people so much that you think you are braver than any other people -- whereas you're just AS brave, and no braver. Why don't your juries hang murderers? Because they're afraid the man's friends will shoot them in the back, in the dark -- and it's just what they WOULD do.

"So they always acquit; and then a MAN goes in the night, with a hundred masked cowards at his back and lynches the rascal. Your mistake is, that you didn't bring a man with you; that's one mistake, and the other is that you didn't come in the dark and fetch your masks. You brought PART of a man -- Buck Harkness, there -- and if you hadn't had him to start you, you'd a taken it out in blowing.

"You didn't want to come. The average man don't like trouble and danger. YOU don't like trouble and danger. But if only HALF a man -- like Buck Harkness, there -- shouts 'Lynch him! lynch him!' you're afraid to back down -- afraid you'll be found out to be what you are -- COWARDS -- and so you raise a yell, and hang yourselves on to that half-a-man's coat-tail, and come raging up here, swearing what big things you're going to do. The pitifulest thing out is a mob; that's what an army is -- a mob; they don't fight with courage that's born in them, but with courage that's borrowed from their mass, and from their officers. But a mob without any MAN at the head of it is BENEATH pitifulness. Now the thing for YOU to do is to droop your tails and go home and crawl in a hole. If any real lynching's going to be done it will be done in the dark, Southern fashion; and when they come they'll bring their masks, and fetch a MAN along. Now LEAVE -- and take your half-a-man with you" -- tossing his gun up across his left arm and cocking it when he says this.

The crowd washed back sudden, and then broke all apart, and went tearing off every which way, and Buck Harkness he heeled it after them, looking tolerable cheap. I could a stayed if I wanted to, but I didn't want to.


Я это перевел так:

Затем он сказал, медленно и презрительно:

Идея того, чтобы ВЫ линчевали кого-то! Это занимательно. Идея, что вы думаете, что у вас есть достаточно отваги, чтобы линчевать МУЖЧИНУ! Оттого, что вы достаточно храбры чтобы вывалять в дегте и перьях бедную одинокую отверженную женщину забредшую сюда, неужто это позволяет вам думать, что у вас достаточно твердости, чтобы взяться за МУЖЧИНУ? С чего бы, МУЖЧИНА в безопасности в руках десяти тысяч таких как вы -- до тех пор, пока светло и вы не за его спиной.

Знаю ли я вас? Я точно знаю вас, поскольку (я?) родился и вырос на Юге, и я жил на Севере; так что я знаю обычных людей и там и там. Обычный человек — трус. На Севере он позволяет любому кто хочет помыкать собой, приходит домой и молится о смирении, чтобы пережить это. На Юге один человек, без помощи, остановил дилижанс полный людей, средь белого дня, и ограбил их. Ваши газеты называют вас храбрецами так часто, что вы думаете вы храбрее других – тогда как вы храбры ровно так (как я сказал?) и не храбрее. Почему ваши судьи не вешают убийц? Потому, что они боятся, что его дружки будут стрелять им в спины, ночью – и это именно то, что они СДЕЛАЮТ.

Посему их всегда отпускают; и тогда МУЖЧИНА выходит ночью, с сотней малодушных трУсов в масках за его спиной и линчует подлеца. Ваша ошибка в том, что вы не привели с собой мужчину; это одна ошибка, и другая в том, что вы пришли не ночью и без масок. Вы привели ЧАСТЬ мужчины – Buck Harkness, вон он – и если бы он не заводил вас, весь ваш пар ушел бы в свисток.

Вы не хотели идти сюда. Обычный человек не любит проблем и опасности. ВЫ не любите проблем и опасности. Но как только ПОЛОВИНА мужчины – как Buck Harkness здесь – закричит «Линчевать его! Линчевать его!», вы боитесь дать задний ход – боитесь, что вы покажете кто вы есть – ТРУСЫ – и вы начинаете шуметь, и идете на поводке у пол-мужчины, и приходите возмущаться сюда, вопя какое важное дело вы собираетесь сделать. Толпа это жалкое зрелище; вот что такое войско — это толпа; сражаются они без прирожденной отваги, но смелость их от того, что их много, и от их офицеров. Но толпа без какого либо МУЖЧИНЫ во главе не вызывает ДАЖЕ жалости. Теперь вам следует поджать хвосты и пойти домой и забиться в норку. Если какое нибудь настоящее линчевание и будет сделано, оно будет сделано ночью, по Южному; и когда они придут, они принесут свои маски и приведут с собой МУЖЧИНУ. Теперь УХОДИТЕ – и заберите с собой вашего пол-мужчины – так он сказал, положив ружье поверх левой руки и взводя курки.

Сборище стремительно дернулось назад, и затем рассыпалось, и стремительно исчезло в разные стороны, и Buck Harkness, он пришпорил за ними, имея неважный вид. Я мог остаться если бы захотел, но я не захотел.

Просто боевик и ода отваге.

Оказывается, известный нам перевод выполнен ближе к стилю «смешных переводов Гоблина» нежели к стилю «правильных переводов Гоблина».
Зацените сами

А на самом деле, произведения Марка нашего Твена не такие уж и детские.


original post http://vasnake.blogspot.com/2013/08/blog-post_13.html

2013-08-13

Zope admin password

Головоломка. Столкнулся я вчера с очень странным поведением свежеустановленного Plone: не могу сменить пароль для учетки admin, которая создается на этапе инициализации сайта buildout-ом.

Последовательность такая: на этапе установки Plone из UnifiedInstaller я задаю пароль в опциях сборки
./install.sh --password=12345678 --build-python --static-lxml=yes standalone
Установщик создает buildout.cfg, в котором записан этот пароль в рецепте сборки Zope.
После того, как сайт стартовал, я, как и положено, захожу в acl_users и меняю пароль для пользователя admin. И вроде все хорошо — проходит логин на сайт под новым паролем. Но.
Но после перезапуска Plone оказывается, что пароль у admin старый, 12345678. Как так? Не постигаю.

Upd.
Как и следовало полагать, никаких чудес. Проблема в том, что инициализация сайта не была завершена (я не стал давить на кнопку «создать сайт Plone») и поэтому файл inituser не был удален.
Лечение
find /usr/local/Plone -type f -name inituser
    /usr/local/Plone/zinstance/parts/instance/inituser
rm /usr/local/Plone/zinstance/parts/instance/inituser
find /usr/local/Plone -type f -name access


original post http://vasnake.blogspot.com/2013/08/zope-admin-password.html

2013-08-12

для передачи содержимого DVD достаточно 1 секунды, а диска Blu-Ray (25GB) - 5 секунд

Какая няшка, через одно соединение TCP передавать 5 гигабайт в секунду:

В рамках проведённого эксперимента удалось достичь пропускной способности 51.8 Гбит/с при передаче данных через одно TCP-соединение.
...
Технология Multipath TCP (RFC 6824) позволит организовать работу TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Со стороны приложений подобное агрегированное соединение выглядит как обычное TCP-соединение.
...
Для серверных систем Multipath TCP может обеспечить сокращение расходов за счёт использования нескольких дешевых линков вместо одного более дорогого.
...
Для достижения скорости 51.8 Гбит/с в эксперименте были использованы два сервера HP DL380p G7 с шестью 10 гигабитными Ethernet интерфейсами в каждом (три двухпортовых адаптера Intel 82599EB).
...
После установки соединения с использованием утилиты netperf на первом этапе был задействован только один интерфейс и система показала максимально возможный предел для классического TCP-стека. После этого не разрывая соединения для оставшихся интерфейсов была включена поддержка Multipath TCP и система автоматически расширила канал связи с использованием появившейся мощности, доведя в итоге пропускную способность до 51.8 Гбит/с.


Дисковые массивы давно известны. Теперь будут массивы NIC-ов.


original post http://vasnake.blogspot.com/2013/08/dvd-1-blu-ray-25gb-5.html

2013-08-09

Нагрузочное тестирование

Одно к одному, вчера я написал про развертывание production сервера Plone, а сегодня мне на глаза попадается статья про то, как можно устроить нагрузочное тестирование сайта с помощью Funkload:

to get ride of the problem, we decided to perform multiple load test on different servers, and then compare the results.
The easiest and fast way to get the job done has been achieved with a simple buildout used to spread Funkload on many other servers with the same hardware requirements, each one running a Plone site clone. Of course, in order to compare the performance, every server has to meet the same hardware requirements.

Funkload is a powerful functional and load web tester, easy to install and well documented. I'm not going deep on details of all its functionality in this post, because in our case the two standard commands fl-run-bench and fl-build-report have been enough for the purpose
...
So, let's see how to set a Funkload test within a buildout.


В статье достаточно подробно расписано, как развернуть testing environment при помощи buildout. Буквально несколько простых шагов — и опля, на станции готов станок для проведения тестирования сайта.

Материалы для изучения:



original post http://vasnake.blogspot.com/2013/08/blog-post_8.html

2013-08-08

Plone in production

Не так давно я написал заметку про установку Plone 4.3 на CentOS 6.4, добавив напоследок:
В следующий раз, если захочется, поглядим как сделать production сервер на этой основе — как и какой frontend поставить, как сделать балансировку с использованием ZEO, как настроить автозапуск служб, ротацию логов, резервное копирование, etc.

Вот, пришла пора. Если хочется, поглядим на сборку production сервера с вебсайтом Plone на борту. Букофф многа. Кто не знает, что такое ZMI, ZEO, frontend и подобная лабуда — уходите сейчас.

Конфигурация боевого сервера (назову его deploy.nhome.net) будет такая:
* 32-х разрядная CentOS 6.4 на двухядерной машине с 512 мегабайт оперативки;
* Plone 4.3 standalone (без ZEO), установленный «от рута»;
* Nginx 1.4.2 + ngx_cache_purge 2.1 в качестве фронтэнда.

Несколько слов о причинах именно такой конфигурации. Когда я размышлял о том, какие компоненты выбрать, я учитывал два факта: хостинг (VPS) должен быть недорогой, точнее один из самых недорогих — это раз; веб-сайт должен показывать превосходное быстродействие и хорошую надежность. Как вы понимаете, это взаимоисключающие требования — на ограниченных ресурсах сделать быстрый и надежный веб-сайт на Plone CMS.
Чтобы сделать быстро и надежно — нужен хороший фронтэнд с кешированием и устойчивостью к нагрузкам. Чтобы экономить ресурсы, сайт должен содержать минимум компонент и эти компоненты должны быть нежадными.
Думаю, теперь понятно, почему Plone сделан в версии standalone, а не ZEO. Хотя ZEO было бы гораздо надежнее и устойчивее. Ну, может быть, когда нибудь, ради интереса, я оттестирую конфигурацию с ZEO, хотя, IMHO, на практике standalone Plone закрывает 99% потребностей.
Также, понятно почему Nginx. Легкий, быстрый, мощный, надежный и умеет балансировать нагрузку, кешировать, проксировать. Проверен в боях.

Далее. Раскладка по службам

* порт 80 — HTTP веб-морда Nginx, запросы через reverse proxy отправляются на порт 8080 в Plone. Ответы кешируются в Nginx на 10 минут, и, очевидно, если ответ есть в кеше, Nginx, не спрашивая Plone, отправляет ответ посетителю из кеша. Запросы аутентифицированных пользователей не кешируются; для отделения овец от козлищ анонимных от авторизованных используется проверка на наличие специфичной cookie. Несмотря на наличие возможности авторизоваться на сайте через HTTP, делать этого настоятельно не рекомендуется. Оставьте паблик сервис для анонимусов.

* порт 443 — HTTPS веб-морда Nginx, для работы с сайтом авторизованных пользователей типа авторов, редакторов, контент-менеджеров. В общем, аналогично порту 80, за исключением того, что тут нет никакого кеша.

* порт 22 — SSH для сисадминов. Нюанс в том, что доступ к веб-управлятору ZMI можно получить только через SSH, пробросив порт 8080 сайта на свою машину.

Конец предисловия, к делу.

Как установить Plone на production сервер, я уже написал
В итоге имеем стоковый Plone 4.3 standalone, установленный «от рута». В файрволле открыты порты 8080, 80, 443.

Поправим buildout.cfg для включения нужных моему сайту пакетов:
su -l
pushd /usr/local/Plone/zinstance
nano buildout.cfg

[buildout]
…
find-links += 
    http://dist.plone.org/release/4.3.1 
    https://github.com/vasnake/customplone.app.locales/tarball/clubwindsurf/customplone.app.locales-4.3.2.dev1.tar.gz 
...
eggs =
...
    collective.quickupload
    collective.ptg.allnewest
    xhostplus.gallery
    customplone.app.locales
…
zcml =
    customplone.app.locales
    xhostplus.gallery
…
[instance]
...
environment-vars = zope_i18n_compile_mo_files true
…
[versions] 
...
customplone.app.locales = 4.3.2.dev1 

EOF

sudo -u plone_buildout /usr/local/Plone/zinstance/bin/buildout -nv

Теперь Plone готов к заливке в него данных сайта (сделанного ранее на девелоперском сервере). Заливку будем проводить так:
* экспорт всего сайта используя ZMI на разраб.сервере. У меня получился файл cms.zexp (обычно сайт при создании обзывают «Plone» но я обозвал его «cms», вот такой оригинал :)
* импорт сайта через ZMI production сервера.
Сделать это проще пареной свеклы:
su -l
mv /home/valik/cms.zexp /usr/local/Plone/zinstance/var/instance/import/
sudo -u plone_daemon /usr/local/Plone/zinstance/bin/instance fg 
потом браузером через ZMI (http://deploy.nhome.net:8080/manage_main) импортировал файл в Zope. Потом миграция http://deploy.nhome.net:8080/cms/@@plone-upgrade
и проверка работы сайта прощелкиванием.
Работает, как ни странно :)

Вообще, если прочесть must have книгу Professional Plone 4 Development - Martin Aspeli, то станет очевидно, что я выбрал способ деплоя сайта Плон не самый правильный. Зато самый легкий :)

Далее - автозапуск службы Plone.

Обеспечить автостарт сайта при запуске машины хоста.
Дока пишет:
You can start and stop Plone with your server by adding and init.d (Linux and other sys v heritage systems) or rc.d (BSD heritage) script that accepts start and stop commands. The Unified Installer has an init_scripts directory that contains sample initialization/stop scripts for several platforms. If you didn't use that installer, you may find the scripts on github.


Хотя дока настоятельно рекомендует это http://supervisord.org/
Я полагаю, Супервизор будет полезен при разворачивании кластера ZEO, для моих же ограниченных ресурсов это избыточно. Поэтому для standalone конфигурации я буду применять init_scripts:
su -l
pushd /tmp/Plone-4.3.1r1-UnifiedInstaller/init_scripts/RedHat-FedoraCore/
cp plone-standalone /etc/rc.d/init.d/plone
chmod 755 /etc/rc.d/init.d/plone
chkconfig --add plone
Перезапуск машины... сайт работает, что значит — задача автозапуска решена.

Далее - ротация логов Plone.

У Plone standalone два файла логов:
/usr/local/Plone/zinstance/var/log/
    instance.log
    instance-Z2.log
Для кластера логов будет больше и в разных местах, но мне пока пофиг, я пока без кластера.
Дока пишет
For Plone 4.2.2+, just add configuration settings like these to your buildout's zope2instance sections:
[client1]
recipe = plone.recipe.zope2instance
...
event-log-max-size = 5 MB
event-log-old-files = 5
access-log-max-size = 20 MB
access-log-old-files = 10
This will maintain five generations of event logs of maximum five megabytes in size and 10 generations of 20 megabyte access logs.

В моем билдауте нужная секция находится ближе к концу файла и выглядит так:
su -l
pushd /usr/local/Plone/zinstance
nano buildout.cfg
...
[instance] 
<= instance_base 
recipe = plone.recipe.zope2instance 
http-address = 8080 
environment-vars = zope_i18n_compile_mo_files true
...

А после предлагаемых правок, соответственно, так:
...
[instance] 
<= instance_base 
recipe = plone.recipe.zope2instance 
http-address = 8080 
environment-vars = zope_i18n_compile_mo_files true
event-log-max-size = 5 MB
event-log-old-files = 5
access-log-max-size = 30 MB
access-log-old-files = 9
...

Проверим...
service plone stop 
sudo -u plone_buildout /usr/local/Plone/zinstance/bin/buildout 
service plone start

На другой машине подергаем домашнуюю страницу сайта и поглядим на логи:
ab -kc 3 -t 30 http://deploy.nhome.net:8080/cms
в три потока в течение 30 секунд, для начала.
Тесты показали, что такая ротация логов работоспособна.

Далее - Установка Nginx

Народная мудрость гласит:
To add nginx yum repository, create a file named /etc/yum.repos.d/nginx.repo and paste one of the configurations below:
nano /etc/yum.repos.d/nginx.repo 

[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/6/i386/ 
gpgcheck=0 
enabled=1 

EOF

yum check-update 
yum install nginx
Без проблем, Nginx установлен.

Автозапуск nginx - при установке из родного репозитория, как описано выше, сервер стартует сам, уже все настроено, ничего делать не надо.

Ротация логов nginx — тоже, все работает из коробки. Я только поправил то, что жирным выделено:
nano /etc/logrotate.conf
...
compress
delaycompress

nano /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
        daily
        missingok
        rotate 10
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}
В целом, если логи складывать в /var/log/nginx/*.log
то ротация логов внимания не потребует.

Конфигурация Nginx.

Самый простой конфиг — проксирование запросов на Plone. После запуска этого конфига можно (нужно) закрыть файрволлом доступ к порту 8080.
nano /etc/nginx/conf.d/deploy.nhome.net.conf

upstream plone {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name www.deploy.nhome.net;
    rewrite ^/(.*) http://deploy.nhome.net/$1 permanent;
}

server {
    listen 80;
    server_name deploy.nhome.net;
    access_log /var/log/nginx/deploy.nhome.net.access.log;
    error_log /var/log/nginx/deploy.nhome.net.error.log;

    location / {
          proxy_pass http://plone/VirtualHostBase/http/deploy.nhome.net:80/cms/VirtualHostRoot/;
    }
}

EOF

/etc/init.d/nginx configtest
service nginx restart
netstat -tulnpv
В итоге фронтэнд есть и успешно проксирует Плон, что показывает прощелкивание сайта в браузере по URL http://deploy.nhome.net/
После поднятия фронтэнда на 80 порту закроем файрволлом все порты кроме 22, 80, 443
system-config-firewall-tui
service iptables restart
service network restart
iptables -L
iptables -L -vn
nano /etc/sysconfig/iptables 

Проблема: как обеспечить доступ к корню ZMI? Ведь проксирование сделано на внутрь сайта Plone, а сисадмину иногда надо залезать в корень админки ZMI.
Поскольку доступ к корню ZMI нужен только для администратора сайта, то не будем делать это легким способом. Пусть админ делает это через SSH
ssh -v valik@deploy -L 8080:localhost:8080 
тогда в браузере URL админки будет
К тому же
Never ever expose your zope-root or login using the zope-admin-Account via http since the zope-admins password is only uuencoded in a cookie!

Кстати, нам нужен HTTPS.

Для управления сайтом и материалами следует обращаться к сайту по закрытому каналу. Отсюда — включить HTTPS для авторизованных пользователей.
Вкурив народную мудрость, я получил следующий простой но работоспособный конфиг фронтэнда для работы с сайтом по HTTPS:
su -l
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/www.pem -keyout /etc/ssl/certs/www.key
ls -la /etc/ssl/certs/
chmod 600 /etc/ssl/certs/www*
cp /etc/nginx/conf.d/example_ssl.conf /etc/nginx/conf.d/deploy.nhome.net_ssl.conf
nano /etc/nginx/conf.d/deploy.nhome.net_ssl.conf

#upstream plone {
#    server 127.0.0.1:8080;
#}

server {
    listen       443;
    server_name  deploy.nhome.net;
    keepalive_timeout 70;

    ssl                  on;
    ssl_certificate      /etc/ssl/certs/www.pem;
    ssl_certificate_key  /etc/ssl/certs/www.key;

    ssl_session_timeout  5m;

    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    access_log /var/log/nginx/deploy.nhome.net_ssl.access.log;
    error_log /var/log/nginx/deploy.nhome.net_ssl.error.log;

    location / {
          proxy_pass http://plone/VirtualHostBase/https/deploy.nhome.net:443/cms/VirtualHostRoot/;
    }
}
nano /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include   /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    include /etc/nginx/conf.d/*.conf;
}

EOF

service nginx restart
Проблемы. Поскольку сертификат самоподписанный, браузеры будут сопротивляться заходу на https://deploy.nhome.net/. Это лечится импортированием сертификата в список доверенных браузера. Еще одна проблема — когда на страницах сайта используются виджеты со сторонних ресурсов, браузеры могут по тихому игнорировать такое «подмешанное» содержимое, если оно не соответствует их представлению о безопасности. Это лечится своевременным нажатием разных кнопок в браузере, у каждого своих.
Но, в целом, доступ по HTTPS для редакторов сайта работает.

Теперь — Кеширование.

В дополнение к прекрасному кешированию Plone можно попробовать добавить внешний кеш. Кеширование в Plone позволяет достичь показателя 140 запросов в секунду, кому-то этого достаточно. Но можно лучше.
su -l
mkdir -p /var/cache/nginx/proxy
chown nginx /var/cache/nginx/proxy
chmod 700 /var/cache/nginx/proxy
nano /etc/nginx/conf.d/deploy.nhome.net.conf

# http {

    upstream plone {
        server 127.0.0.1:8080;
    }

    # proxy_cache_path path [ levels = levels ] keys_zone = name : size [ inactive = time ] [ max_size = size ] [ loader_files = number ] [ loader_sleep = time ] [ loader_threshold = time ]
    # Zone size should be set proportional to number of pages to cache. The size of the metadata for one page (file) depends on the OS; currently it is 64 bytes for FreeBSD/i386, and 128 bytes for FreeBSD/amd64
    # 1m = 1024 * 1024 / 128 = 8192 pages
    proxy_cache_path    /var/cache/nginx/proxy  levels=1:2 keys_zone=thecache:1m max_size=300m inactive=10m;
    proxy_temp_path     /var/cache/nginx/proxy_temp;

    # commenting this cause 'MISS' in cache log for Plone pages views
    proxy_ignore_headers Expires Cache-Control;

    # key for caching, default: proxy_cache_key $scheme$proxy_host$uri$is_args$args;
    proxy_cache_key $proxy_host$uri$is_args$args;
    # response will not be taken from a cache               
    proxy_cache_bypass $cookie___ac;
    # response will not be saved to a cache - when users are logged in (detect by cookie)
    proxy_no_cache $cookie___ac;

    log_format cache '$remote_addr $time_local '
                     '$upstream_cache_status '
                     'Cache-Control: $upstream_http_cache_control '
                     'Expires: $upstream_http_expires '
                     '"$request" $status '
                     '"$http_user_agent" $scheme$proxy_host$uri$is_args$args';

    # Redirect all www traffic to the www-less domain
    server {
        listen 80;
        server_name www.deploy.nhome.net;
        rewrite ^/(.*) http://deploy.nhome.net/$1 permanent;
    }

    server {
        listen 80;
        server_name deploy.nhome.net;

        access_log /var/log/nginx/deploy.nhome.net.access.log;
        # log for cache hits.
        access_log /var/log/nginx/deploy.nhome.net.cache.log cache;
        error_log /var/log/nginx/deploy.nhome.net.error.log;

        # proxy to Plone backend
        location / {
            # redirect PURGE requests from siteAdmin (root Zope access)
            rewrite  ^/cms/(.*)$  /$1  break;

            # bcause of Plone VHM - turn off replacing text in Location and Refresh headers
            proxy_redirect                  off;
            # set extra headers for backend
            proxy_set_header                Host $host;
            proxy_set_header                X-Real-IP $remote_addr;
            proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
            # maximum request Content-Length
            client_max_body_size            10m;
            # RAM buffer size for request body
            client_body_buffer_size         128k;
            # timeout for write to backend
            proxy_send_timeout              90;
            # buffer size for first part of backend response
            proxy_buffer_size               4k;
            # number and size of buffers for backend response, even pictures less that 128KB
            proxy_buffers                   4 32k;
            # buffers size busy sending response to client - half of proxy_buffers
            proxy_busy_buffers_size         64k;
            # buffer size for writing tmp file while buffering backend response
            proxy_temp_file_write_size      64k;
            # timeout for establishing a connection with backend
            proxy_connect_timeout           30;
            # timeout between two succesive reads from backend
            proxy_read_timeout              60;

            # turn cache on by cache name
            proxy_cache                     thecache;
            # make Plone's 'purge cache' possible
            proxy_cache_purge               PURGE from 127.0.0.1;
            # cache time for response 200, 301, and 302; 404; any
            proxy_cache_valid               10m;
            proxy_cache_valid               404 10m;
            proxy_cache_valid               any 10m;
            # change $proxy_host to 'plone' in key, bcause purge module can't get that variable
            proxy_cache_key                 plone$uri$is_args$args;

            # protocol and address of a backend
            proxy_pass http://plone/VirtualHostBase/http/deploy.nhome.net:80/cms/VirtualHostRoot/;
        }
    }

EOF

service nginx restart
tail -f /var/log/nginx/deploy.nhome.net.cache.log
Примечание: директива
proxy_cache_purge               PURGE from 127.0.0.1;
на данном этапе работать не будет, ее надо закомментировать. Позже я проясню эту тему. Заодно обратите внимание на переопределение ключа кеша
proxy_cache_key                 plone$uri$is_args$args;
Если не заменить «$proxy_host» на «plone» в определении ключа, то очистка (PURGE) кеша работать не будет.

Тестирование Apachebench-ем показывает выдачу из кеша со скоростью до 5000 запросов в секунду. Прекрасно, ящетаю :)

Проблема с попаданием в кеш страниц для авторизованных пользователей решается вот этими директивами:
    # response will not be taken from a cache               
    proxy_cache_bypass $cookie___ac;
    # response will not be saved to a cache - when users are logged in (detect by cookie)
    proxy_no_cache $cookie___ac;
Хорошо, что сайт не является какой-нибудь социальной сетью, где все страницы заточены под авторизованных. Там такой подход к кешированию не проходит.

Еще одна проблема кеширования – проблема инвалидации кеша при редактировании материалов сайта. Простое решение проблемы — сделать время жизни кеша небольшим — 1 минута.
можно сделать вывод, что опция
proxy_ignore_headers Expires Cache-Control;
в конфиге Nginx должна быть закомментирована. Тогда Nginx, уважая заголовки от Plone, будет кешировать то, что Плон хочет кешировать и не будет остальное. Управлять заголовками нужно в настройках сайта Плона, в разделе кеширования.
По умолчанию предполагается, что в кеш Nginx будет попадать только файлы, скрипты и стили. Но это не решение проблемы, это ее отодвигание.

Сложное но правильное решение — добавить в Nginx модуль ngx_cache_purge. Для этого придется перекомпилировать Nginx.
Как вариант, можно найти репозиторий пакетов для CentOS, где Nginx скомпилен уже с модулем purge:
Но я буду компилировать.

Сборка Nginx.

Сборка с добавкой модуля nginx_ngx_cache_purge
Текущую конфигурацию смотрим
nginx -V
и добавляем в нее
--add-module=/root/ngx_cache_purge-2.1
su -l
wget http://nginx.org/download/nginx-1.4.2.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
tar -xvf nginx-1.4.2.tar.gz
tar -xvf ngx_cache_purge-2.1.tar.gz
cd nginx-1.4.2

nginx -V
    configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables'

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables' --add-module=/root/ngx_cache_purge-2.1
    error: the HTTP rewrite module requires the PCRE library.

yum install -y httpd-devel pcre perl pcre-devel zlib zlib-devel GeoIP GeoIP-devel

# повторить конфигур

make
service nginx stop
make install
service nginx restart
Сборка и установка прошли успешно. Все наши конфиги сохранились.

Теперь нужно раскомментировать
proxy_cache_purge               PURGE from 127.0.0.1;
и настроить Plone так, чтобы при редактировании страниц он засылал в Nginx запрос на удаление из кеша старой страницы.
Для этого достаточно зайти сисадминским способом в управлятор ZMI и добраться до панели управления кешем:

В ней включить кеш, включить очистку «purging» и указать URL прокси:

В таком виде пурга отлично работает. Плон, после сохранения страницы, засылает пачку запросов PURGE, отлавливаемых модулем Nginx; модуль удаляет из кеша записи. Следующее обращение к странице в кеш не попадает и запрос направляется в Плон. Как доктор прописал.

Итого.

В итоге доступ к сайту происходит по следующий схеме:

Типичные посетители сайта обращаются по URL
к 80-му порту, обслуживаемому Nginx, который на 10 минут кеширует все ответы на такие запросы, что дает производительность до 5000 запросов в сек.
Если посетитель сайта пройдет аутентификацию, что не рекомендуется (ибо канал не шифруется), его общение с сайтом не будет кешироваться Nginx за счет наличия специальной куки в трафике. Запросы мимо кеша Nginx обслуживаются со скоростью до 140 запросов в сек.

Редактор материалов — contentmanager заходит по URL
на 443-му порт, обслуживаемый Nginx, который без кеширования проксирует такие запросы на Plone, порт 8080. Редактирование (сохранение) страниц сайта приводит к выдаче Плоном запроса PURGE к Nginx, что вызывает удаление из его кеша старого варианта страницы.

Администратор сайта, для управления настройками, создания резервный копий и просто доступа к ZMI обращается к сайту по URL
но только после того, как пробросит порт сайта через ssh
sh valik@deploy -L 8080:localhost:8080
на свою машину.


Неотъемлемой частью production сервера является мониторинг:
потребление ресурсов, сбои, обслуживаемые запросы, использование кеша/производительность и пр.
Тут все как всегда и ничего необычного.

Кстати, про потребление ресурсов:
в моем конфиге из 500 мегабайт оперативки занято 328 (около 150 — сервер Zope). Оставшаяся память (170) вся занята кешем и буферами (105 + 34). Своп не используется.

Список мониторных команд:
  • pstree -a
  • ps aux|less
  • netstat -ntlp
  • netstat -nulp
  • netstat -nxlp
  • free -m
  • less /proc/meminfo
  • vmstat
  • uptime
  • top
  • iostat
  • iostat -kx 2
  • mpstat 2 10
  • dstat --top-io –top-bio
  • vgs
  • pvs
  • lvs
  • df -h
  • mount
  • lsof
  • ss -s
  • dmesg
  • less /var/log/messages
  • less /var/log/secure
  • less /var/log/auth

Логи приложений
  • tail -f /var/log/nginx/deploy.nhome.net.cache.log
  • tail -f /var/log/nginx/*.log
  • tail -f /usr/local/Plone/zinstance/var/log/instance.log
  • tail -f /usr/local/Plone/zinstance/var/log/instance-Z2.log

monitoring platform
Munin, Zabbix, Nagios, New Relic… Anything will do.

centralized logs
Loggly, Airbrake, Graylog…


И напоследок про резервные копии и восстановление.

Несмотря на большое количество буков в инструкциях по созданию копий
идея стандартная — копируйте всю папку в которой развернут Plone. Трудность в том, что файл Data.fs заблокирован пока сайт работает. Чтобы его скопировать правильно и не потерять синхронности с blobstorage и придумали всякие сложные схемы. Кстати, этот файл еще и паковать надо регулярно
Чем активнее редактируют сайт, тем чаще следует паковать файл.

Лично мне проще раз в неделю, наряду с общим обслуживанием сайта, сделать экспорт всего сайта в файл cms.zexp и потом запаковать базу. Все вручную, через ZMI. Но если есть желание, то можно и автоматизировать эти две минутные процедуры.
Имея на руках файл cms.zexp и вышеприведенный текст, сайт восстанавливается с нуля за час времени.

Вот и сказочке конец, а кто слушал — молодец.

Материалы для самостоятельного изучения:



original post http://vasnake.blogspot.com/2013/08/plone-in-production.html

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) Klaipeda (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) купи/продай (9) Photo (8) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)