пятница, 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 их не видно и можно сделать чего-нибудь не очень легко обнаружимое. Но причины запрета _ мне кажутся бредом.

среда, 30 мая 2012 г.

apache: LogLevel warn

По умолчанию апач обычно пишет в логи только уровень error и выше. Меняем на warn и выше: после ErrorLog пишем
LogLevel warn

и перезапускаем апач.

понедельник, 28 мая 2012 г.

FreeBSD: ставим пакеты

Некоторый софт проще и быстрее поставить из пакетов, а не портов, особенно это касается такого софта как m4, ruby (для меня это просто побочный пакет, не более) итд.
У portinstall для этого есть хороший ключик -PP (packages-only)

Я не знаю, как сделать что-то вроде
cd /usr/ports/sysutils/smartmontools && make package, поэтому способ чуть сложнее, для этого можно посмотреть нужные пакеты в
http://ftp6.ru.freebsd.org/pub/FreeBSD/ports/packages/All/
(много файлов!)

cd /usr/ports/ports-mgmt/portupgrade
make package-depends-list

cd /usr/ports/packages
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/ports/packages/All/ruby-1.8.7.358%2c1.tbz"
pkg_add *

(запятую заменяем на %2c или просто берем аргументы для fetch в кавычки)

По идее, есть опция USE_PACKAGE_DEPENDS, но чего-то она не работает.

Установка FreeBSD 9 c ZFS

Ставим freebsd с корнем на zfs

Что 8, что 9 инсталлер штатно не умеет zfs, поэтому надо на обоих грузиться в консоль. Отличия в том, что в 8 это был выкидыш fixit, который был крайне, дико убог, а в 9 появился нормальный shell, который и листать историю умеет, и ls есть, и вообще поведение уже человеческое.

Под 8 версию уже был мануал, теперь сделаем под 9.

Итак, сначала надо удалить все старые разделы. Для 9 сата диск будет ada0

У меня была пачка разделов вида ada0s1{a-g}
gpart delete -i 1 ada0s1
gpart delete -i 2 ada0s1
...
gpart delete -i 1 ada0
gpart destroy ada0

Очищено.
Теперь надо создать разметку (gpt)
gpart create -s GPT ada0

Создадим boot-раздел со смещением в 1Мб (выравнивание на 1Мб полезно, особенно когда диски с 4к секторами), размером 128кб
gpart add -b 1M -s 128k -t freebsd-boot ada0

Теперь файл подкачки. Есть вариант размещения в zfs-пуле, но при падении мы не сможем записать дамп памяти. С другой стороны, нам не придётся тогда зеркалировать своп на случай отвала одного из дисков, поскольку это будет обеспечивать сам zfs. В любом случае, проще сейчас выделить несколько Гб под своп, и при необходимости подключить его, чем возиться потом со смещением рабочего пула и выделением места.
gpart add -s 4G -t freebsd-swap ada0

Потом сам пул.
gpart add -t freebsd-zfs ada0

Осталось поставить загрузчик (см заметку 1)
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

Первая часть закончена. Смотрим gpart show ada0, всё ли в порядке, и переходим к разметке пула.

Если ставим систему на 1 диск, а потом хотим сделать зеркало на 2 - это можно сделать (см первую заметку), но для raid-z без извратов так не сделать, поэтому ставить надо будет сразу на полный набор дисков.

Загрузим zfs
kldload zfs

Создадим сам пул.
zpool create -O atime=off -m /mnt/zfs pool ada0p3

Тут можно получить
cannot mount '/mnt/zfs': failed to create mountpoint
Это потому, что мы загрузились с диска, который примонтирован в RO, так что надо или перемонтировать на запись, что глупо, или использовать место, доступное для записи, например tmp. У меня этот раздел всего 20Мб, но много и не надо - пустой каталог много не занимает, mountpoint и подавно. Но и повторно запустить команду уже не даст - пул создан, просто не примонтирован. Впрочем, примонтировать пул целиком мы уже не сможем - параметр altroot можно задать только при создании. Если сильно надо - надо удалить старый пул (zpool destroy -f pool) и пересоздать. Но сильно это не нужно - просто вместо полных путей надо будет использовать через имя пула (pool/tmp) и потом руками примонтировать созданные каталоги на свои места.

Делаем пул загрузочным
zpool set bootfs=pool pool

!!! Надо переместить хранилище zpool.cache, иначе после перезагрузки у нас пул будет не найден!!!
zpool export pool
zpool import -o cachefile=/tmp/zpool.cache pool
Как мы уже столкнулись, вся корневая ФС у нас в RO, поэтому системе некуда сохранять информацию о нашем пуле и мы не сможем её потом скопировать на наш диск.

