FastNetMon

Friday, 16 April 2010

Использование Pylons в продакшене: paster + Nginx

Разработку приложения можно вполне вести и на встроенном веб-сервере paster, но как только посещаемость увеличивается и Вы запускаете проект, то, безусловно, paster - не лучший выбор. Тут ем может помочь Nginx, выступающий в качестве reverse proxy!

Итак, имеем paster на 5000 порту:
http://127.0.0.1:5000


Ставим Nginx (здесь и далее - ОС Debian 5 Lenny):
apt-get install -y nginx


Удаляем конфиг стандартного сайта:
rm /etc/nginx/sites-enabled/default


Создаем новый:
vi /etc/nginx/sites-enabled/default


Со следующим содержимым:

server {
listen 80;
server_name domain.ru;

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

location / {
# передаем хостнейм Paster, хотя это не обязательно
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:5000;
}
}


Перезапускаем Nginx и применяем настройки:
/etc/init.d/nginx restart


Следом запускаем paster (иначе поулчим на 80м порту "502 bad gateway"):

cd myapp
nohup paster serve --reload development.ini &


Все, теперь открываем сайт http://domain.ru и любуемся видом нашего Pylons проекта.

Thursday, 15 April 2010

А тем временем, в порыве креатива у меня родился новый термин - "специалист на 8 часов"

Что он значит, думаю, сами догадаетесь? :)

Error: database disk image is malformed

yum upgrade
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: centos.intergenia.de
* base: centos.copahost.com
* extras: centos.copahost.com
* updates: centos.copahost.com
Error: database disk image is malformed


Фикс очень прост:
yum clean all

Нужно ли для MySQL покупать много памяти и SSD диски?

http://www.mysqlperformanceblog.com/2010/04/08/fast-ssd-or-more-memory/

Думаете, видели поистине огромные MySQL запросы? Ошибаетесь.

Вот такое чудо выдернул утром с одной CMS, нещадно насиловавшей MySQL: http://paste.org/pastebin/view/17403

CentOS и CRON

На одном из CentOS серверов от FastVPS заметил отсутствие CRON в принципе, что меня довольно удивило. И ведь правда - не было.

Пришлось поставить вручную:
yum install -y vixie-cron


И запустить:
/etc/init.d/crond start


В автозагрузку же он попал без моего вмешательства :)

vzquota : (warning) Incorrect quota shutdown for id xxx, recalculating disk usage

Такая ошибка свидетельствует, что OpenVZ квота для данного контейнера была разрушена и требует пересборки, это довольно длительный процесс (до десятков минут), но от Вас требуется одно - ждать.

vzctl start xxxxx
Starting container ...
vzquota : (warning) Incorrect quota shutdown for id xxx, recalculating disk usage
Container is mounted
Adding IP address(es):xx.xx.xx.xx
Setting CPU limit: 200
Setting CPU units: 500000
Setting CPUs: 2
Configure meminfo: none
Set hostname: yyyy.xxxx.ru
Setting quota ugidlimit: 2048
Container start in progress...

Wednesday, 14 April 2010

Мониторинг отброшенных / принятых соединений в iptables без dmesg

Стандартным способом узнать, какие именно соединения / пакеты принял iptables является цель -j LOG, которая выбрасывает их в кольцевой буфер ядра, dmesg. Но это крайне неудобно по двум причинам - замусоривается dmesg, где могут быть крайне важные и полезные сообщения от ядра, а также неудобно читать и следить за логом (да, есть klogd).

Тут нам на выручку приходит ULOG, позволяющий по netlink отправить сообщения о пропущенных / заблокированных пакетах в userspace, где их встретит демон.

Вот выдержка из мана по iptables:
This target provides userspace logging of matching packets. When this target is set for a rule, the Linux kernel willmulticast this packet through a netlink socket. One or more userspace processes may then subscribe to various multicast groups and receive the packets. Like LOG, this is a "non-terminating target", i.e. rule traversal continues at the next rule.


Самое важное во всем этом то, что ULOG является не детерминирующим правилом, то есть после -j ULOG пакет будет пропущен дальше и если Вы хотите таки его отбросить, нужно следующим правилом добавить -j DROP.

Мое правило, работу которого я хочу контролировать логом имеет вид:
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Чтобы сначала пакеты зафиксировать в ULOG нужно перед ним добавить еще одно правило:

