FastNetMon

понедельник, 31 декабря 2012 г.

С Новым Годом!

Дорогие друзья! Дорогие читатели! Поздравляю Вас с 2013 годом! Желаю всех благ в жизни, как можно больше счастья и времени для семьи и близких! :)

И, разумеется, поменьше проблем с техникой и побольше интересных технических задач! :) С Новым Годом!!!

вторник, 25 декабря 2012 г.

Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed


Вот такая запись в логе MySQL slave сервера на Debian 6:
Dec 20 13:51:11 node2 mysqld: 121220 16:51:11 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=mysqld-relay-bin' to avoid this problem.
Такая рекомендация вызвана тем, что стандартно mysql relay log называет в стиле: `hostname`-mysqld-relay-bin и, очевидно, если поменять hostname slave машины, то, очевидно, mysql перестанет видеть свой лог и репликация не будет осуществляться корректно.

Чтобы этого избежать, требуется в блок [mysqld] добавить явное указание имени файла данного лога:
relay-log=mysqld-relay-bin
 Все, после этого ошибка пропадет!

Источник: http://bugs.mysql.com/bug.php?id=2122

понедельник, 24 декабря 2012 г.

Смена адреса блога! :)

Дорогие друзья! Дорогие мои читатели!

С сегодняшнего дня адрес блога стал проще и удобнее, теперь блог доступен по адресу StableIt.ru. Все ссылки на phpsuxx.blogspot.com автоматически перенаправляются на StableIt.ru, пожалуйста используйте везде новый адрес! :)

Смена вызвана в первую очередь тем, что Google Blogspot для доменов на *.blogspot.com ввел гео-домены, то есть блог стал доступен с адресов name.blogspot.ru, name.blogspot.com и еще 4 десятка доменов, что крайне негативно сказывается на отношении поисковых систем к блогу да и в целом вносит какой-то ненужный хаос в именование.

Почему именно StableIt? Тут все просто - потому что основная цель и задача данного блога - делиться информацией, которая позволяет сделать работу ИТ надежнее во всех отношениях.

Прежние адреса лент продолжат работать прозрачно, но лучше (надеюсь, это Вас не сильно затруднит) указать новые.
ATOM:  http://www.stableit.ru/feeds/posts/default
RSS: http://www.stableit.ru/feeds/posts/default?alt=rss

воскресенье, 23 декабря 2012 г.

Blogspot - смерть SEO!

Мало того, что теперь при запросе моего блога из РФ идет редирект на blogspot.ru:

curl -I phpsuxx.blogspot.com
HTTP/1.1 302 Moved Temporarily
Location: http://phpsuxx.blogspot.ru/
Content-Type: text/html; charset=UTF-8
Date: Sun, 23 Dec 2012 10:21:58 GMT
Expires: Sun, 23 Dec 2012 10:21:58 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Transfer-Encoding: chunked

Так они еще и статьи редиректят  в аналогичной форме!!!!!
curl -I http://phpsuxx.blogspot.com/2012/12/vlc-clean-dock-history.html
HTTP/1.1 302 Moved Temporarily
Location: http://phpsuxx.blogspot.ru/2012/12/vlc-clean-dock-history.html
Content-Type: text/html; charset=UTF-8
Date: Sun, 23 Dec 2012 10:19:49 GMT
Expires: Sun, 23 Dec 2012 10:19:49 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Transfer-Encoding: chunked
Мораль - нужно бежать с blogspot на свой домен!

VLC, clean dock history

defaults delete org.videolan.vlc.LSSharedFileList RecentDocuments
defaults write org.videolan.vlc NSRecentDocumentsLimit 0
defaults write org.videolan.vlc.LSSharedFileList RecentDocuments -dict-add MaxAmount 0
killall Dock
Ну и перезапускаем VLC.

среда, 19 декабря 2012 г.

vBulletin и баг при работе на PHP 5.3

Вот такой вот неприятный баг может вылазить в разделе блоги:
Warning: trim() expects parameter 1 to be string, array given in [path]/includes/functions.php on line 307
Warning: number_format() expects parameter 1 to be double, array given in [path]/includes/functions.php on line 361

Баг кроется в коде: forum/includes/blog_functions.php в следующих строках:
1205         $blogstats = $vbulletin->blogstats;
1206         foreach ($blogstats AS $key => $value)
1207         {
1208                
1209                 $blogstats["$key"] = vb_number_format($value);
1210         }

Здесь реально массив, а не единственное значение.  Как не сильно красивый хак можно поставить значок собаки перед vb_number_format (@ vb_number_format ) что приведет к подавлению ошибок.

Как корректный фикс - обновление версии форума, разработчики в курсе бага и давно его исправили.

mod_fcgid: HTTP request length 133590 (so far) exceeds MaxRequestLen

Фикс на Debian простейший:
echo "FcgidMaxRequestLen 2000000" >> /etc/apache2/mods-enabled/fcgid.conf 
И передергиваем апача:
/etc/init.d/apache2 restart 

вторник, 18 декабря 2012 г.

Сборка perf top для CentOS 6

Сборка (CentOS 6) весьма проста:
cd /usr/src
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.1.tar.xz
tar -xf linux-3.17.1.tar.xz
cd linux-3.17.1/tools/perf
yum install -y gcc glibc-devel elfutils-devel make binutils-devel glibc-static flex bison  libunwind  audit-libs-devel libunwind-devel numactl-devel  python-devel slang-devel perl-ExtUtils-Embed libdwarf-devel
make
cp perf /opt

Если будет выдана ошибка:
No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static
То фикс Centos такой:
yum install -y elfutils-devel
На Debian:
apt-get install -y libelf-dev 

Запускаем:
/opt/perf  top
Выдача будет иметь примерно следующий вид:
------------------------------------------------------------------------------
   PerfTop:     323 irqs/sec  kernel:44.9% [100000 cycles],  (all, 12 CPUs)
------------------------------------------------------------------------------
             samples    pcnt   kernel function
             _______   _____   _______________
              878.00 -  9.2% : __d_lookup
              760.00 -  8.0% : read_hpet
              620.00 -  6.5% : __link_path_walk
              409.00 -  4.3% : intel_idle
              282.00 -  3.0% : _spin_lock
              254.00 -  2.7% : _atomic_dec_and_lock
              222.00 -  2.3% : acl_permission_check
              157.00 -  1.7% : ext4_htree_store_dirent [ext4]
              147.00 -  1.5% : kmem_cache_alloc
              138.00 -  1.5% : strncpy_from_user
              138.00 -  1.5% : copy_user_generic_string
              131.00 -  1.4% : __audit_syscall_exit
              123.00 -  1.3% : security_inode_getattr
              122.00 -  1.3% : half_md4_transform
              119.00 -  1.3% : path_init

Для ленивых (себя в первую очередь)  собрал бинарик (точно работает на Centos6): https://fastvps.googlecode.com/svn/trunk/other/linux_kernel_perf_tool/perf

Шантажировать детьми могут только конченые отморозки - пара слов про наш ответ списку Магнитского

Прошу не оставлять без внимания! http://echo.msk.ru/blog/aloshak/970640-echo/

понедельник, 17 декабря 2012 г.

Новые технологии кулеров от General Electric

Как создать пользователя с sudo на Debian 6 Squeeze?

Допустим, для выполнения работ технической поддержке нужен доступ по ssh. Как его выдать?

Создаем пользвателя:
useradd -m support

Задаем ему пароль посложнее:
passwd support
Теперь вносим запись в sudoers (он немного усложнен для запрета очевидных - но не всех - способов запуска шелла, это сделано для явного логгирования всех команд, выполняемых пользователем support):
echo 'support ALL=(ALL) NOPASSWD: ALL, !/bin/su, !/bin/bash, !/bin/dash, !/bin/sh' > /etc/sudoers.d/support
Выставляем корректные права:
chmod 440 /etc/sudoers.d/support
Что в данный момент делает пользователь и какие команды выполняет можно посмотреть вот так:
cat /var/log/auth.log|grep sudo
Выдача будет примерно следующая:

