воскресенье, 8 июля 2012 г.

11 «рецептов приготовления» MySQL в Битрикс24

11 «рецептов приготовления» MySQL в Битрикс24

Хотя мы на своих проектах битрикс используем только там, где важнее скорость разработки, фреймворк конечно не идеален, подводных камней море, но ничего сильно лучше даже из платных пока не встречали.
А вот проекты, где ожидаются большие нагрузки, уже переписываем на других цмс, в том числе на нашей собственной. Причин много. В частности, bitrix corportal тормозит на честном 8-ядернике, саппорт помогать отказывается (действующая лицензия разработчика. При запросах помощи - общие слова, отсылки на форум, и фразы вроде "у вас не работает LocalRedirect и пока не поправите, помочь ничем не можем". При том, что это их баг, который точно не виноват - сайт на https висит, но дальше на nginx общение с апачем по http. Итд.).
Причина в их технологии "инфоблоки". Все ускорения вроде APC, memcached, nginx, тюнинга БД были выполнены. А в нормальной цмс копаться в самом движке - идея крайне плохая.

среда, 4 июля 2012 г.

свичи raisecom

Прикупили модель iscom2128, которая интересна тем, что у нее 24 сотки и 4(!) гигабит комбо порта (медь+SFP)
При этом это наиболее странная железка, с какой приходилось работать из таких свичей. Синтаксис собственный, во многом нелогичный (например, обычно айпи вешают не на порт, а на vlan, а тут непойми на что). Работа  в вланами совершенно непонятна, развешивание режимов работы портов, всяких tagged-untagged и прочего на цисках/эджкорах осваивается за пол часа, тут за 2 дня настроить не удалось и было отложено на год+. Благо, пока неактуально... итд.

Итак, что читать
общее описание (введение)
по свичу

Некоторые ошибки mysql 5.5

1 В оригинальном 5.5 и модификациях типа перконы убрана из блока mysqld опция default-character-set, в результате в логе может быть ошибка
mysqld: unknown variable 'default-character-set=cp1251'

В секции [client] она рабочая.
Решение: убрать эту опцию из [mysqld] и добавить
init-connect='SET NAMES cp1251'
также возможно
skip-character-set-client-handshake
Если нужна именно такая строка - оставайтесь на 5.1/5.0

2 Странная ошибка в debian
ERROR 1133 (42000): Can't find any matching row in the user table
при попытке выполнить
grant all privileges on test.* to user@localhost identified by 'pass';
Причина первая: если такого юзера нет, и прописываем identified by '' - надо сначала создать юзера. Багу много лет, но никому нет дела. Но вообще юзеры без пароля - плохая практика.
Если что - создать юзера: CREATE USER 'user'@'localhost' IDENTIFIED BY 'some_pass';
Но если и на create user выдаст
ERROR 1396 (HY000): Operation CREATE USER failed for 'user'@'localhost'
то всё грустно. См причину 2, и ошибку 3.
Причина вторая: надо сделать flush privileges и после этого команда отработает как надо. Но один раз вызвало ошибку номер 3 (см ниже)

3 Ошибка в debian, с которой за неделю довелось столкнуться десяток раз:
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
Часто каким-то образом следовало из ошибки 2. Это спец юзер для обслуживания сервера, характерен только для debian.
Сначала делаем
cat /etc/mysql/debian.cnf
и копируем оттуда пароль. теперь коннектимся от рута к базе (если он неизвестен - есть опция --skip-grant-tables) и выполняем запрос
GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'пароль-из-файла-выше';
flush privileges;

Некоторые указывают GRANT ALL PRIVILEGES... WITH GRANT OPTION; но я не знаю, есть ли в этом нужда и не опасно ли это.

4 особенности с includedir
Багу также много лет. Игнорируются файлы, в названии которых больше одной точки, плюс расширение обязано быть .cnf, что означает полную недопустимость точек в имени до расширения.
Например, general.cnf будет учтён, а вот general.mynode.cnf будет просто проигнорирован. Судя по тому, что на ошибки в таких файлах не ругается, их даже не открывает.

вторник, 3 июля 2012 г.

Разные robots.txt

Зачастую бывает так, что несколько сайтов указывают в 1 каталог. Чаще всего это характерно для поддоменов. И бывает нужно отдавать на разные домены разные robots.txt.
Решения задачи:
0) передавать на обработку этого файла апачу, который уже скриптом будет отдавать нужный текст.

1) под каждый поддомен создать свой server c разными root