Дальше создаем структуру пула, см заметку 1 и линки ниже.
(...)

А теперь сложный момент. Если мы грузились с полного образа -- у нас на диске есть все нужные файлы (в 8 файлы были в /dist, в 9 они переехали в /usr/freebsd-dist), но что если это была версия bootonly? тут будет ещё шаг - надо поднять сеть и выкачать нужные файлы или воспользоваться sysinstall.
Сделаем через выкачать нужное (gentoo-way)
cd /tmp/zfs/tmp
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/base.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/kernel.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/src.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/doc.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/lib32.txz" (только для amd64)
Формат файлов xz, поэтому для tar ключи будут такие:
tar --unlink -xpJf file -C path
x - extract
p - restore Permissions
J - xz
f - файл для распаковки
--unlink
-C - change to (dir) - куда распаковать

Если у нас полный дистр был - просто делаем
cd /usr/freebsd-dist

Готовимся к установке.

Распаковываем вручную или скриптом
export DESTDIR=/tmp/zfs
for file in base.txz doc.txz kernel.txz src.txz lib32.txz; do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}) ; done

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

Почему тут нет портов -- поскольку я обновляю через portsnap, первый раз надо сделать extract, так что в данном случае это только зря 1 пакет выкачивать.

Скопируем описание нашего пула в новое место.
cp /tmp/zpool.cache /tmp/zfs/boot/zfs/

Настроим систему.
chroot /tmp/zfs /bin/csh

cat << EOF > /etc/rc.conf
zfs_enable="YES"

hostname="host"
ifconfig_re0="DHCP"

sshd_enable="YES"
EOF

cat << EOF >> /boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:pool"
EOF

Если памяти мало, туда же вписываем параметры для zfs

В /etc/fstab:
/dev/ada0p2 none swap sw 0 0
Или можно через метку, если определяли.

Настроим время
tzsetup

!!! Если мы планируем потом попасть в эту систему по ssh - необходимо сделать 2 вещи:
pw useradd remoteuser -m -G wheel
passwd

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

Последний этап -- подготовка к перезагрузке.
exit

zfs unmount -af
cd /
zfs set mountpoint=legacy pool
zfs set mountpoint=/usr pool/usr
zfs set quota=4G pool/tmp
zfs set mountpoint=/tmp pool/tmp
zfs set mountpoint=/var pool/var

reboot

После перезагрузки у нас должна получиться рабочая система.

Если вдруг потребовалось загрузиться в single mode, корень будет в RO, перемонтировать через mount и zfs mount не поможет - это атрибут раздела. Изменить:
zfs set readonly=off pool

Линки
http://wiki.freebsd.org/RootOnZFS
http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror
http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot
http://wiki.opennet.ru/ZFS_%D0%B8_FreeBSD
http://www.lissyara.su/articles/freebsd/file_system/root_zfs_gpt/ Эта заметка достаточно подробная, хоть и сайт бизграмматных школьнегов.
https://sites.google.com/site/luzanov/freebsd/zfs/root_zfs - тут есть скрипт bsdinstall, но для начала надо хотя бы пару раз провести все операции вручную, чтобы понять что там вообще происходит.

воскресенье, 27 мая 2012 г.

svn: Can't convert string from 'UTF-8' to native encoding

svn: Can't convert string from 'UTF-8' to native encoding:
...

Характерно для freebsd, поскольку он не умеет utf-8. Решение:
setenv LC_CTYPE "ru_RU.CP1251"
setenv LANG "ru_RU.CP1251"

(как минимум работает в csh, так что можно дописать в .cshrc)

линки
http://chatlogs.jabber.ru/freebsd@conference.jabber.ru/2008/11/22.html
http://stackoverflow.com/questions/2116718/svn-error-cant-convert-string-from-native-encoding-to-utf-8

debian: percona, свежий nginx и subversion 1.7

Поскольку иногда требуется перкона + в штатной поставке ну вообще древний nginx аж 1.7 ветки, надо подключать доп репы:

nginx
http://wiki.nginx.org/Install

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

percona
Перкона молодцы, у них есть репы для основных линукс-дистрибутивов.
http://www.percona.com/docs/wiki/repositories:apt

deb http://repo.percona.com/apt  squeeze main
deb-src http://repo.percona.com/apt  squeeze main

subversion
Штатный 1.6, и обновлять его не собираются, но мы давно перешли на 1.7, в частности из-за только 1 каталога .svn в корне проекта вместо тучи по всем каталогам.


deb http://opensource.wandisco.com/debian/ squeeze svn17

Эти строки в /etc/apt/sources.list

И ключи