Dec 17 10:56:29 stat sudo:  support : TTY=pts/2 ; PWD=/home/support ; USER=root ; COMMAND=/usr/bin/id
Dec 17 10:56:32 stat sudo:  support : TTY=pts/2 ; PWD=/home/support ; USER=root ; COMMAND=/bin/ls -la
Dec 17 10:57:19 stat sudo:  support : TTY=pts/2 ; PWD=/home/support ; USER=root ; COMMAND=/usr/bin/id


Как лишить данного пользователя sudo привилегий и удалить аккаунт?

Легко:
rm -f /etc/sudoers.d/support
killall -KILL -u support; userdel support
Вторая команда (killall) необходима в случае, если пользователь залогинен, иначе будет выдана ошибка: userdel: user support is currently logged in

воскресенье, 16 декабря 2012 г.

Перенос blogspot.com блога на собственный домен

Теперь возможен перенос даже на домен первого уровня, а не только на поддомен (например, blog.domain.name) http://support.google.com/blogger/bin/static.py?hl=en&ts=1233381&page=ts.cs

SSH - запретить shell, но разрешить sftp, scp

e4defrag - утилита для online (!!!) дефрагментации ext4

Описание: http://manpages.ubuntu.com/manpages/precise/man8/e4defrag.8.html

Но, обращаю внимание, не забывайте, что утилита - сильно эксперементальная!!!

Множество необычных смайлов Skype

Стеганография на Linux

Очень интересно: http://oldengremlin.blogspot.ru/2012/05/blog-post.html !

понедельник, 10 декабря 2012 г.

List locked/flocked files in Debian linux

Программка есть искаропки: 
apt-get install -y lslk
В работе программа довольно проста:

lslk
SRC         PID DEV     INUM       SZ TY M ST WH END LEN NAME
(unknown)  1919 8,3  6071524           w 0  0  0   0   0 / (rootfs)
cleanup    7610 8,3 15654916        0  w 0  0  0   0   0 /var/spool/postfix/pid/unix.cleanup
php        7970 8,3  6136204        0  w 0  0  0   0   0 /var/lib/php5/sess_xxxx
smtp       8290 8,3 15654921        0  w 0  0  0   0   0 /var/spool/postfix/pid/unix.smtp
php        8318 8,3  6136216        0  w 0  0  0   0   0 /var/lib/php5/sess_yyyy
smtpd      8398 8,3 15654913        0  w 0  0  0   0   0 /var/spool/postfix/pid/inet.smtp
local      8401 8,3 15654919        0  w 0  0  0   0   0 /var/spool/postfix/pid/unix.local
bounce     8581 8,3 15654917        0  w 0  0  0   0   0 /var/spool/postfix/pid/unix.defer
php        8668 8,3  6136222        0  w 0  0  0   0   0 /var/lib/php5/sess_zzzz
php       10630 8,3 12590035        0  w 0  0  0   0   0 /var/lib/php5/sess_kkkk (deleted)
php       11598 8,3 13093389        0  w 0  0  0   0   0 /var/lib/php5/sess_llll (deleted)
master    14696 8,3 12591105       33  w 0  0  0   0   0 /var/lib/postfix/master.lock
master    14696 8,3 15654914       33  w 0  0  0   0   0 /var/spool/postfix/pid/master.pid
mysqld    17170 8,3 12533764  5242880  w 0  0  0   0   0 /var/lib/mysql/ib_logfile1
mysqld    17170 8,3  6135960  5242880  w 0  0  0   0   0 /var/lib/mysql/ib_logfile0
mysqld    17170 8,3  6135961 10485760  w 0  0  0   0   0 /var/lib/mysql/ibdata1

воскресенье, 9 декабря 2012 г.

Каким должна быть поддержка 21 го века у Интернет провайдера?

Как _минимум_ вот такой:
Звоню провайдеру (с мобильного), пожаловаться на неработающие интернеты. А из трубки мне: 
- Здравствуйте! По вашему телефону определён номер вашего договора: ХХХХХ. К сожалению на вашем направлении наблюдается проблема со связью. В данный момент, проблема находится на стадии "выяснение причины". Завершение "выяснения причины" ожидается 8 декабря в 22 часа 00 минут. Номер заявки по проблеме - YYYYYY. Если у вас остались дополнительные вопросы, пожалуйста, дождитесь ответа оператора!
Молодцы какие!
Источник: http://to-the-future.livejournal.com/653852.html 

четверг, 6 декабря 2012 г.

Сложный визовый вопрос! Поездка по двум стыковым визам и окончание первой визы в поездке

Да, это возможно.

Пруфстатья:

A holder of a multiple-entry visa may apply for a new visa before the expiry of the validity of the visa currently held. However, the validity of the new visa must complement the current  visa, i.e. a person cannot hold two uniform visas valid for the same period in time.  

Example: A Moroccan lawyer representing a gender equality NGO who frequently  participates in meetings in various Member States holds a multiple-entry-visa which expires  on 31.5. She applies for a new visa on 15.4.  If a new visa is issued, it should be valid from 1.6. and in such a case the visa holder would be  entitled to enter the territory of the Member States on the basis of the first visa that will expire  during the stay and leave on the basis of the new visa.


Это не просто пдфка, это офицальный документ: COMMISSION DECISION 
of 19.3.2010  establishing the Handbook for the processing of visa applications and the modification 
of issued visas  (Only the Bulgarian, Czech, Dutch, Estonian, Finnish, French, German, Greek, 
Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, 
Slovak, Slovenian, Spanish and Swedish texts are authentic)

Boeing 737-500 выведены из авиапарка ГТК Россия

По информации из блога ГТК Россия:
29 ноября в Петербургском Пулково с особенным трепетом ожидали прибытия рейса ПЛ 752 из Самары. Именно этот рейс стал крайним коммерческим полетом самолета Boeing 737-500 в авиакомпании "Россия".  

Срок лизинга этих воздушных судов подошел к концу, и вместе с ним на наших глазах завершилась целая эпоха. Boeing 737-500, кажется, еще совсем недавно стал первым иностранным типом ВС в нашей компании. С 2005 года вместе с ним предприятие "Пулково" приобщилось к мировому опыту. Все это время самолеты верно служили авиакомпании и ее пассажирам, но теперь пришло время передавать их лизингодателю.
Эх, даже грустно, число перелетов на именно этих Боингах именно по этому маршруту за последние 3 года моей жизни уходят сильно за 2 десятка....

Немного про авиацию и Киатай

Аж зачитался! Рекомендую: http://letchikleha.livejournal.com/145477.html

среда, 5 декабря 2012 г.

Отличный сервис от mail.ru для контроля доставки почты на заданный сервис

http://postmaster.mail.ru

Правда, у меня он почему-то упорно не работает, как ожидается - Статистика отсутствует - проверьте DKIM.

Update:

Вы наверняка знаете, что протокол SMTP позволяет легко подделать адрес отправителя. Поэтому, чтобы отличить ваши рассылки от спамерских, мы используем DKIM-подпись. Отсюда важное замечание: для того, чтобы статистика работала, ваши письма должны быть подписаны с помощью DKIM. Если ваш проект еще не делает этого, настройте свой почтовый сервер прямо сейчас (это просто, многие современные MTA поддерживают DKIM «из коробки»). Кстати, это позитивно влияет на доставляемость не только для mail.ru, но и для всех почтовых систем и спам-фильтров.

Иными словами - DKIM должен быть включен обязательно.

Источник: http://habrahabr.ru/company/mailru/blog/129797/ 

понедельник, 3 декабря 2012 г.

nginx и его status page


Стандартная страница статус nginx выглядит примерно так:


Active connections: 291
server accepts handled requests
  16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

