Skip to content

Nginx + haproxy + apache ?

Есть задача — построить отказоустойчивый web-кластер высокой доступности.

  • frontend — nginx
  • loadbalancer — haproxy
  • backend — apache

Дано: 2 сервера nginx, 2 сервера haproxy, 4 сервера apache

Но возникает академический интерес в расположении данных элементов в цепочку…

nginx — haproxy — apache ?
round-robin на входе, кеш до haproxy, haproxy распределяет нагрузку по апачам
Смущает round-robin на входе, в остальном вроде идет равномерное распределение нагрузки по апачам

haproxy — nginx — apache ?
Плохие стороны round-robin в рамках haproxy можно заменить keepalived (?)
Балансировка между апачами выглядит не так хорошо как с haproxy

Собственно приглашаю в комменты для обсуждения.

Обзор Kanban досок

Kanban

Наверняка многие из вас уже сталкивались с манифестом Agile методологии, кому-то идея нравится, а для кого-то это хаос. На мой взгляд самым простым и эффективным методом планирования работы является kanban доска, но в случае распределенной команды её эффективное использование крайне затруднительно. Поскольку greenhopper 6.0 от Atlassian, в котором можно будет создавать мультипроектные канбан доски, будет зарелизен не раньше лета, то я решил пройтись по ресурсам, которые доступны уже сейчас. По функционалу они близки друг к другу, опишу совсем кратенько:

  1. Agilezen
    Бесплатный аккаунт очень урезан по возможностям, есть flow-диаграммы, система обмена сообщения для совместной работы.
  2. Kanbantool
    Можно бесплатно использовать одну доску на двух пользователей, есть API, хороший функционал, поддержка touch интерфейсов.
  3. Lean Kit Kanban
    Бесплатно предоставляется 1 доска на 5 пользователей, есть API, возможность import/export, хорошо реализована совместная работа, уведомления, статистика, диаграммы.
  4. Bananascrum
    Бесплатно предоставляется 1 проект на 3 пользователей. Приложение не понравилось в использовании, а в остальном тот же функционал как и у других.
  5. Swift
    Бесплатное бета-тестирование. Крайне богатый функционал и приятная реализация.
  6. flow.io
    Бесплатно предоставляется 1 пользователь на 1 проект, есть api, ведутся часовые снапшоты проектов для отслеживания истории развития проекта. Приятна в использовании.
  7. Hansoft
    Большая и крайне вкусная система, есть триал на 2х пользователей. Функционал лучше разглядывать на сайте, его не описать =)
  8. Kanbanery
    Бесплатно предоставляется 1 доска на 2 пользователя. Полноценно посмотреть не дошли руки.
  9. smartQ
    Есть триал. Красивая реализаци, можно погрузиться в демку.
  10. TargetProcess
    Есть возмжоность интеграции с JIRA. Очень богатый функционал, лучше перейти на их сайт и посмотреть самим =)
  11. VersionOne
    Бесплатно 10 пользователей. Есть возможность интеграции с JIRA. Но как-то не понравилась на тему удобства использования.
  12. Kanbanize
    Приятен в использовании, полностью бесплатен (может по этой причине и приятен=)
  13. Agilo
    Вполне продуманный интерфейс, интересное лицензирование — можно скачать, а можно воспользоваться hosted версией. Бесплатна.
  14. Xplanner-plus
    Бесплатный opensource проект.
  15. Scrumdesk
    Бесплатен для 5 пользователей. На время написания заметки сайт лежал, так что потом что-нибудь напишу.
  16. Seenowdo
    Интересный бесплатный проект, но вот тяжелое и тормозное флеш приложение расстраивает, если вас это не останавливает, то стоит попробовать.
  17. Scrumy
    Бесплатный, но крайне странный.
  18. Ontime
    1 бесплатный пользователь. Толком посмотреть не удалось.
  19. Spaaze
    Это конечно не kanban доска, но по сути её можно использовать вообще для любых целей.

Авторизация в MongoDB

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

В SQL базах вы можете иметь множество пользователей, групп и схем для более тонкой настройки прав доступа к данным. Но если не рассматривать MongoDB только со стороны философии, которую они пропагандируют, то можно найти прекрасный механизм авторизации.

Хотите добавить пользователей к своей базе на MongoDB ?

MongoDB позволяет управлять пользователями на уровне базы, но правда только в «read/write» или «readonly» режимах.

Создание пользователя с правами «read/write»:

$ ./mongo
> use mydatabase
> db.addUser(«admin», «Sup3rG00dP@azzword»)

Создание пользователя с правами «readonly»:

> db.addUser(«web», «prettyGoodPass», true)

Параметр true как раз и задает readonly права для создаваемого пользователя.

