пятница, 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 [email protected] -s unsubscribe  [email protected]
 Зачем все это нужно? Ряд систем рассылки требуют отмены подписки с адреса, с которого была подписка (вполне разумно), до недавнего времени времени гмейл позволял отсылать письма и от имени гмейл и от имени гуглмейл, но вот недавно запретил посылку от гуглемейл и поэтому приходится немного хитрить, чтобы отписаться.

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

Лучше сказать сложно: 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