Описание, что для чего:
active connections -- number of all open connections including connections to backends
server accepts handled requests -- nginx accepted 16630948 connections, handled 16630948 connections (no one was closed just it was accepted), and handles 31070465 requests (1.8 requests per connection)
reading -- nginx reads request header
writing -- nginx reads request body, processes request, or writes response to a client
waiting -- keep-alive connections, actually it is active - (reading + writing)




Источник: http://wiki.nginx.org/HttpStubStatusModule 

Вывести список всех PID дочерних процессов в системе

Итак, определимся, обычная однопоточная программа запущенная на линукс-системе имет пид родителя (ppid) раный 1 (init процесс). Все порожденнные данной программой процессы получат ppid != 1, он будет установлен в pid запустившей его программы.

Вот такой простой командой можно вывести все процессы второго уровня (порожденные обычными программами, рабоиче процессы apache, nginx и прочих):
ps ax -o pid,ppid,command|grep process_name |grep -v grep | awk '{if ($2 != 1) print $1;}'

воскресенье, 2 декабря 2012 г.

Как PHP блокирует файл сессии?

Функция: static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)

Это эксклюзивный лок: flock(data->fd, LOCK_EX);

Что это значит: man 2 flock

В strace процесс блокировки файла выглядит примерно так:

24365 open("/var/lib/php5/sess_8088bde28a87bfeddffd0ee807a4c87c", O_RDWR|O_CREAT, 0600) = 5
24365 flock(5, LOCK_EX)                 = 0    
24365 fcntl(5, F_SETFD, FD_CLOEXEC)     = 0    
24365 fstat(5, {st_mode=S_IFREG|0600, st_size=126, ...}) = 0
24365 lseek(5, 0, SEEK_SET)             = 0    
24365 read(5, "ticketlistview|s:6:\"active\";", 126) = 126

Источник: ext/session/mod_files.c php 5.3.3 Debian Squeeze.

пятница, 30 ноября 2012 г.

Подсистема форка CGI процессов в PHP в пятидесяти строках


#include
#include
# include

//struct sigaction act, old_term, old_quit, old_int;
static int parent = 1;
static int children = 4;
int status = 0;
/*
void fastcgi_cleanup(int signal) {
sigaction(SIGTERM, &old_term, 0);
    printf("Signal handler\n");
    exit(0);
}
*/
int main() {
    int running = 0;
    /*
    act.sa_flags = 0;
    act.sa_handler = fastcgi_cleanup;
    if (sigaction(SIGTERM, &act, &old_term) ||
        sigaction(SIGINT,  &act, &old_int)  ||
        sigaction(SIGQUIT, &act, &old_quit)
    ) {  
        printf("Can't set signals");
        exit(1);
    }
    */
    while (parent) {
        do {
            int pid = fork();

            switch (pid) {
                case 0:
                    printf("Start child: %d\n",  getpid());
                /* Child */
    /*    
          sigaction(SIGTERM, &old_term, 0);
                sigaction(SIGQUIT, &old_quit, 0);
                sigaction(SIGINT,  &old_int,  0);
*/
                    parent = 0;
                    break;
                default:
                    printf ("Master: %d\n", getpid());
                     running++;
                    break;
            }
            } while (parent && (running < children));
            if (parent) {
   
                while (1) {
                    if (wait(&status) >= 0) {
                        printf("Master wait loop\n");
                        running--;
                       
                        printf("Master: child killed\n");
                        break;
                    }  
                }  

            }
    }

    if (!parent) {
               printf("Child start to work: %d\n", getpid());
   
                int counter = 0;
                while (1) {
                    counter++;
                    sleep(1);
                    if (counter > 5) {
                        break;
                    }  
                }  
   
                printf("stop %d process\n", getpid());
                exit(0);
    }
}

Код вычленен из оригинального: sapi/cgi/cgi_main.c

Отладка FastCGI приложений - подключение клиентом без веб-сервера

Очень часто возникает проблема, как отладить FastCGI приложение непосредственно, без веб-сервера.
wget https://raw.github.com/adoy/PHP-FastCGI-Client/master/fastcgi.php

Создаем файлик:
require('fastcgi.php');
$client = new FCGIClient('localhost', '9001');
$content = 'key=value';
echo $client->request(
    array(    
        'GATEWAY_INTERFACE' => 'FastCGI/1.0',
        'REQUEST_METHOD' => 'GET',
        'SCRIPT_FILENAME' => 'index.php',
        'SERVER_SOFTWARE' => 'php/fcgiclient',
        'REMOTE_ADDR' => '127.0.0.1',
        'REMOTE_PORT' => '9985',
        'SERVER_ADDR' => '127.0.0.1',
        'SERVER_PORT' => '80',
        'SERVER_NAME' => 'mag-tured',
        'SERVER_PROTOCOL' => 'HTTP/1.1',
        #'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
        'CONTENT_LENGTH' => strlen($content)
    ),
    $content
);

После этого запускаем скрипт и получаем от бэкэнда выдачу :)
Отдельное спасибо автору этого чудо-скрипта.




Что за apple-touch-icon.png и apple-touch-icon-precomposed.png в логах сервера?

Это, оказывается, аналог (красивый и круглый!) favicon.ico, но для iPad и прочих Apple дивайсов. Спека может быть найдена по адресу.

Источник: http://sigov.ru/2012/05/10/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-apple-touch-icon-png/

У сильных мира сего можно найти их по адресу:
http://fb.com/apple-touch-icon.png

понедельник, 26 ноября 2012 г.

Centos 5 and gateway in different subnet

When you try to use IP with gateway in different subnet you can got a very strange issues.
Допустим, шлюз у нас 159.x.x.1, а IP 193.y.y.101, то вписываем
GATEWAY=159.x.x.1
В  /etc/sysconfig/network, а в /etc/sysconfig/network-scripts/route-eth0 вписываем следующее:
159.x.x.1 dev eth0
default via 159.x.x.1

При этом, в конфиге сети ifcfg-eth0, разумеется, статикой прописываем IPADDR=193.y.y.101

Если мы все сделали верно, после перезагрузки системы/рестарта сети данный IP станет доступен снаружи.


Source: http://www.adminsehow.com/2011/09/gateway-on-a-different-subnet-on-linux/ и http://www.nibshost.com/account/knowledgebase/20/Networking-IP-in-diffrent-subnet-Linux-on-Centos-commandline-.html (огромное спасибо автору!)



вторник, 20 ноября 2012 г.

Google Spreadsheet / таблицы - узнать курс валюты

Прямая выгрузка прямо с ЦБРФ:
=IMPORTXML("http://www.cbr.ru/scripts/XML_daily.asp";"//ValCurs/Valute[@id="&char(34)&"R01239"&char(34)&"]/Value")
Через Google Finance (дает весьма странные курсы):
= GoogleFinance("Currency:EURRUB") 

Google Docs / Drive таблицы - как зафиксировать ячейку?

При автопродолжении формул на несколько строк вниз все ячейки, указаныне в формуле сдвигаются, чтобы этого избежать, нужно перед обоими координатами поставить знак доллара, это зафиксирует их: =E3*0,8*$G$1.

воскресенье, 18 ноября 2012 г.

Активация API для Google Double Click / DFP / DFA

Есть чудо сервис - Google Double Click, с ним имеется одна проблема - пример по активации API из документации не работает (Your DFA account must be enabled for API Access. You can complete an application to use the DFA API by filling out this form) и при переходе по ссылке http://google.com/support/dfa/bin/request.py?contact_type=dfa6api ничего не происходит.

Что делать? Входим в сервис: https://www.google.com/dfp, щелкаем в самом верху по треугольничек рядом со своим логином, там вываливается пункт "Пользовательские настройки", далее "Язык отображения" - English/US.

После этого в правом верхнем углу панели видим строку Admin, там видим переключатель "API Access", переводим его в состояние включено, соглашаемся с лицензией на оказание услуг и радуемся жизни!