2) rewrite + map
map $host $robots {
    default robots.txt;
    one.domain.com one.domain.robots.txt;
    ...
}

server {
    location = /robots.txt {
        alias /path/to/$robots;
    }
    ...
}
(линк), "для любителей граблей"

3) через try_files
location = /robots.txt {
    try_files /$host.robots.txt /robots.txt =404;
}
Для работы должен быть определён root. Можно и в блоке robots, если например эти файлы вынесены в отдельное место.

понедельник, 2 июля 2012 г.

nginx: regex в server_name

Штатно есть весьма удобный функционал с регэкспами в server_name (далее блок), позволяющий весьма интересные трюки. (дока) Но проблема в том, что использование таких регэкспов таит много подводных камней.
Например, если мы определили .site.ru, регулярки на отдельный блок, даже если оно помещено выше главного блока, работать не будут. Вот такой прикол.
Причина в том, что у регулярок приоритет минимален и выбираются они, когда остался только блок по умолчанию (что неявно и описано в доке выше).

Для примера возьмём задачу редиректа с доменов вида www.sub.site.ru на sub.site.ru (где поддоменов sub может быть десятки и сотни). Правильнее всего вынести домены, с которых нужен редирект, в отдельный блок. Но вроде простая задача "в лоб" не решается, см. описание выше. Поэтому придуманы варианты (в порядке возрастания извращений, но не быстродействия):
0) передать заботу редиректов фронтенду. Тому же апачу.

1) в главный блок пихать
if ($host ~* ^www\.(w+\.site\.ru)$) {
set $newdomain $1;
rewrite ^(.*)$ http://$newdomain$1 permanent;
}
Но... IfIsEvil

2) улучшенный 1). Подключить встроенный перл и им обрабатывать $host

3) для каждого поддомена www.(sub).site.ru сделать отдельный блок и там return 301 sub.site.ru. Идеальный вариант, если поддоменов 1-10 и-или их количество расти не будет. Задача частично может решиться скриптами автогенерации блоков. Для нагруженных серверов пожалуй оптимальный вариант.

4) Пропихнуть в nginx патчи для поднятия приоритета регэкспам.

Но есть вариант проще, тоже вполне рабочий.
server {
    server_name ~^www\.(\w+\.site\.ru)$;
    return 301 http://$1$request_uri;
}

server {
    server_name site.ru www.site.ru ~^\w+\.site\.ru$;
    ....
}

!!! В таком описании указывать *.site.ru или .site.ru недопустимо! Отвалится первый блок.

Для облегчения работы можно в первом блоке сделать именованную переменную (иначе при первом же регэкспе во всяких там location потеряем значение), тогда будет так:
server_name ~^www\.(?<domain>.+\.site\.ru)$;
и работаем с $domain
или потом в коде установить переменную
set $newdomain $1;

четверг, 28 июня 2012 г.

Как стереть файл с непечатным именем

Обнаружили в одном месте файл с именем из 1 непечатного символа, при этом через ls -la его показывало как "?", а через ls -1 просто пустая строка. rm такое не возьмёт. Тут на помощь приходит find, только сначала надо получить inode файла и потом его указать find-у.

# ls -1i | head -2
473779
457021 README

# find . -inum 473779 -delete

Всё, удалили.

вторник, 26 июня 2012 г.

selectel: лимиты облака

"Вы достигли ограничения по-умолчанию на количество виртуальных машин в облаке."

Оказалось, лимиты в облаке selectel - 11 вирт машин. Но можно написать запрос, и лимит увеличат.

"Лимиты введены по соображениям безопасности и рационального использования ресурсов. Эта мера помогает быстро отсеивать недобросовестных пользователей генерирующих мусорный трафик или распространяющих зловреды."

К каждой машине может быть подключено не более 15 дисков. Лимит диска 1.7Тб.
Уменьшению не подлежит. Изменение размеров только на отключенном диске/выключенной системе.
http://habrahabr.ru/company/selectel/blog/117969/

четверг, 21 июня 2012 г.

apache и nginx: сайт по умолчанию

nginx:
server {
    listen       80 default_server;
    server_name  _;
}


Если у директивы есть параметр default_server, то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес:порт. Если же директив с параметром default_server нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес:порт.

До версии 0.8.21 этот параметр назывался просто default.

дока

apache:
<VirtualHost _default_:*>
    DocumentRoot /var/www/default
    ErrorLog /var/www/default/error_log
</VirtualHost>