-A OUTPUT -p tcp -m tcp --dport 25 -j ULOG --ulog-prefix "SMTP25BLOCK" --ulog-cprange 0 --ulog-qthreshold 50
-A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Ставим:
apt-get install -y ulogd


После установки ulogd создает два лога:

/var/log/ulog/ulogd.log - системный, хранит информацию о работе демона
/var/log/ulog/syslogemu.log - лог трафика, сюда как раз будут записываться прошедшие через ULOG пакеты


Запускаем:
/etc/init.d/ulogd start


Пробуем коннект наружу:
telnet mail.ru 25
Trying 217.69.128.45...
^C


Получаем один пакет, зафиксированный ULOG и один отброшенный:

iptables -nvL
Chain OUTPUT (policy ACCEPT 1546 packets, 2211K bytes)
1 60 ULOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 ULOG copy_range 0 nlgroup 1 prefix `SMTP25BLOCK' queue_threshold 50
1 60 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25


Вот и все, запись о нашей попытке запсиана в лог:

tail /var/log/ulog/syslogemu.log
Apr 14 21:48:19 v1 SMTP25BLOCK IN= OUT=eth0 MAC= SRC=xx.xx.xx.xx DST=yy.yy.yy.yy LEN=60 TOS=10 PREC=0x00 TTL=64 ID=29311 DF PROTO=TCP SPT=50089 DPT=25 SEQ=731105051 ACK=0 WINDOW=5840 SYN URGP=0


Ну вот и все :) Разве что у меня остался вопрос, как добавить сюда uid/gid приложения пытавшегося осуществить отправку. Но он, к сожалению, не решается в рамках ULOG, так как только у цели LOG есть ключик --log-uid, который как раз логгирует uid отправителя.

Потрясающий доклад Павла Кудинова

Прошу: http://pavel-kudinov.livejournal.com/69412.html

Debian, MySQL: лог /var/log/mysql.log всегда пустой - это нормально?

Предполагаю, что это бага, ибо на Центосе он хотя бы сообщал в логе о том, что запустился или если у него слетели таблицы после ребута.

Как ограничить потребление памяти Java приложением?

http://www.hostsvault.com/blog/howto-limit-java-application-memory-specially-on-a-vps/

Запуск двух MySQL инстансов на одном сервере

http://www.hostsvault.com/blog/howto-run-two-instances-of-mysql-in-the-same-server/

OpenVZ + noatime для EXT3

Инго Молнар говорит про atime следующее:

Ingo Molnar stressed the significance of fixing this performance issue, "I cannot over-emphasize how much of a deal it is in practice. Atime updates are by far the biggest IO performance deficiency that Linux has today. Getting rid of atime updates would give us more everyday Linux performance than all the pagecache speedups of the past 10 years, _combined_."


(c) http://kerneltrap.org/node/14148

Для OpenVZ же кроме этого есть еще опция непосредственно для отключения/включения noatime для определенных VE:

--noatime yes|no Sets noatime flag (do not update inode access times) on file system.


(c) man vzctl

Например, вот так будет выглядеть команда для отключения atime для определенного VPS:
vzctl set 101 --noatime yes --save
vzctl restart 101


(c) http://www.hostsvault.com/blog/how-to-reduce-disk-partition-io-access-time/

Но обращаю внимание, что есть софт (мало-мало-мало), который от такого сломается. Хотя если у Вас хостинг сервер - Вам бояться нечего, в типичном LAMP такой софт фактически отсутствует.

А еще есть самое-самое надежное подтверждение надежности этой опции - оф руководство по Virtuozzo: http://download.swsoft.com/virtuozzo/virtuozzo4.0/docs/en/lin/VzLinuxClustering/20091.htm

InnoDB теперь стандартный Storage Engine для MySQL начиная с версии 5.5

http://www.nixp.ru/news/InnoDB-%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%81%D1%8F-%D0%B4%D0%B2%D0%B8%D0%B6%D0%BA%D0%BE%D0%BC-%D0%91%D0%94-%D0%BF%D0%BE-%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E-%D0%B2-MySQL.html

Что будет с пхп, если он найдет в своем php.ini директиву от отключенного модуля?

А хрен его знает :) Ща протесчу.