Суть проблемы в том, что такого пункта на русскоязычной версии сервиса просто не существует. Но, по логике вещей, можно вернуться на русский язык и API не отключится.

P.S. требую пива за рецепт! Полтора дня потратил на поиски! :)))

пятница, 16 ноября 2012 г.

На каких DNS серверах работают корневые DNS?

K-root работает на NSD: http://www.nlnetlabs.nl/projects/nsd/

ошибка: "ploop-lib-1.4-1" задает несколько пакетов

Либо на английском:
LANG=C rpm -e --nodeps ploop ploop-lib
error: "ploop-lib" specifies multiple packages
Внешне это выглядит как сущий абсурд:
rpm -qa|grep ploop
ploop-lib-1.4-1
ploop-lib-1.4-1

На деле же это два разных пакета, но про разные архитетуры:
rpm -q --queryformat "%{name}.%{arch}\n"  ploop-lib
ploop-lib.x86_64
ploop-lib.i386

Фикс:
rpm -e --nodeps ploop-lib.x86_64
rpm -e --nodeps ploop-lib.i386
Источник: http://linuxhostingsupport.net/blog/rpm-remove-error-specifies-multiple-packages 

четверг, 15 ноября 2012 г.

Статистика работы Bind/Named

Самый первый и очевидный способ получить информацию о работе Bind - это rndc:

 rndc status
version: 9.7.3 (BIND)
CPUs found: 16
worker threads: 16
number of zones: 149323
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
Но тут почти нету ничего интересного и важного, что же делать?  Активировать расширенную статистику (здесь и далее все примеры для Debian):
vim /etc/bind/named.conf.options

Там добавляем в блок options:
statistics-file "/var/run/named/named.stats";
Применяем конфигурацию:
rndc reload
Осуществляем сброс статистики в файл:
rndc stats
Просматриваем:
cat /var/run/named/named.stats 

Выглядит в итоге статистика примерно вот так:
cat /var/run/named/named.stats
+++ Statistics Dump +++ (1352974226)
++ Incoming Requests ++
           208759943 QUERY
                   8 IQUERY
               11847 NOTIFY
               51927 UPDATE
++ Incoming Queries ++
                   4 RESERVED0
           167218906 A
             1110579 NS
               28274 CNAME
              189483 SOA
              391344 PTR
                 567 HINFO
             9556451 MX
              759870 TXT
                  33 RP
                   2 AFSDB
            28448043 AAAA
               91280 SRV
                 490 NAPTR
               77647 A6
                 913 DS
                 257 SSHFP
                  55 RRSIG
                3306 DNSKEY
                 257 NSEC3PARAM
                 278 TYPE52
              178186 SPF
                 804 TKEY
                   1 IXFR
                2284 AXFR
                   3 MAILB
              700618 ANY
                   5 Others
++ Outgoing Queries ++
[View: default]
                 758 A
                  19 NS
                 870 AAAA
[View: _bind]
++ Name Server Statistics ++
           208824909 IPv4 requests received
           126888579 requests with EDNS(0) received
               15310 TCP requests received
            38665964 auth queries rejected
            12280385 recursive queries rejected
                2207 transfer requests rejected
               51927 update requests rejected
           208824904 responses sent
                 152 truncated responses sent
           126888577 responses with EDNS(0) sent
           119637521 queries resulted in successful answer
           158234385 queries resulted in authoritative answer
               69103 queries resulted in non authoritative answer
               69103 queries resulted in referral answer
            20418156 queries resulted in nxrrset
              208315 queries resulted in SERVFAIL
            18178708 queries resulted in NXDOMAIN
            50245852 other query failures
++ Zone Maintenance Statistics ++
              216262 IPv4 notifies sent
                 164 IPv6 notifies sent
                6278 IPv4 notifies received
++ Resolver Statistics ++
[Common]
                 541 mismatch responses received
[View: default]
                1450 IPv4 queries sent
                 197 IPv6 queries sent
                1340 IPv4 responses received
                 100 NXDOMAIN received
                  30 SERVFAIL received
                  44 other errors received
                  25 EDNS(0) query failures
                   1 truncated responses received
                   7 lame delegations received
                 417 query retries
                 122 query timeouts
                 313 IPv4 NS address fetches
                 341 IPv6 NS address fetches
                  61 IPv4 NS address fetch failed
                 286 IPv6 NS address fetch failed
                 166 queries with RTT < 10ms
                 921 queries with RTT 10-100ms
                 243 queries with RTT 100-500ms
[View: _bind]
++ Cache DB RRsets ++
[View: default]
                  51 A
                  17 NS
                   1 CNAME
                  23 AAAA
                   2 DS
                   3 RRSIG
                   3 !AAAA
                   1 NXDOMAIN
[View: _bind (Cache: _bind)]
++ Socket I/O Statistics ++
               11012 UDP/IPv4 sockets opened
                 292 UDP/IPv6 sockets opened
                   4 TCP/IPv4 sockets opened
                   1 TCP/IPv6 sockets opened
               11009 UDP/IPv4 sockets closed
                 292 UDP/IPv6 sockets closed
               19556 TCP/IPv4 sockets closed
                 197 UDP/IPv6 socket connect failures
                1449 UDP/IPv4 connections established
                   1 TCP/IPv4 connections established
               19556 TCP/IPv4 connections accepted
                 351 UDP/IPv6 send errors
                   1 TCP/IPv4 send errors
                  10 UDP/IPv4 recv errors
                  12 TCP/IPv4 recv errors
++ Per Zone Query Statistics ++
--- Statistics Dump --- (1352974226)

вторник, 13 ноября 2012 г.

Использование mydumper для бэкапа mysql

Использование mydumper для бэкапа mysql:
 time /opt/mydumper -t `cat /proc/cpuinfo|grep processor |wc -l` -c -B db_test -u root -p  password
 В моих тестах он показал более низкую производительность нежели mysqldump.

Как отписаться от рассылки, если вы были подписаны через googlemail.com?

Придется подделать обратный адрес вот таким образом:
echo "unsubscribe"| mail -r xxxx@googlemail.com -s unsubscribe  nginx-ru-request@nginx.org
 Зачем все это нужно? Ряд систем рассылки требуют отмены подписки с адреса, с которого была подписка (вполне разумно), до недавнего времени времени гмейл позволял отсылать письма и от имени гмейл и от имени гуглмейл, но вот недавно запретил посылку от гуглемейл и поэтому приходится немного хитрить, чтобы отписаться.

Ебический провал системы черных списков сайтов!

Лучше сказать сложно: http://ntv.livejournal.com/272460.html

По проверенным данным - уже есть первые жертвы среди хостеров, кому без предупреждения забанили IP адреса шаред-серверов.

понедельник, 12 ноября 2012 г.

Какой формат у CTID/VEID в OpenVZ?

Все изыскания основаны на коде: http://download.openvz.org/utils/vzctl/4.1/src/vzctl-4.1.tar.bz2

Везде, где требуется работа с CTID/VEID, используется следующий тип: envid_t, который в свою очередь объявлен в файле include/types.h вот таким образом:
typedef unsigned envid_t;
Вот так.  А unsigned в свою очередь - это:
typedef unsigned int            uint32_t;
А это в свою очередь интервал от 0 до 4294967295.  Но интервал от 100 (включительно с обоих сторон) зарезервирован OpenVZ для служебного использования:

Note that CT ID <= 100 are reserved for OpenVZ internal purposes.
Итого, номер CTID/VEID может быть от 101 до 4294967295.

пятница, 9 ноября 2012 г.

Установка APC из PECL на Debian 6

Все весьма просто:
pecl update-channels
Ставим:
pecl install apc
Enable internal debugging in APC [no] :
Enable per request file info about files used from the APC cache [no] :
Enable spin locks (EXPERIMENTAL) [no] :
Enable memory protection (EXPERIMENTAL) [no] :
Enable pthread mutexes (default) [yes] :
Enable pthread read/write locks (EXPERIMENTAL) [no] :
Мануал не более, чем черновик, не уверен, что все сходу заработает, будьте внимательны. 