Смена пароля:
Для смены пароля необходимо еще раз вызвать addUser

> db.addUser(«web», «wayGooderPass», true)

Удаление пользователя:
Для удаления пользователя вам необходимо удалить соответсвующий документ в system.users коллекции

> db.system.users.remove({«user» : «web»});

Настроить монго для использования авторизации:
Если вы хотите полностью закрыть неавторизованный доступ, то требуется изменение конфигурации MongoDB.
auth = true
После этих изменений требуется перезапуск демона.
Если вы попытаетесь получить доступ с данными несуществующего пользователя, то вы получите ошибку вида:

error: { “$err” : “unauthorized for db [mydatabase] lock type: -1 ” }

Также readonly пользователь при попытке записи получит ошибку:

unauthorized

Адекватны ли пользователи вашей системы?

История: Как-то давно писал статью на Хабре, но что-то не взлетела, решил вот утащить её в свой блог, может вторая жизнь породит новые веяния в умах =)

Наверняка многие использовали для записи сессий командной строки программу script.
А кто-нибудь задавался вопросом, а можно ли использовать её в рамках повышения безопасности/мониторинга/проверки адекватности пользователей системы?
Любопытства ради решил прикрутить script ко всем пользователям системы и посмотреть, что из этого выйдет…

 

#!/bin/sh
if [ "$TERM" != "" ]; then
DATE=`date +%F.%H.%M`
FOLDER="/tmp/"
exec script -q -t $FOLDER$USER.$DATE 2> $FOLDER$USER.$DATE.time
else
/bin/sh $*
fi

Добавляем такой скрипт в /etc/profile (в gentoo сохранил это в файл bash.sh и поместил его в директорию /etc/profile.d/).

Можно проверять работоспособность, заходя по SSH или любым другим способом.

В /tmp должны появиться файлы вида test.2010-03-25.20.01 и test.2010-03-25.20.01.time.
Файл c .time содержит в себе всю информацию по таймингу сессии.

Если файлы создались, дабы проверить плоды, запускаем:

scriptreplay test.2010-03-25.20.01.time test.2010-03-25.20.01

и наслаждаемся просмотром.

Хочу сразу сказать недоработки:
1 Если подключаться ssh user@host /bin/bash -i — то ничего не логируется =(

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

Так же можно создать отдельный каталог вместо /tmp, например /opt/sessions и задать права:

chmod 733 /opt/sessions

Дабы все сессии могли писать, но юзеры не могли сделать листинг этой дирекории.

Оригинал

Экстремальное парное программирование

Из всех практик экстремального программирования, наибольшее сопротивление встречает парное программирование. Некоторые любят его, а некоторые ненавидят.

Болтливый кодер

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

Что вы думаете? Принадлежит ли это к этому домену или нет? Много ли выполняет этот класс?

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

Герой в наушниках

Другие же больше любят работать в одиночку, они предпочитают воткнуть наушники и погрузиться в свой отрешенный от офисной суеты мир. Они не задают вопросов и стараются войти в нирвану программирования 🙂 Они, как правило, не большие фанаты парного программирования. Они не будут жаловаться, если посадить с ними кого-то рядом, хоть это и будет их раздражать. Но если посадить с ними кого-то с меньшими навыками, то они воспримут это как возможность поупражняться и будут более открыты для общения. Они могут упорно набивать код, пока не начинают понимать, что за ними уже минут 30 наблюдает их партнер. В таком случае они передают эстафету с видом «ну пакажи на что ты способен». Вы можете воспринять это как покровительство, но со временем «герои» осознают, что и они могут получить плюсы, которые помогут им на их пути в нирвану.

Трололокодер

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

Техники парного программирования:

«Пинг-понг» программирование

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

Слияние пары и саморазвитие

Данная техника подразумевает обмен знаниями между более и менее квалифицированными программистами. Данная техника также характеризует «героя в наушниках». Некоторые люди не понимают преимуществ парного программмирования, но скажите им, что это для обмена опытом и они примут его. С течением времени они даже начнут наслаждаться им. Но, конечно, они всегда могут вернуться к своим наушникам =)

Удаленное парное программирование

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

Ротация пар

Иногда ротацию пар крайне сложно реализовать, потому что у нас быстро входит в привычку постоянно работать с тему же самыми людьми.
Основная цель данной техники для всех разработчиков — знать все наработки по всем задачам. Ротация пар крайне важна для поддержания команды в хорошей форме. Наибольшим преимуществом ротации пар является возможность быстрой подмены внутри пар, т.е. таким образом мы защищаем себя от возможных простоев по причине отсутствия одного из программистов внутри конкретной пары, поскольку все внутри команды знакомы с контекстом задачи. Я думаю, не стоит привязывать ротацию к каким-то определенным временным рамкам, поскольку никто не любит прерываться в середине выполняемой задачи.