nginx
gpg --keyserver  hkp://keys.gnupg.net --recv-keys ABF5BD827BD9BF62
gpg -a --export 7BD9BF62 | apt-key add -

percona
gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
gpg -a --export CD2EFD2A | apt-key add -

subversion

gpg --keyserver  hkp://keys.gnupg.net --recv-keys E9F0E9223BBF077A
gpg -a --export 3BBF077A | apt-key add -

После этого делаем
apt-get update

Что странно: на оф странице ничего про эти ключи не было сказано, но по аналогии с перконой всё оказалось очень просто: после apt-get update получили ошибку

W: GPG error: http://nginx.org squeeze Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62
Номер ключа у нас есть, подставили в 1 команду вместо ключа перконы, получили
gpg: requesting key 7BD9BF62 from hkp server keys.gnupg.net
gpg: key 7BD9BF62: public key "nginx signing key <signing-key@nginx.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
Вот и номер ключа есть, его во 2 строку.

Теперь можно поставить percona-server-server и nginx
Для перконы советую также поставить percona toolkit (пакет percona-toolkit), замена maatkit-у.

C свн - проще снести старую версию и поставить новую, в конце напишет

Setting up subversion (1.7.5-1+WANdisco) ...
Setting up libsvn1 (1.7.5-1+WANdisco) ...

вторник, 22 мая 2012 г.

git: post-receive hook

При попытке реализовать хук в гите на post-receive, сначала постоянно будет лезть ошибка
error: git-shell died of signal 13
fatal: The remote end hung up unexpectedly
error: error in sideband demultiplexer

Дело в том, что данный хук сделан каким-то извращенцем, поэтому аргументы хуку передаются через stdin и единственно верный (официально) метод чтения (для sh):

while read oldrev newrev refname
do
...
done

На другие языки переписать по аналогии.

И попутно заметка: если был коммит в мастер, запустить ssh
#!/bin/sh
while read oldrev newrev refname
do
        if expr "$refname" : '.*master$' >/dev/null; then
                ssh user@server.local /var/www/site/up
        fi
done


суббота, 12 мая 2012 г.

FreeBSD в DomU на xen

В HVM запустить не проблема: подключаем диск, сдром, указываем vnc-опции. (подробно - по ссылкам ниже есть)
!! Есть проблемы запуска на AMD, разные версии не запускаются по разному. В результате платформа была заменена на интел.
!!Хорошие новости: Microsoft обеспечит официальную поддержку платформы виртуализации Hyper-V во FreeBSD
Дело в том, что цитрикс, текущий владелец хена, также хороший партнер мелких. Так что кодовая база hyper-v и xen как минимум пересекается, а значит наработки для hyper-v появятся в xen + код, который будет отдан в freebsd, также будет поддерживать и xen. Так что скорее всего через годик фря будет работать и в hvm на всех платформах, и в pv, и драйвера отладят нормально.

PV-режима под amd64 нету. Есть ядро с pv-xen драйверами, так что это будет смешанный режим - запускаться как hvm, но сеть например в pv. Для продакшена не очень хорошая идея, но для тестов и разработки сгодится.
Под i386 есть конфиг XEN - собираем ядро, ставим его куда-либо, откуда можно будет вытащить (make KERNCONF=XEN DESTDIR=/root/myboot kernel), подсовываем в конфиг в dom0. Можно через pygrub (где-то было, что заменяется на pv-grub), но там есть нюансы, напрямую оно не запустится.
Но чтобы собрать ядро, надо уже иметь систему в hvm, что у меня было сделано. С нуля - есть в интернете готовые ядра, проблема найти посвежее. По линкам ниже тоже будет.
Ограничения: максимум 850мб памяти, в PV проблемы с работой VNC - для его запуска скорее всего придется достать бубен...

Из доработок:
1) файл в dom0:
в стандартный конфиг под pv вписываем сеть, диск, память менее 850мб, название машины. Ядро указываем через pygrub или напрямую (kernel = "/var/xen/kernel.8.2"). Для запуска этого достаточно, но словим mountpoint> и надо будет указать /, поэтому сразу можно вписать строку
extra = "vfs.root.mountfrom=ufs:ad0s1a,machdep.idle_mwait=0,boot_verbose=1"
Теперь можно запустить как xm create -c freebsd.pv - и мы увидим весь процесс загрузки.
2) В самой системе. Как минимум, надо в rc.conf скопировать всё про сеть, заменив название нашей карты на xn0 (xen network), так:
ifconfig_re0="inet 192.168.2.5/24"
ifconfig_xn0="inet 192.168.2.5/24"
2 разных сетевых с 1 айпи? Да, можно, поскольку у нас не может одновременно встретиться обе карты и образ получается более "универсальным"
Также будет ругань про консоли
...
May 12 20:21:38 fbsd8 getty[1035]: open /dev/ttyv4: No such file or directory
...
Причина в том, что этих консолей у нас нет. Можно оставить для совместимости, можно закомментировать, но тогда в hvm у нас не будет переключения консолей (а было ли оно вообще? Это же не реальный сервер...)