Sticky сессии для Nginx к бэкэнду - как направлять конкретного юзера на всегда тот же бэкэнд?

Расширенная отладка PHP по дампам памяти на Debian


Стандартная попытка отладить PHP по дампу памяти через dbg выглядит примерно так:
backtrace 20
#0  0x00000000006689fd in do_bind_function ()
#1  0x00000000006ab77c in ?? ()
#2  0x00000000006ab510 in execute ()
#3  0x00000000006b71cf in ?? ()
#4  0x00000000006ab510 in execute ()
#5  0x00000000006b1ead in ?? ()
#6  0x00000000006ab510 in execute ()
#7  0x00000000006d3f86 in ?? ()
#8  0x00000000006ab510 in execute ()
#9  0x00007fdc9c0acbd5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#10 0x00007fdc9c0ab53c in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#11 0x00007fdc9c0acbd5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#12 0x00007fdc9c0ab53c in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#13 0x0000000000682cdd in zend_execute_scripts ()
#14 0x000000000062e2a8 in php_execute_script ()
#15 0x000000000071123f in ?? ()
#16 0x00007fdca362cc8d in __libc_start_main () from /lib/libc.so.6
#17 0x000000000042d289 in _start ()

Чтобы сделать выдачу попонятнее, нужно поставить  debug symbols, содержащие информацию о том, что и где находится:

apt-get install -y php5-dbg
Теперь все на порядок понятнее и даже можно посмотреть, на какой строке возникает ошибка:
 backtrace 20
#0  0x00000000006689fd in do_bind_function (opline=0x7fdc948e2b40, function_table=0x11a8c80, compile_time=0 '\000')
    at /tmp/buildd/php5-5.3.3/Zend/zend_compile.c:2956
#1  0x00000000006ab77c in ZEND_DECLARE_FUNCTION_SPEC_HANDLER (execute_data=0x189f908) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:582
#2  0x00000000006ab510 in execute (op_array=0x1ccd620) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:107
#3  0x00000000006b71cf in ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER (execute_data=0x189bb90)
    at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:5256
#4  0x00000000006ab510 in execute (op_array=0x1bf6cf8) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:107
#5  0x00000000006b1ead in ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER (execute_data=0x1898c80)
    at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:22511
#6  0x00000000006ab510 in execute (op_array=0x1b1f538) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:107
#7  0x00000000006d3f86 in zend_do_fcall_common_helper_SPEC (execute_data=0x1898b40) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:340
#8  0x00000000006ab510 in execute (op_array=0x1b1f3e8) at /tmp/buildd/php5-5.3.3/Zend/zend_vm_execute.h:107
#9  0x00007fdc9c0acbd5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#10 0x00007fdc9c0ab53c in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#11 0x00007fdc9c0acbd5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#12 0x00007fdc9c0ab53c in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#13 0x0000000000682cdd in zend_execute_scripts (type=0, retval=0x7fff4ea76820, file_count=3) at /tmp/buildd/php5-5.3.3/Zend/zend.c:1266
#14 0x000000000062e2a8 in php_execute_script (primary_file=0x630f6a) at /tmp/buildd/php5-5.3.3/main/main.c:2289
#15 0x000000000071123f in main (argc=1319612504, argv=0x0) at /tmp/buildd/php5-5.3.3/sapi/cgi/cgi_main.c:2139

А вот так можно тоже самое сделать одной единственной командой:
gdb /usr/bin/php5-cgi -c /var/log//dumps/core.php5-fastcgi-pr.1114  -x "bt"  -batch -x 'bt'

IonCube: ioncube_loader_lin_5.3_ts.so vs ioncube_loader_lin_5.3.so

Суффикс ts значает thread safe.

Какая именно версия ioncube нам нужна зависит от того, с какими настройками собран PHP:

php -i |grep Thread -i
Thread Safety => disabled
В данном случае нам нужна НЕ ts версия IonCube (а также в случае, если Вы не знаете, какая версия нужна - ставьте НЕ ts).


Источник: http://www.ioncube.com/loader_installation.php

Анализ core dump программы на Linux

Итак, программа упала, а у нас было активировано сохранение дампов ядра.

Что делать с дампом?
gdb /usr/bin/php5-cgi
core /var/log/dumps/core.php5-fastcgi-pr.22655
После этого посмотрим стек вызова, перед которым произошло падение программы:
backtrace 20
#0  0x00000000006689fd in do_bind_function ()
#1  0x00000000006ab77c in ?? ()
#2  0x00000000006ab510 in execute ()
#3  0x00000000006b71cf in ?? ()
#4  0x00000000006ab510 in execute ()
#5  0x00000000006b1ead in ?? ()
#6  0x00000000006ab510 in execute ()
#7  0x00000000006d3f86 in ?? ()
#8  0x00000000006ab510 in execute ()
#9  0x00007f1aad0696f7 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#10 0x00007f1aad0673d5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#11 0x00007f1aad0696f7 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#12 0x00007f1aad0673d5 in ?? () from /opt/ioncube/ioncube_loader_lin_5.3.so
#13 0x0000000000682cdd in zend_execute_scripts ()
#14 0x000000000062e2a8 in php_execute_script ()
#15 0x000000000071123f in ?? ()
#16 0x00007f1ab4579c8d in __libc_start_main () from /lib/libc.so.6
#17 0x000000000042d289 in _start ()
Вуаля, в данном конкретном случае стоит начинаться разбираться с IonCube! 

четверг, 8 ноября 2012 г.

Парсинг HTML в PHP посредством simplehtmldom

В двух словах: simplehtmldom - это глоток чистого воздуха после кошмарного DOM парсера в PHP, он на порядки проще и удобнее.

Стягвиаем файл (вся библиоетка - один файлик):
wget 'http://downloads.sourceforge.net/project/simplehtmldom/simple_html_dom.php?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fsimplehtmldom%2Ffiles%2F&ts=1352362766&use_mirror=iweb' -Osimple_html_dom.php
Пример кода:
include "simple_html_dom.php";
$html = str_get_html('');
$test_url = $html->find('img', 0);
print $test_url->src;
Очень много примеров кода: http://simplehtmldom.sourceforge.net/manual.htm#section_create

Офсайт проекта: http://sourceforge.net/projects/simplehtmldom/

среда, 7 ноября 2012 г.

PHP - как сделать из двух массивов хэш, чтобы ключи были из первого, а значения из второго?

Вот так:
$keys = array('a', 'b', 'c');
$values = array(1, 2, 3);
$hash = array_combine($keys, $values);

Работа с Redis из Python на Debian 6

Ставим пакет:
apt-get install -y python-redis

Сразу же его нужно обновить, так как он старый:

pip install --upgrade redis

Тестовый скрипт (выдает все ключи):
#!/usr/bin/python
# -*- coding: utf-8 -*-

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True, charset='utf-8')
#print type( r.keys('*') )
for i in r.keys('*'):
    print i 


Установка phpredis из git - PHP клиент для Redis и хранение сессий

Ставим зависимости:
apt-get install php5-dev git

Получаем исходный код прямо из репозитория:
cd /usr/src
git clone git://github.com/nicolasff/phpredis.git

Копилируем:
cd phpredis
phpize
./configure
make
make install

Добавляем в phpredis в загружаемые модули PHP:
echo "extension=redis.so">/etc/php5/conf.d/redis.ini
Убеждаемся, что модуль загрузился:
php -m |grep redis
redis
Использование также очень просто:
$redis=new Redis() or die("Can'f load redis module.");
$redis->connect('127.0.0.1');
$redis->set('set_testkey', 'foo');
print $redis->get('set_testkey'); 