Оригинал

Неоднозначные «приветствия мира»

Всё привыкли, что программисты — уравновешенные, спокойные, логически мыслящие люди..
Но по примерам кода, которые представлены ниже, так и хочется назвать некоторых из них — АДСКИМИ ПСИХОПАТАМИ !! +) Ну и конечно же в нашем обществе существует такой стереотип в основном о программистах на С..

Вынос мозга раз:

    #define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h>

Дваз:

#include<stdio.h>
main(){
int x=0,y[14],*z=&amp;y;*(z++)=0x48;*(z++)=y[x++]+0x1D;
*(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+0x03;
*(z++)=y[x++]-0x43;*(z++)=y[x++]-0x0C;*(z++)=y[x++]+0x57;
*(z++)=y[x++]-0x08;*(z++)=y[x++]+0x03;*(z++)=y[x++]-0x06;
*(z++)=y[x++]-0x08;*(z++)=y[x++]-0x43;*(z++)=y[x]-0x21;
x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
}

Триз:

#include<stdio.h>
#define __(a) goto a;
#define ___(a) putchar(a);
#define _(a,b) ___(a) __(b);
main()
{ _:__(t)a:_('r',g)b:_('$',p)
c:_('l',f)d:_(' ',s)e:_('a',s)
f:_('o',q)g:_('l',h)h:_('d',n)
i:_('e',w)j:_('e',x)k:_('n',z)
l:_('H',l)m:_('X',i)n:_('!',k)
o:_('z',q)p:_('q',b)q:_(',',d)
r:_('i',l)s:_('w',v)t:_('H',j)
u:_('a',a)v:_('o',a)w:_(')',k)
x:_('l',c)y:_('t',g)z:___(0x0)}

Четырез:

int n[]={0x48,
0x65,0x6C,0x6C,
0x6F,0x2C,0x20,
0x77,0x6F,0x72,
0x6C,0x64,0x21,
0x0A,0x00},*m=n;
main(n){putchar
(*m)!=''?main
(m++):exit(n++);}
 

Пздез:

main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
<<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
<<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
<<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
)))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
)<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
-((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
<<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
<<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
)<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
<<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
<<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
(((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
<<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
>>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
<(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
))) + (1<<1)); i++) printf("%c",n[i]); }
 

Как из плюсиков и минусов вырисовываются слова??

#include <stdio.h>
#define _(_) putchar(_);
int main(void){int i = 0;_(
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++i)_(++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++i)_(++++++++++++++
i)_(--++i)_(++++++i)_(------
----------------------------
----------------------------
----------------------------
----------------------------
----------------i)_(--------
----------------i)_(++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++i)
_(----------------i)_(++++++
i)_(------------i)_(--------
--------i)_(----------------
----------------------------
----------------------------
----------------------------
----------------------------
------i)_(------------------
----------------------------
i)return i;}

P.S. может у кого-то такой стиль используется на предприятии в качестве основного стиля форматирования и обфускации? o_O

Python 3.2 будет заточен под многопоточность

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

На этой неделе разработчики Python выпустили первую бету версии 3.2. В этой версии они сосредоточились над исправлением ошибок и общих улучшениях при этом сохранив синтаксис и семантику языка, которые были определенны в версии Python 3.0.

Хоть этот pre-release и не готов к использованию в production, но он хорошо показывает то, чего следует ожидать от финального релиза, который будет выпущен в феврале. Среди новых функций есть новый пакет, объединяющий набор функций, которые могли бы облегчить процесс разработки многопоточных приложений для многоядерных процессоров.

«В настоящее время Python имеет мощные парадигмы для построения многопоточных и мультипроцессорных приложений, но распаралеливание простых задач требует больших затрат». Новая высокоуровневая библиотека concurrent, будет содержать набор классов, которые смогут облегчить многопоточную разработку, например асинхронно выполнять различные вызовы.

Python 3.2 также имеет и ряд других новых функций, в том числе улучшение SSL (Secure Sockets Layer) модуля, новый модуль для доступа к информации о конфигурации и расширения, а также много другое..

Оригинал

18 лучших возможностей SSH

1) Cкопировать SSH ключ на USER@HOST для настройки беспарольной авторизации

ssh-copy-id user@host

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

2) Поднять туннель на 2001 локальном порту для доступа к 80 порту какой-либо машины

ssh -N -L2001:localhost:80 somemachine

Теперь вы можете получить доступ к сайту по ссылку http://localhost:2001/

3) Перенаправить вывод вашего микрофона на спикер другой машины

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