Сначала такое преобразование было проделано мной методом тыка, но потом найдена хорошая дока Xen FreeBSD 8.2 DomU (PV) -- Step by Step Howto, оттуда же взяты Xen DomU configuration examples - FreeBSD and CentOS и Xen 3.4.3 on CentOS 5.5 -- Tutorial
Собственно, если freebsd интересен - эти доки небольшие и к ознакомлению обязательны, особенно первая дока.

Официальный статус: http://wiki.freebsd.org/FreeBSD/Xen

FreeBSD on EC2
Есть pypxeboot, но это для совсем уж гиков.

четверг, 10 мая 2012 г.

SuexecUserGroup и AssignUserID

Часто бывает нужно, чтобы скрипты на сайте исполнялись не от системного юзера (www/www-data/apache), а от пользователя, которому принадлежит сайт. В зависимости от режима работы apache разные методы для указания пользователя.
Основные методы это SuexecUserGroup и AssignUserID, и в своих конфигах можно указывать оба атрибута, плюс вариант под peruser:
<IfModule peruser.c>
ServerEnvironment user user
Processor user user
</IfModule>
<IfModule mod_suexec.c>
SuexecUserGroup user user
</IfModule>
<IfModule mod_suexec>
SuexecUserGroup user user
</IfModule>
<IfModule itk.c>
AssignUserID user user
</IfModule>
Также надо проверить, что есть сам блок про itk. Если нету -- надо вписать
<IfModule itk.c>
StartServers       1
MinSpareServers    1
MaxSpareServers   5
ServerLimit      110
MaxClients       100
MaxRequestsPerChild  4000
</IfModule>
Ну и подогнать под свои нужды.
Существенные отличия тут в том, что только itk обеспечивает полную работу от указанного юзера, тогда как тот же SuexecUserGroup обеспечивает смену пользователя только для динамики. Статика отдаётся при этом от системного юзера.

Если при смене типа воркера используется ispmanager, надо сделать еще ряд манипуляций.
# perl -p -i -e 's/SuexecUserGroup/AssignUserID/g' /etc/httpd/conf/httpd.conf

В ispmgr.conf надо добавить
Option ApacheMPM

и возможно
ApacheProcName httpd.itk


Линки
http://forum.ispsystem.com/ru/showthread.php?t=17740
http://wiki.firstvds.ru/index.php/Apache_MPM-ITK_на_CentOS_с_ISPmanager
http://ru.ispdoc.com/index.php/Файл_конфигурации_ISPmanager_(ISPmanager)

суббота, 28 апреля 2012 г.

nginx: 504 SSL_do_handshake() failed

При проксировании https даже без сертификатов (чисто прокси) при реальной работе ловили
SSL_do_handshake() failed (SSL: error:1408C095:SSL routines:SSL3_GET_FINISHED:digest check failed) while SSL handshaking to upstream,

и 502 Bad Gateway.

Как ни странно, гугл дал всего 4 страницы, из которой только 1 была с решением:
proxy_ssl_session_reuse off;

Помогло. Непонятно, что это было и почему... Проверять можно было через openssl s_client -connect www.test.com:81 -state -ssl3 -no_ssl2 -no_tls1 в несколько потоков.

suhosin и логи

Избавляемся от suhosin спама в логи (писалось под фрю, на линях пока не отлаживалось, может потом дополню)

пятница, 27 апреля 2012 г.

Intel SSD 710: обзор и тест SSD на технологии HET MLC

На замену x25-e серии интел выводит 710 серию, которая на MLC чипах. Что изменилось, обзор:
http://www.thg.ru/storage/obzor_intel_ssd_710/print.html

А вкратце - взяли 320гиг диск, откусили 40% под ремапы и резерв, обозвали это HET MLC, что не более чем простой маркетинг, и несколько изменили прошивку. Так что долговечность выше обычных MLC (за счет резервирования), но в остальном - та же деградация со временем, ресурс всё-равно ниже, на активных операциях есть провалы при работе чистилки мусора.
В общем, интел снова падает "в низы", видимо чтобы не создавать конкуренцию партнёрам, как с серверами например, которые "дёшево и сердито". В low-end нормально, выше или ничего нет, или отстой какой-то.

Хотя обещались выпустить 720 серию в формате платы в PCI-e, посмотрим что выйдет.