А между тем, я уже нашел у этого модуля баг: https://github.com/nicolasff/phpredis/issues/270 
Фиксится установкой пакета redis_server из backports:
wget http://ftp.jp.debian.org/debian-backports/pool/main/r/redis/redis-server_2.4.15-1~bpo60+2_amd64.deb 
dpkg -i  redis-server_2.4.15-1~bpo60+2_amd64.deb   

Если требуется хранить сессии в Redis, то это делается также очень просто:
cat /etc/php5/conf.d/redis_sessions.ini
session.save_handler = redis
session.save_path = "tcp://localhost:6379/"
Источник: http://ricochen.wordpress.com/2012/03/25/install--on-ubuntu/

Офсайт: https://github.com/nicolasff/phpredis

Redis как PHP session handler

Возможно: https://github.com/nicolasff/phpredis

По сравнению с Mecmached такой подход решительно лучше, так как Memcached не поддерживает блокировки.

Взаимодействие с Redis c PHP: predis

Не рекомендую использовать predis! У его авторов ООП головного мозга, рекомендую phpredis: http://phpsuxx.blogspot.ru/2012/11/phpredis-git.html

Работаеть как и всегда будем на Debian.

Ставим Pear
apt-get install -y php-pear
Добавляем канал:
pear channel-discover pear.nrk.io

Ставим Predis:
pear install nrk/Predis
Базовый пример кода:

require 'Predis/Autoloader.php';
Predis\Autoloader::register();
$redis = new Predis\Client();
$redis->set('foo', 'bar');
$value = $redis->get("foo");
print "$value\n";


Официальный сайт Predis: https://github.com/nrk/predis#readme

Кроме predis еще имеется по меньшей мере 5 клиентов Redis для PHP: http://redis.io/clients


Установка Redis на Debian

Очень просто:
apt-get install -y redis-server
Установочный скрипт сам добавит сервис в автозапуск, а также запустит демона.

Кроме этого, демон забиндится лишь на локальный сокет, что исключает проблемы с безопасностью:

netstat -lnpt|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      19487/redis-server
Теперь попробуем поместить и изъять данные из Redis, это крайне легко сделать посредством telnet:
 telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SET hello 5
world
+OK
GET hello
$5
world

В данном листинге требует описания разве что число 5, это длина строки, которую мы помещаем в Редис.

Тоже самое, но в еще более удобной форме можно сделать через redis cli:

redis-cli
redis> set hello 777
OK
redis> get hello
777
redis> 


Больше информации можно найти по адресу: http://yaychris.com/blog/2009/11/redis-part-1.html 

MySQL просто отвратителен при работы с большими объемами данных!

