среда, 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, но чего-то она не работает.

Вариант 2 - через pkg-add -r
Но всё-равно надо полное имя. Впрочем, для ряда пакетов есть симлинки на сервере, поэтому pkg_add -r mc поставит mc, но это не система такая умная, а просто симлинк на фтп.

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

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

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

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

воскресенье, 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"

опционально, ломает показ файлов (ls), показывая русский где он не нужен:
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 ветки, надо подключать доп репы, пишем каждую репу в свой файл в /etc/apt/sources.list.d/

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

MariaDB
Ещё одна замена оригинального mysql, более совместимая с оригиналом, но без некоторых плюшек
https://downloads.mariadb.org/mariadb/repositories/

для 5.5:
deb http://mirror.timeweb.ru/mariadb/repo/5.5/debian squeeze main
deb-src http://mirror.timeweb.ru/mariadb/repo/5.5/debian squeeze main

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


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

И ключи

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 -

mariadb
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

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) ...

PS
Возможные ошибки.

gpg: requesting key 3BBF077A from hkp server keys.gnupg.net
?: keys.gnupg.net: Network is unreachable
gpgkeys: HTTP fetch error 7: couldn't connect: Network is unreachable
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

Для nginx - можно скачать подпись с офсайта.
wget http://nginx.org/packages/keys/nginx_signing.key
cat nginx_signing.key | apt-key add -

PPS Также есть репа dotdeb.org

echo deb http://packages.dotdeb.org squeeze all > /etc/apt/sources.list.d/dotdeb.list
echo deb-src http://packages.dotdeb.org squeeze all >> /etc/apt/sources.list.d/dotdeb.list
curl -s http://www.dotdeb.org/dotdeb.gpg | apt-key add -

вторник, 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)