среда, 20 июня 2012 г.

dd со статистикой

Можно для получения статистики посылать сигнал SIGUSR1, но во фре например у меня этот сигнал просто прибивал dd.

Рабочий вариант:
dd if=/dev/sda bs=8M conv=sync,noerror | pv -c > /dev/sdb
или в файл
dd if=/dev/sda bs=8M conv=sync,noerror | pv -c | gzip -c > /mnt/backup/sda.img

apache: client denied by server configuration

В лине можно словить эту ошибку.
Причины: в конфиге прописано
<Directory "/">
    ...

    AllowOverride none
    Options none
</Directory>

Фикс: написать в конфиг

<Directory "/var/www/site">
    ...
    Allow from all
    AllowOverride All
    Options +FollowSymLinks
</Directory>

Для битрикса по сути нужно только AllowOverride FileInfo

Можно просто убрать "лишние" строки из главного конфига, но по ряду причин лучше попытаться переопределить нужные. Это и безопаснее, и автообновление конфига не отвалится.

четверг, 14 июня 2012 г.

Эпическое тестирование 15 SSD объемом 120-128 Гбайт

Эпическое тестирование 15 SSD объемом 120-128 Гбайт

И оттуда же основные типы контроллеров:
Для начала разберемся с основными платформами, на которых строятся SSD. Подавляющее большинство дисков сейчас делают на контроллерах SandForce SF-2281 и Marvell 88SS9174. Свой собственный контроллер использует Samsung в приводах серии SSD 830. OCZ не так давно тоже начала выпускать накопители с контроллерами «домашнего» производства Indilinx Everest и Everest 2. Ну и не будем забывать о платформе Intel, которая играла значительную роль в эпоху накопителей для шины SATA 2 Гбит/с и пиком развития которой стала линейка Intel SSD 320. До современных стандартов Intel ее не дотянула и теперь вместе со всеми для производства топовых накопителей прибегает к услугам SandForce и Marvell.

вторник, 12 июня 2012 г.

Чуть более 20 хороших советов по MySQL

Объединение из 2 частей, с подправленной грамматикой (переводил китаец -- в оригинале полно фразочек типа "Значения в нем храниться так же, как...").

Оригинал: http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/

Перевод:
часть 1
часть 2

вторник, 5 июня 2012 г.

LVM: основные операции

небольшое отступление: после zfs - lvm кажется дико кривым и неудобным, поэтому и возникла необходимость в памятке об основных операциях.

Плюс, поскольку оно не умеет и уровни рейда кроме jbod (объединение пачки дисков в единое пространство), необходимо сначала создать нужные рейды средствами системы/контроллера, и работать уже с этими дисками.

шаг 0: в дебиане надо поставить пакет lvm2 (apt-get install lvm2), а то ничего не получится.

На 2 уровне из реальных дисков (PV, physical volume) собираем "диски" VG (volume group), с которыми уже работает lvm. Можно собрать 1 диск из нескольких реальных, но это опасно: отказ любого из реальных дисков приведет к недоступности всей группы, поэтому лучше собрать рейд нужного уровня, создать на нём pv, и чисто из него сделать vg.

"Загрузка с LVM возможна, но не рекомендуется. Так что у Вас есть отдельный раздел для этого." (линк)

Также есть заблуждение, что расширить том lvm легко, но это не совсем так: если у нас есть куда расширять, делается lvextend, для ext2 расширяемый раздел перемонтируется в режим чтения и потом (xfs_grow|resize2fs).
Другое дело, если мы в облаке (selectel, parking...) и увеличили жесткий диск. Тут нужен будет бубен, потому что скорее всего придется поплясать. Пример запущенного случая: 3 раздела (boot, своп, и extended, на котором еще 1 раздел уже с lvm). Описание ниже.

Устройство по слоям
> pv > vg > lv
PV, Physical volume, физический том. Обычно это раздел на диске или весь диск. В том числе, устройства программного и аппаратного RAID (которые уже могут включать в себя несколько физических дисков). Физические тома входят в состав группы томов.
VG, Volume group, группа томов. Это самый верхний уровень абстрактной модели, используемой системой LVM. С одной стороны группа томов состоит из физических томов, с другой -- из логических и представляет собой единую административную единицу.
LV, Logical volume, логический том. Раздел группы томов, эквивалентен разделу диска в не-LVM системе. Представляет собой блочное устройство и, как следствие, может содержать файловую систему.
PE, Physical extent, физический экстент. Каждый физический том делится на порции данных, называющиеся физическими экстентами. Их размеры те же, что и у логических экстентов.
LE, Logical extent, логический экстент. Каждый логический том делится на порции данных, называющиеся логическими экстентами. Размер логических экстентов не меняется в пределах группы томов.
http://xgu.ru/wiki/LVM