Сабж :( Сколько можно оптимизировать и все равно его клинит через раз от миллионнострочных таблиц :(

Кто посоветует хорошее быстрое persistent хранилище с удобным интерфейсом? Впрочем, подойдет и  in memory хранилище, но с расширенными возможностями фильтрации.

понедельник, 5 ноября 2012 г.

PowerDNS recursor и iptables state/conntrack

При высокой нагрузке на PowerDNS рекурсор (да и любой другой рекурсор) происходит совершенно безосновательная нагрузка на iptables/conntrack модуль, который фиксирует все до последнего соединения, хотя это совершенно не требуется.

От этого избавиться можно крайне легко - пометив через NOTRACK пакеты  от/к 53 порту:


iptables -t raw -I OUTPUT -p udp --dport 53 -j NOTRACK
iptables -t raw -I OUTPUT -p udp --sport 53 -j NOTRACK
iptables -t raw -I PREROUTING -p udp --dport 53 -j NOTRACK
iptables -t raw -I PREROUTING -p udp --sport 53 -j NOTRACK
iptables -I INPUT -p udp --dport 53 -j ACCEPT
iptables -I INPUT -p udp --sport 53 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 -j ACCEPT


Источник (а также правила на случай IPv6): http://doc.powerdns.com/recursor-performance.html

четверг, 1 ноября 2012 г.

OpenVZ 2.6.18 и hostname, уверены, что все знаете об этом?


Играемся внутри OpenVZ VPS:
ns3:/etc# uname -a
Linux ns3.fastvps.ru 2.6.32-308.8.2.el5.028stab101.1 #1 SMP Sun Jun 24 20:25:35 MSD 2012 i686 GNU/Linux
ns3:/etc# hostname "ns1.fastvps.ru"
ns3:/etc# uname -a
Linux ns1.fastvps.ru 2.6.32-308.8.2.el5.028stab101.1 #1 SMP Sun Jun 24 20:25:35 MSD 2012 i686 GNU/Linux
ns3:/etc# cat /etc/hostname
ns3.fastvps.ru
ns3:/etc# hostname "ns3.fastvps.ru"
ns3:/etc# uname -a
Linux ns3.fastvps.ru 2.6.32-308.8.2.el5.028stab101.1 #1 SMP Sun Jun 24 20:25:35 MSD 2012 i686 GNU/Linux
При этом:
echo "ns1.fastvps.ru" > /proc/sys/kernel/hostname
-bash: echo: write error: Operation not permitted
ns3:/etc# echo -n "ns1.fastvps.ru" > /proc/sys/kernel/hostname
-bash: echo: write error: Operation not permitted 

Да, это фича-бага, в openvz 2.6.32 все происходит совершенно иначе: http://bugzilla.openvz.org/show_bug.cgi?id=2438

пятница, 26 октября 2012 г.

Проброс порта из приватной сети посредством ssh туннулинге

Делается вот так:
sudo ssh -fNL 80:10.0.99.134:80 root@intermediate-machine.ru
В итоге при соединение к локалхосту на 80й порт, реальное соединение будет идти на 80й порт к хосту 10.0.99.134, находящемуся в приватной сети и доступному лишь через промежуточную машину.

OpenVZ и CentOS 6 - установка debug ядра

Открываем конфиг репо:
vi /etc/yum.repos.d/openvz.repo

Там ищем блок: openvz-kernel-rhel6-debuginfo и меняем на enabled=1.

Ставим debug ядро:
yum install -y vzkernel-debug

Активация kdump на CentOS 6 и OpenVZ


Ставим юзерспейс софт:
yum install -y kexec-tools

Проверим, чтобы юзерспейс демон грузился при запуске:
chkconfig --list|grep kdump
kdump           0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл


После этого, убеждаемся, что опция "crashkernel=auto" присутствует среди опций используемого ядра.

Перезагружаемся для применения изменений:
shutdown -r now
Теперь если машина упадет по кернел панику, в папке /var/crash/ мы обнаружим лог того, что творилось с ядром.

В случае отладки проблем OpenVZ ядер рекомендуется использовать дебаг версию ядра.

Источник: http://bugreev.ru/blog:2011:11:21-_kernel_panic_-_%D0%B4%D0%B5%D0%B1%D0%B0%D0%B3_%D1%8F%D0%B4%D1%80%D0%B0 

среда, 24 октября 2012 г.

Конвертер bind конфига в mysql на perl



Скрипт в репозитории zone2sql_perl_convert_bare_to_mysql.pl.

Прямая ссылка: http://fastvps.googlecode.com/svn/trunk/powerdns_zone_converter/zone2sql_perl_convert_bare_to_mysql.pl

Среда разработки и тестирования: Debian 6, в папке /etc/bind/ имеется named.conf и куча зон.

dpkg -l |grep pdns
ii  pdns-backend-mysql               2.9.22-8+squeeze1            generic MySQL backend for PowerDNS
ii  pdns-doc                         2.9.22-8+squeeze1            PowerDNS manual
ii  pdns-server                      2.9.22-8+squeeze1            extremely powerful and versatile nameserver

Суть скрипта, берем команду:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --bare

Она парсит конфиг Bind и представялет его в виде удонбом для парсинга (парсить конфиг Bind самому - очень сложно, нужно учесть огромное множество моментов).

После этого, обрабатываем этот файл и делаем из него удобный для импорта sql файл, который генерируется идентично тому, что создает команда:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --gmysql

Зачем же, спросите Вы, плодить сущности? Это нужно потому что исправить генератор zone2sql (изменить способ создания зон, внести коррективы) почти нереалньо - он написан на сложном C++ c STL, владение которым обычно не значистя в списке умений системного администратора. А мой скрипт испарвить крайне легко! Так как это перл.

Тестирование работы скрипта и идентичности его результата работы тому, что генерирует gmysql.

Создаем папку:
mkdir var

Стягиваем скрипт по ссылке выше и даем ему право исполнения:
chmod +x zone2sql_perl_convert_bare_to_mysql.pl

Запускаем:
./zone2sql_perl_convert_bare_to_mysql.pl 


Он выдаст примерно следующее:
Convert zones to raw file
Process raw data file to sql

Работает он весьма быстро, на 150 тысячах зон всего:
real 0m16.537s
user 0m14.945s
sys 0m1.515s

В итоге в папке var появятся три файла:
error.log - это лог команды zone2sql --bare, некритичные ошибки из него игнорируются автоматически
result_fastvps.sql - результирующий sql файл
zone2sql_raw.dat - bare файл, сгенерированный командой zone2sql.

Итак, сравним результат с тем, что делает zone2sql, для этого вызовем zone2sql:
zone2sql --on-error-resume-next=yes --named-conf=/etc/bind/named.conf --gmysql | sort > var/result_zone2sql.sql
cat var/result_fastvps.sql | sort > var/result_fastvps_sorted.sql 

Сортировка необходима, так как парсеры генерируют немного в разной последовательности.

Сравним по md5:
md5sum var/result_zone2sql.sql
md5sum var/result_fastvps_sorted.sql 


Будьте внимательны при тесте, чтобы содержимое зон не менялось.




Актуальная версия всегда в репозитории: http://code.google.com/p/fastvps/wiki/zone2sql_Perl?ts=1351069503&updated=zone2sql_Perl

Настройка cgroup на CentOS 6

Запускаем демон конфигурации сгрупп:
/etc/init.d/cgconfig start
chkconfig cgconfig on

После этого будут созданы группы:

cat /proc/mounts
rootfs / rootfs rw 0 0
/proc /proc proc rw,relatime 0 0
/sys /sys sysfs rw,relatime 0 0
udev /dev devtmpfs rw,relatime,size=8125048k,nr_inodes=2031262,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/mapper/vg_msk3-lv_root / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sdb1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
/dev/mapper/vg_msk3-lv_home /home ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
/dev/sdc /ssd ext3 rw,relatime,errors=continue,barrier=1,data=ordered 0 0
cgroup /cgroup/cpuset cgroup rw,relatime,cpuset 0 0
cgroup /cgroup/cpu cgroup rw,relatime,cpu 0 0
cgroup /cgroup/cpuacct cgroup rw,relatime,cpuacct 0 0
cgroup /cgroup/memory cgroup rw,relatime,memory 0 0
cgroup /cgroup/devices cgroup rw,relatime,devices 0 0
cgroup /cgroup/freezer cgroup rw,relatime,freezer 0 0
cgroup /cgroup/net_cls cgroup rw,relatime,net_cls 0 0
cgroup /cgroup/blkio cgroup rw,relatime,blkio 0 0


Настравиаем его:
vi /etc/cgrules.conf 
Вписываем в начало5
server-689-5106-ssh cpu client1
Включаем демон автораспихивания процессов по сгруппам на основании имени юзера:
chkconfig cgred on
/etc/init.d/cgred start

Создаем сгруппу, куда будут помещены процессы:
mkdir /cgroup/cpu/client1/
Настроим параметр приоритета процессора:
 echo 512 > /cgroup/cpu/client1/cpu.shares 
После этого, пробуем войти данным пользователем и все его процессы автоматически влетят в группу client1.

Смотрим, чтобы процессы попали в группу:

cat /cgroup/cpu/client1/tasks
18642
18643
18660
18671
18672
18674
18677



Все!

суббота, 20 октября 2012 г.

Отладка mod_rewrite

Дадада! Это возможно!

В случае Debian:

vim /etc/apache2/mods-enabled/rewrite.load 
Там вносим:

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
И перезапускаем апача:
/etc/init.d/apache2 relaod 
В итоге в указанном логе появится море полезной информации, способной помочь отладке!  

вторник, 16 октября 2012 г.

Конфликт зависимостей при установке vzctl на CentOS 5

Текст ошибки:

yum upgrade vzctl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.plusline.de
 * epel: mirror.kiewel-online.ch
 * openvz-kernel-rhel5: mirror.softaculous.com
 * openvz-utils: mirror.softaculous.com
 * updates: ftp.plusline.de
Setting up Upgrade Process
Resolving Dependencies
--> Running transaction check
---> Package vzctl.x86_64 0:4.0-1 set to be updated
--> Processing Dependency: vzctl-core = 4.0-1 for package: vzctl
--> Processing Dependency: vzquota >= 3.1 for package: vzctl
--> Processing Dependency: libcgroup.so.1()(64bit) for package: vzctl
--> Processing Dependency: libvzctl-4.0.so()(64bit) for package: vzctl
--> Running transaction check
---> Package libcgroup.x86_64 0:0.38-1 set to be updated
---> Package vzctl-core.x86_64 0:4.0-1 set to be updated
---> Package vzquota.x86_64 0:3.1-1 set to be updated
--> Processing Conflict: vzctl conflicts ploop-lib < 1.5-1
--> Restarting Dependency Resolution with new changes.
--> Running transaction check
--> Processing Dependency: ploop-lib = 1.4 for package: ploop
---> Package ploop-lib.x86_64 0:1.5-1 set to be updated
--> Running transaction check
---> Package ploop.x86_64 0:1.5-1 set to be updated
--> Processing Conflict: ploop-lib conflicts vzkernel < 2.6.32-042stab061.1
--> Finished Dependency Resolution
ploop-lib-1.5-1.x86_64 from openvz-utils has depsolving problems
  --> ploop-lib conflicts with ovzkernel
Error: ploop-lib conflicts with ovzkernel
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
Суть такова, что vzctl-4 не имеет зависимостей к ploop, но обновить его не так тривиально.

По информации от сотрудников Parallels (Кирилл Колышкин), нужно сделать следующее:
rpm -e --nodeps ploop ploop-lib
yum upgrade vzctl -y
Либо в случае возникновления проблемы , описанной: http://phpsuxx.blogspot.ru/2012/11/ploop-lib-14-1.html (error: "ploop-lib" specifies multiple packages, ошибка: "ploop-lib-1.4-1" задает несколько пакетов)
rpm -e --nodeps ploop-lib.x86_64
rpm -e --nodeps ploop-lib.i386  
rpm -e --nodeps ploop 
yum upgrade vzctl -y

Первоисточник: http://bugzilla.openvz.org/show_bug.cgi?id=2387 

понедельник, 15 октября 2012 г.

Друзья! Не будем безразличны к будущему! Поддержим обращение к министру по поводу IPv6!


Прошу сделать один простейший ретвит: https://twitter.com/odintsov_pavel/status/257828851827228672 чтобы привлечь внимание к вопросу! 

Удобный способ пинговать IPv6 link local адреса

Вместо:
ping6 -I bond0 fe80::1
PING fe80::1(fe80::1) from fe80::6a05:caff:fe02:c5e1 bond0: 56 data bytes
64 bytes from fe80::1: icmp_seq=1 ttl=64 time=1.54 ms
64 bytes from fe80::1: icmp_seq=2 ttl=64 time=0.414 ms
64 bytes from fe80::1: icmp_seq=3 ttl=64 time=0.394 ms
Можно вот так:
ping6 fe80::1%bond0
PING fe80::1%bond0(fe80::1) 56 data bytes
64 bytes from fe80::1: icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from fe80::1: icmp_seq=2 ttl=64 time=0.747 ms
64 bytes from fe80::1: icmp_seq=3 ttl=64 time=0.730 ms
64 bytes from fe80::1: icmp_seq=4 ttl=64 time=0.703 ms
64 bytes from fe80::1: icmp_seq=5 ttl=64 time=0.686 ms
 

Ростелеком - тормоз прогресса! Бойкот Ростелекому!

Место действия  - Ростелеком, Санкт-Петербург, Приморский район, интернет для юридического лица за 35 тысяч рублей.

Жалоба в Ростелеком из-за отказа выделения IP:
Добрый день Суть претензции следующая - отсутствие технической возможности выделения нам соединения по IPv6 в дополнение к IPv4. Для нас наличие данной услуги крайне критично, так как мы работаем с ресурами доступными по протоколу IPv6 и нам необходма высокая скорость работы по данному протоколу. Считаю непреимлемым, что данная услуга не оказывается (по словам нашего менеджера) для корпоративных клиентов. Пожалуйста, разъясните, в чем заключается фундаментальная невозможность предоставления нам доступа к наиболее современной части сети Инетрнет
И феерический ответ:
Уважаемый Павел Одинцов,

благодарим Вас за то, что пользуетесь услугами нашей компании и на Ваше обращение сообщаем.

К сожалению, в настоящее время ОАО «Ростелеком» не предоставляет доступ к сетевым ресурсам Интернет с использованием поротокола IPv6.

Предоставление параллельного доступа по протоколам IPv4 и IPv6 будет производиться после исчерпания IP адресов протокола IPv4. Ориентировочно об использовании протокола IPv6 можно говорить не ранее конца 2013 года.

Сожалеем о доставленных неудобствах, надеемся на понимание и долгосрочное сотрудничество.

И.о. начальника отдела по работе с претензиями

И.В. Свидер

Изумительная исполнительница Lindsey Stirling!

Рекомендую! Клипы - потрясающие: 

Myöntäjämaa в анкете на визу Финляндии

Не пугаемся, это страна выдачи паспорта! Выбираем "Russia" :)

вторник, 9 октября 2012 г.

Русификация Wordpress

Как оказалось, нетривиальнйы процесс весьма. Например, перевод от ru.wordpress.org крайне неплолный, от mywordpress.ru на порядок полнее.
mkdir russian
cd russian
wget -Orussian.tar.gz 'http://mywordpress.ru/wp-content/plugins/download-monitor/download.php?id=31'
unzip russian.tar.gz
mkdir /var/www/admin/data/www/blog.ru/wp-content/languages

И переносим файл языка
mv ./wordpress/wp-content/languages/ru_RU.* /var/www/admin/data/www/blog.ru/wp-content/languages
 Устанавливаем русский стандартным:
vim wp-config.php
define('WPLANG', 'RU_ru');





пятница, 28 сентября 2012 г.

Запуск lighttpd на машине с активированным IPv6 на нестандартном порту в Debian Squeeze

Кроме прописывания в основной конфиг строки:
# added by fastvps
server.port = 8888
Проблемы могут возникнуть, если используется нестандартный порт. В этом случае нужно исправить в файле /usr/share/lighttpd/use-ipv6.pl порт с 80 на 8888.

Иначе будет вылазить ошибка:
Starting web server: lighttpd2012-09-28 14:27:28: (network.c.358) can't bind to port: :: 80 Address already in use

Использование puppet для локальной установки на Debian

Устанавливаем puppet:
apt-get install -y puppet
 Создаем конфиг:
vi local.pp
Со следующим контентом:
package {
    "iotop":
        ensure => latest
}
file { '/root/target':
    source => 'file:///root/source' }
}
 Создаем source файл:
