Мониторинг значений UBC в OpenVZ

June 25th, 2008

Если вы не знаете что такое UBC (User Beancounters), то видимо это вам и не надо, но если интересно, читайте здесь: http://wiki.openvz.org/UBC. Ну а тем, кто знает, возможно пригодится скрипт для мониторинга UBC.

Алгоритм работы простой, парсим содержимое /proc/user_beancounters, смотрим значения failcnt, сравниваем с предыдущими, если значение увеличилось, выводим соответствующую строку.

Скрипт написан на perl и предназначен для работы в кроне главной ноды и мониторинга UBC всех работающих openvz-контейнеров. Подразумеваетя, что почту, которую шлет крон вы читаете. Если такой механизм уведомления не нравится, несложно прикрутить какой-нибудь другой. Так же нет препятствий для запуска скрипта внутри openvz-контейнера.

Собственно сам скрипт: check_ubc.pl

Закрываем паролем папку на веб-сервере

June 15th, 2008

Иногда возникает потребность запаролить папку на веб-сервере, сама по себе задача тривиальная, но бывает к сайту есть только ftp-доступ, полный путь к папке неизвестен, да вообще-то и знать его не хочется, но есть желание сделать это как-нибудь по-быстрее.

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

<?

$user = 'user';
$password = 'mypass';

$dir = getcwd();

if( ! is_writeable( $dir ) )
{
print 'directory is not writeable.';
exit;
}

$hta = $dir . '/.htaccess';
$htp = $dir . '/.htpasswd';

$fh = @fopen( $htp, 'a' );

if( ! $fh )
{
print '.htpasswd open error.';
exit ;
}

fwrite( $fh, $user . ':' . crypt( $password ) . "\n" );

fclose( $fh );

$fh = @fopen( $hta, 'a' );

if( ! $fh )
{
print '.htaccess open error.';
exit;
}

$s = "AuthType Basic\n" .
"AuthName Private\n" .
"AuthUserFile $htp\n" .
"Require valid-user\n";

fwrite( $fh, $s );

fclose( $fh );
?>

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


<pre>
<?
$user = '1';
$password = '1';

$dir = getcwd();

$htp = $dir . '/.htpasswd';

print "-- .htpasswd\n";
print $user . ':' . crypt( $password ) . "\n\n";

$s = "AuthType Basic\n" .
"AuthName Private\n" .
"AuthUserFile $htp\n" .
"Require valid-user\n";

print "-- .htaccess\n";
print $s;
?>
</pre>

Редактирование виртуального хоста в Plesk

June 7th, 2008

Конфиги виртуальных хостов Plesk генерирует сам и изменять не рекомендует. Но если необходимо внести какие-то свои изменения, возможность такая есть. Пусть для примера, конфиг для example.com находится здесь:

/var/www/vhosts/example.com/conf/httpd.include

Создаем рядом с ним vhost.conf:

/var/www/vhosts/example.com/conf/vhost.conf

В который добавляем требуемые нам директивы виртуального хоста. После чего выполняем:

/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=example.com

Проверяем конфигурацию апача, перезапускаем его.

apachectl configtest
apachectl restart

Аналогичным образом можно поступать с сабдоменами, например создаем:

/var/www/vhosts/example.com/subdomains/mysubdomain/conf/vhost.conf

Остальное все тоже самое.

Добавляем swap в Linux

June 3rd, 2008

Вообще-то сервак свопить не должен, иначе это уже не сервак, а хз что. Но бывает и не сервак, да и мало ли вдруг надо добавить свопа, всенепременно. Ну чтож добавим:

Создаем файл, в данном примере 2Gb:

# dd if=/dev/zero of=/swapfile bs=1024 count=2097152

Далее форматируем его:

# mkswap /swapfile

И добавляем:

# swapon /swapfile

После чего можем увидеть своп в списке /proc/swap. Обратная процедура также несложна:

# swapoff /swapfile

Блокируем повторный запуск php-скрипта из crontab

April 23rd, 2008

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