Создание раздела
Последовательность pvcreate /dev/sda -> vgcreate vg0 /dev/sda -> lvcreate -l +10%FREE -n lv-name

Сначала надо разметить раздел или весь диск как lvm. Лучше отдать под лвм весь диск, но это накладывает некоторые ограничения, в частности не получится поставить потом в зеркало диск такого же размера "на бумаге", но меньший по секторам, зато обслуживать такой диск куда проще. Если же создать хоть 1 раздел и уже его добавлять, то не будут зеркалироваться такие вещи как загрузочные сектора.
pvcreate /dev/sda

Потом из этих pv собираем "диски" VG (volume group), с которыми уже работает lvm. Можно собрать 1 диск из нескольких реальных, но это опасно: отказ любого из реальных дисков приведет к недоступности всей группы, поэтому лучше собрать рейд нужного уровня, создать на нём pv, и чисто из него сделать vg.
Получили vg-диск, который уже можно нарезать на разделы, это уровень lv (logical volumes). так что lvcreate в помощь.
Можно изменять размеры в байтах (-L +10G), в блоках по 4М (-l +100), в процентах (-l +10%FREE)

Изменение размеров
Если просто использовать свободное место из резерва, то это делается в 2 команды - lvresize и resize2fs.
Если же изменился жесткий диск (облако или dd на новый бОльшего размера) и надо расширять vg - придётся повозиться.
Тут 2 пути:
1) увеличиваем размер базового тома (возможно не всегда, например если следом уже есть раздел)
2) создаём ещё том и подключаем его в текущую структуру

1 сводит на нет и без того скудные возможности lvm, поэтому правильнее использовать 2.

Итак, 3 раздела (boot, своп, и extended, на котором еще 1 раздел уже с lvm). Чтобы изменить размер в таком случае, действия:
1) расширить физический диск. К слову, на паркинге изменение с 20 до 40 гиг - даунтайм 1.5 часа.
2) растянуть extended, в помощь parted, cfdisk, sfdisk. Есть ещё fdisk, но в дебиане он неюзабелен абсолютно, в других операционках работает как надо. Впрочем, в дебиане вообще с разметкой диска очень грустно, но это система для гуру и извращенцев. parted тоже отличается особым "умом" в любом линуксе (хинт: есть опция print free, цифры оттуда используем для mkpart). А cfdisk хорош, но любит ругаться на выравнивание разделов, причём считает любое отклонение критической ошибкой.
3) Создать на пустом месте в extended новый раздел
4) сделать на этот раздел pvcreate
5) добавить его в группу vgextend
6) увеличиваем lv: lvextend -l +100%FREE /dev/vg0/root
7) А теперь увеличим фс.. для ext* в помощь resize2fs(e2fsprogs), только для ext2 сначала перемонтировать систему в RO, иначе можно всё сломать.. если вообще даст что-то сделать. Или вообще отмонтировать. Про ext2 подробнее

Всего 7 шагов, на которые без опыта спокойно уходит неделя и есть реальные шансы всё убить.

Отдельно стоит уменьшение, но это нужно редко..

пятница, 1 июня 2012 г.

debian, apache и конфиги сайтов с _

Для удобства у меня каждый домен в отдельном конфиге, грузятся через include sites-enabled/*.conf
Такая схема работала в центоси и фре.. а в дебиане баг: если файл начинается с _, он игнорируется (так сделаны поддомены, чтобы они грузились раньше основных доменов).

Оказывается, это очередная "фича" дебиляна.

"Это патч Debian: debian/patches/008_make_include_safe.
Первый символ -- обязательно должен быть alphanumeric, остальные -- alphanumeric + подчёркивание, дефис или точка.
Варианты как лечить:
- переименовать файлы(более нормальная и распространённая практика, чтобы задавать приоритеты -- называть файлы 00-example.com и т.п.);
- пересобрать apache самостоятельно без этого патча, ну и пересобирать по мере выхода новых версий;
- почти на bugs.debian.org и объяснить, что файлы, начинающиеся на _ -- это хорошо.

Варианты расставлены в порядке их правильности/реальности осуществления(от более реальных к менее реальным)."
(линк)

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