echo "test" > /root/source



Применяем изменения:
puppet local.pp
notice: /Stage[main]//Package[iotop]/ensure: ensure changed 'purged' to 'latest'
notice: /Stage[main]//File[/root/target]/ensure: defined content as '{md5}d8e8fca2dc0f896fd7cb4cb0031ba249'

Проверяем результат:

cat /root/target
test
billing:/var/www/billing/data/www/billing.fastvps.ru# dpkg -l |grep iotop
ii  iotop                               0.4-2+squeeze1               simple top-like I/O monitor
Вот все так просто. Локальный standalone puppet можно использовать для развертывания окружения для всякого хитрого софта. 



Установка PHP idn расширения на Debian 6

Все довольно просто:
apt-get install -y libidn11-dev  php5-dev
pecl install channel://pecl.php.net/idn-0.2.0
echo "extension=idn.so" > /etc/php5/conf.d/idn.ini
Проверяем работу:
php -r 'echo idn_to_ascii("фаствпс.рф"),"\n";'
xn--80ae3bgcdl.xn--p1ai

среда, 26 сентября 2012 г.

Будет ли видна вся память на многопроцессорной плате, если один процессор не установлен?


Нет!

The memory slots associated with a given processor are unavailable if the  corresponding processor socket is not populated.

Источник: http://download.intel.com/support/motherboards/server/s2600cp/sb/470273_g26942_003_s2600cp_p4000cp_tps_r1_1.pdf

Какие есть версии кодировщика IonCube и чем они отличаются?

There are three versions of the Encoder. The base version is available for $199, and offers the core encoding features essential to protecting PHP source code.

The Pro Version ($299) and Cerberus ($379) add features for creating license files to restrict scripts to run on specific machines, and also to stop files from running beyond a certain point in time if this is required. The Pro version can restrict files to any combination of IP addresses and server names, and Cerberus can also lock files to specified MAC addresses.

The Windows Pro and Cerberus Encoder also includes a license generator for Linux (and optionally FreeBSD or OS X) so that with a single product license, you can encode scripts on Windows and create license file for your scripts either from Windows or Unix. This is great if wanting to automate license file generation from a web server.
Источник: http://support.ioncube.com/index.php?/Knowledgebase/Article/View/8/5/how-much-does-the-standalone-encoder-cost

воскресенье, 23 сентября 2012 г.

Google Blogger плохая индексация и проблемы с robots.txt

Стандартный robots.txt на Blogger имеет примерно следующий вид:
User-agent: Mediapartners-Google
Disallow: 

User-agent: *
Disallow: /search
Allow: /

Sitemap: http://phpsuxx.blogspot.com/feeds/posts/default?orderby=UPDATED

Казалось бы, что тут все хорошо, но вовсе нет! Облако тегов (туча справа), на создание которого я потратил по меньшей мере неделю своего времени из-за такого robots.txt полностью игнорируется поисковиками, что принесло мне исключение почти 700 страниц из индекса поисковика Yandex (и как следствие - почти полному остутствию трафика с него).

Не в пример Yandex, Google блог отлично индексировал, но это скорее "вопреки", чем "благодаря", так как у Google мой блог и хостится и им не обязательно было вообще использовать веб доступ, а можно было взять тексты напрямую - из собственных баз (делают они так или нет - вопрос открытый).

Итак, почему же так происходит? По всем правилам создания сайтов "приятных для поисковиков" нужно исключать поиск из индексации, что и было сделано запретом строки /search (поисковая строка поиска по блогу имеет вид - http://phpsuxx.blogspot.com/search?q=searchphraze). Но такой же формат ссылки имеет и фильтр по тегам - http://phpsuxx.blogspot.com/search/label/Debian, который я использую как способ навигации по разделам.

Так как я не специалист по оптимизации, нашел имеющееся решение (которое также исключает паразитные страницы назад/вперед из индекса) в отличном блоге: http://www.danpros.com/2012/03/setting-up-robotstxt-on-blogger.html

Новый robots.txt принимает вид:


User-agent: Mediapartners-Google
Disallow:

User-agent: *
Disallow: /search?updated-min=
Disallow: /search?updated-max=
Allow: /

Sitemap: http://phpsuxx.blogspot.com/feeds/posts/default?orderby=UPDATED
Итого, мой robots.txt теперь выглядит как http://phpsuxx.blogspot.com/robots.txt и теперь облако тегов должно корректно индексироваться всеми поисковиками :)