Господам програмерам зачастую фиолетово на эти проблемы, так что приходится спасаться самому. Вот такой несложный код в начале php-скрипта, с использованием ф-ии flock не даст запустится второй копии:

$fh_lock = fopen( ‘/tmp/myscript.lock’, ‘w’ );

if( ! ( $fh_lock && flock( $fh_lock, LOCK_EX | LOCK_NB ) ) )
exit;

Предполагается, что имя lock-файла уникально для каждого скрипта, но так же можно и группу скриптов блокировать при необходимости, используя одинаковые. Так же предполагается, что скрипты выполняются с правами одного и того же user-а, в противном случае нужно дополнительно установить на lock-файл необходимые права доступа.

Работаем с clipboard из командной строки

March 25th, 2008

Работать с буфером обмена X Window из командной строки, как оказалось не просто, а очень просто, благодаря утилите xclip.

Например:

Ввод строки в буфер:

echo -n 'test' | xclip

Вывод строки из буфера:

xclip -o

Сайт проекта:
http://sourceforge.net/projects/xclip

RPM для Centos 5 можно взять здесь:
http://mirror.unl.edu/fedora/epel/5/i386/xclip-0.10-2.el5.i386.rpm

Используем LVM

March 23rd, 2008

Так как работать с LVM (Logical Volume Manager) приходится не часто, составил для себя небольшую шпаргалку, может и вам пригодится:

Cоздать физический том на диске hdb
pvcreate /dev/hdb

Удалить физический том
pvremove /dev/hdb

Проверим блочные устройства
lvmdiskscan

Покажет физические тома
pvdisplay

Ищет физические тома
pvscan

Создать группу томов
vgcreate -v vg1 /dev/hdb

Ищет группы томов
vgscan

Создать логический том размером 100Mb
lvcreate -L 100Mb  vg1 /dev/hdb

Ищет логические тома
lvscan

Покажет инфу о логическом томе
lvdisplay /dev/vg1/lvol0

Форматируем и монтируем логический том
mkfs.ext3 /dev/vg1/lvol0
mkdir /mnt/1
mount /dev/vg1/lvol0 /mnt/1

Удаляем логический том
lvremove /dev/vg1/lvol0

Используем fork в PHP

January 31st, 2008

Несложный пример использования ф-ии fork в скрипте на PHP. В данном случае, с помощью fork, поддерживаем одновременно работающими 5 процессов.


<?

function run_thread()
{
$pid = pcntl_fork();

if( $pid == -1 )
die( "fork error" );

if( ! $pid )
{
// child process

echo "run process\n";
do_work();

exit( 0 );
}
}

function do_work()
{
sleep( rand( 2, 5) );
echo "done\n";
}

$numproc = 5;

for( $i = 1; $i <= $numproc; $i++ )
run_thread();

while( 1 )
{
pcntl_wait( $status );

run_thread();
}

?>

Ставим OpenVPN

December 9th, 2007

Обычно с установкой проблем нет, так как во многих дистрибутивах openvpn cтавится “из коробки”.

Нет проблем с FreeBSD, openvpn есть в портах:

cd /usr/ports/security/openvpn
make install

В случае c CentOS мы можем сообщить yum-у о замечательном репозитории rpmforge (пример для CentOS 5, i386):

rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

далее тривиально:

yum install openvpn

Ну а если подходящих вариантов нет, то всегда можно поставить из исходников:

wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
wget http://www.oberhumer.com/opensource/lzo/download/LZO-v1/lzo-1.08.tar.gz
tar zxf lzo-1.08.tar.gz
cd lzo-1.08
./configure --enable-shared && make && make install
cd ..
tar zxf openvpn-2.0.9.tar.gz
cd openvpn-2.0.9
./configure --with-lzo-headers=/usr/local/include --with-lzo-libs=/usr/local/lib && make && make install

Монтируем iso-образ в Linux

December 8th, 2007

В этом нам поможет losetup:

# losetup /dev/loop0 file.iso
# mount /dev/loop0 /mnt

Обратная процедура:

# umount /mnt
# losetup -d /dev/loop0