Это перенаправит звук с вашего микрофона на спикер порт машины подключаемой по SSH.
Качество звука очень плохое, так что вы услышите много шума.

4) Сравнить файл на удаленной машине с локальной копией

ssh user@host cat /path/to/remotefile | diff /path/to/localfile —

Очень полезно для поиска различий между файлами на разных машинах.

5) Монтировать папки через SSH

sshfs name@server:/path/to/folder /path/to/mount/point

Правда для этого вам сначала надо будет установить SSHFS http://fuse.sourceforge.net/sshfs.html

6) ssh соединение через промежуточную машину

ssh -t reachable_host ssh unreachable_host

Unreachable_host не доступен из локальной сети, но он доступен через сеть reachable_host. Эта команда создает соединение с unreachable_host через “скрытое” соединение с reachable_host.

7) Скопировать файл с HOST1 на HOST2, через ваш HOST

ssh root@host1 “cd /somedir/tocopy/ && tar -cf – .” | ssh root@host2 “cd /samedir/tocopyto/ && tar -xf -”

Крайне удобный способ копирования файлов, если HOST1 и HOST2 не имеют прямых соединений.

8) Удаленный запуск любый GUI приложений

ssh -fX @
SSH должен иметь в конфигурации:

X11Forwarding yes # в Debian такое значение установлено по умолчанию

9) Создать постоянное подключение с машиной

ssh -MNf @

Установить в фоновом режиме постоянное SSH соединение с машиной. Плюс к этом добавьте следующие настройки в файл ~/.ssh/config:
Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no
Все SSH соединения к этой машине будут идти через постоянный SSH socket. Это очень полезно, если вы постоянно используете SSH для синхронизации файлов, используя rsyns/sftp/cvs/svn, потому что при таких настройках не будут создаваться новые сокеты при выполнении каждой команды.

10) Подключить SCREEN по SSH

ssh -t remote_host screen -r

Напрямую подключить удаленную screen сессию (позволяет сэкономить на родительском процессе bash)

11) PORT KNOCKING!

knock 3000 4000 5000 && ssh -p user@host && knock 5000 4000 3000

Чтобы получить доступ к службе (ssh например) необходимо в определенном порядке постучаться на порты, а также чтобы закрыть доступ.
Необходимо установить knockd.
Пример конфига ниже.
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

12) Удалить ключ для хоста

ssh-keygen -R

Крайне удобно использовать, если у вас на одном IP часто переустанавливаются системы.

13) Запускать более комплексные шеловые команды

ssh host -l user $(> ~/.ssh/authorized_keys”

Если вы используете Mac OS X или какой-то другой вариант unix системы, в которой нет ssh-copy-id, то данный вариант поможет вам скопировать ваш публичный ключ на удаленную машину.

14) Проверка скорости передачи данный по SSH

yes | pv | ssh $host “cat > /dev/null”

подключается к машине по SSH и отображает скорость передачи данных, перенаправляя всю передаваемую информацию в /dev/null

Должен быть установлен pv
Debian: ‘apt-get install pv’
Fedora: ‘yum install pv’

15) Установить удаленную screen сессию, к которой можно переподключаться

ssh -t user@some.domain.com /usr/bin/screen -xRR

Задолго до появление вкладок в терминалах, людям приходилось использовать screen для того чтобы открыть несколько шелов в одном терминале. В реалиях SSH screen позволяет нам использовать несколько шелов в одному SSH подключении. Если вы отсоединитесь с помощью «Ctrl-a d» или у вас порвется SSH, то все процессы запущенные на удаленной машине останутся работать и будут ждать вашего возвращения. Другие полезные команды screen: «Ctrl-a c» — открывает новый шел и «Ctrl-a a» — переключаться между шелами.
Также можете ознакомится с небольшим гайдом по screen: http://aperiodic.net/screen/quick_reference

16) Возобновить передачу файла по SCP

rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file

Данная команда может возобновить и продолжить прерваную передачу файла через SCP.
Необходимо иметь rsync на обоих сторонах.
rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file local -> remote
или
rsync –partial –progress –rsh=ssh $user@$host:$remote_file $destination_file remote -> local

17) Открыть вечную SSH сессию

autossh -M50000 -t server.example.com ‘screen -raAd mysession’

Открывать ssh сессиб, которая постоянно открыта, очень удобно при нестабильном сетевом соединении.

18) Сгенерировать и скопировать SSH ключ

ssh-keygen; ssh-copy-id user@host; ssh user@host

Этот набор команд позволяет вам легко и быстро организовать себе беспарольный доступ на удаленную машину. Будьте осторожны, если у вас уже есть пара ключей в вашем ~/.ssh/ каталоге на локальной машине, т.к. есть возможность, что ssh-keygen может их перезаписать.