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

php+FreeBSD: Cannot find autoconf.


Иногда по непонятным причинам при установке модулей выдаёт

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

Фикс (для csh):
setenv PHP_AUTOCONF `which autoconf`
setenv PHP_AUTOHEADER `which autoheader`
Разумеется, требуемые пакеты должны стоять. Обычно они ставятся в /usr/local/bin/{autoconf,autoheader}

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

setenv PHP_AUTOCONF autoconf-2.69
setenv PHP_AUTOHEADER autoheader-2.69
(версию ставим нужную)
после этого phpize отрабатывает.

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

Начало развала GNU?

Лидеры проектов GnuTLS, grep и sed выходят из движения GNU в знак несогласия с политикой Фонда СПО


"Никос Маврогианнопулос (Nikos Mavrogiannopoulos), создатель, ключевой разработчик и лидер проекта GnuTLS, объявил о выводе GnuTLS из-под контроля Фонда СПО и движения GNU. Разработка GnuTLS перемещена из инфраструктуры GNU, при передаче кода проекту больше не требуется подписание соглашения о передаче имущественных прав Фонду СПО.

В качестве причины называется несогласие с системой принятия решений и действиями Фонда СПО, притом, что Никос по-прежнему остаётся сторонником идей, продвигаемых Фондом СПО. Указывается на то, что в движении GNU отсутствует возможность влияния на принятие решений, все решения единолично исходят от Столлмана, а не принимаются в ходе дискуссий, учитывающих различные мнения. Поэтому Никос устал от того, что его участие в проекте ограничивается только написанием кода, без возможности выражения и обсуждения различных точек зрения."

И далее несколько неадекватная позиция Столлмана, который держится за власть зубами.

Истинные причины неизвестны. То ли проблемы с финансированием, то ли невозможность отдавать код под двойной лицензией и зарабатывать на закрытой версии, то ли неадекватность Столлмана... Сложно судить. Тем не менее, если это будет первым шагом и другие так же начнут выходить из проекта - Столлману не поздоровится.
Только имеет смысл сразу создать другой фонд, чтобы собирать этих уходящих на других условиях... И потом, "Если это плохо реализовано в Unix, не стесняйтесь заменить это на что-то совершенно иное и более совершенное"...

Хотя лишнее дробление чревато сказкой про журавля, рака и щуку.

MySQL Master-Master

Основная дока этой заметки:
Опыт эксплуатации MySQL Master-Master — как пережить аварию датацентра

Плюс о репликации у меня есть
http://dragonflybsd.blogspot.ru/search/label/mysql

Находки программиста: Nginx+Redis: делаем асихронное web-приложение для больших нагрузок

Находки программиста: Nginx+Redis: делаем асихронное web-приложение для больших нагрузок

oDesk

Иностранный фриланс-портал oDesk

nginx: secure_link

http://nginx.org/ru/docs/http/ngx_http_secure_link_module.html
http://wiki.nginx.org/HttpSecureLinkModule

Недокументированные возможности secure_link
Ограничения в secure_link «реальном» мире

Защита от хотлинкинга с помощью настройки nginx

если отдаются файлы с левыми именами:
http://gogs.info/2010/03/set-filenames-with-nginx-secure-download-module/

Для работы нужны ngx_devel_kitngx_http_set_hash

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

Облако от infobox

Вот и infobox включился в популярные нынче облака. Вот только их облако относительно честное типа селектела или это обычный VDS, который можно с натяжкой назвать облачным vds (но не честным облаком!)?
Сам сервис, на базе решения Parallels Automation for Cloud Infrastructure:
http://infobox.ru/cloud/servers/

Хотя судя по ценам, появляется надежда что это настоящее честное облако, где оплата именно по потреблению, а не за то, что выставляли предварительно.

Некоммерческое тестирование продлится до 1 февраля 2013 года.

Хотя надо относиться к услугам компании infobox с некоторой осторожностью: месяца 2 назад они полностью лежали по меньшей мере пол дня (мне помнится, что более суток), включая их днс, которые обязаны быть географически распределены. Так что мешает лечь их облаку при очередном DDoS?
Тем более у них НЕТ нормального дц, а тот что есть, тянет хорошо если на минимальный уровень. Дизеля нет, охлаждение уличным воздухом без фильтров, каналы довольно тощие, покупать честные МБиты канала довольно дорого, около 1.5к руб за 1мбит... Хотя есть надежда, что у них арендованы стойки в 2-3 нормальных современных ДЦ и весь траф не проходит через 1 место (вспоминаем селектел, когда московский ДЦ не был доступен из-за аварии в питере).

UP
http://twitpic.com/r5rpv

Amazon Glacier

Скинули недавно линк на новый сервис амазона Amazon Glacier. Это такое мегадешёвое хранилище для бэкапов со временем доступности данных оттуда порядка 4-5 часов

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

mysql и репликация: Multi-Master Replication Manager for MySQL

MMM (Multi-Master Replication Manager for MySQL) is a set of flexible scripts to perform monitoring/failover and management of MySQL master-master replication configurations (with only one node writable at any time).
То есть это master-master в режиме active-passive.

Основной сайт
http://mysql-mmm.org/
Но там есть такое:
NOTE: By now there are a some good alternatives to MySQL-MMM. Maybe you want to check outGalera Cluster which is part of MariaDB Galera Cluster and Percona XtraDB Cluster.

Судя по тому, что "по вопросам обращайтесь в перкону", лучше действительно посмотреть на Galera/XtraDB.

"Сейчас, в контексте настоящей синхронной Master-Master репликации (когда целостность данных гарантируется и писать можно одновременно на все ноды кластера) много говорят про Galera. Кто-то скажет, что для этого можно попробовать использовать давно известный MySQL NDB Cluster — но широко известно, что этот «автожир» подходит очень узкому кругу приложений, редко из мира веб.
Мы с интересом следим за Galera — возможно именно на ней в будущем будут строить подлинные Master-Master кластера, а пока посмотрим что полезного можно извлечь из имеющихся хорошо проверенных стабильных инструментов."
http://habrahabr.ru/company/bitrix/blog/146490/
И снова битрикс-блог...

Галеру/XtraDB рассмотрю отдельно, как руки дойдут. Скорее всего, будет применяться у нас для отказоустойчивости, гео-кластер.

Даже с MMM остаётся вопрос идентичности данных на нодах. Как там реализована проверка целостности? Есть ли тогда автоматическое лечение? Скорее всего, нет ничего, и для небольших таблиц надо делать CHECKSUM TABLE, а с большими будет засада.

Линки
Installation Guide
http://mysql-mmm.org/mysql-mmm.html
http://habrahabr.ru/company/bitrix/blog/146490/

бэкап mysql без простоев

Самый простой метод бэкапа - на рабочем сервере - часто вызывает простои, поскольку на время бэкапа БД вешает локи, и на больших таблицах это бывает очень заметно. Простой способ решить эту проблему - сделать на отдельном или даже том же сервере инстанс БД в режиме slave, только не забываем выставить уникальный server-id и прописать в конфиг слейву режим read-only. И теперь можно сделать очень интересную штуку: остановим слейв (достаточно только SQL thread) и можно дампить. Из плюсов - мы даже можем дампить разные базы и таблицы в разные файлы, сохранив при этом целостность репликации! То есть можно потом загрузить на новый сервер все эти файлы, и мы будем знать master_log_pos для этой схемы! Суть в том, что поскольку слейв остановлен, master_log_pos меняться не будет, поэтому достаточно сохранить пару log_pos и log_file и мы можем использовать этот комплект при разворачивании нового слейва или даже мастера. Главное, не забыть залить полную структуру :)

Есть вариант 2, поставив flush tables with read lock и сделав снапшот, но это хоть небольшой но простой и не очень хорошо автоматизируется: из самого mysql не сказать "сделать снапшот", и нельзя закрывать соединение с базой раньше времени, иначе лок снимется. Вдобавок, если была обработках больших объёмов, можно очень долго ждать пока лок встанет, что может сильно увеличить простой системы. И опять же для правильного бэкапа нужен отдельный инсанс базы, например innodb нельзя бэкапить просто запаковав его файлы.

Вариант 3 - используя mysqldumpslow, но ничего про него сказать не могу, у нас пока не применялось. И вопрос с сохранением master_log_pos, особенно применимо к записи по разным файлам.

Для MyISAM есть метод простого копирования файлов, сделать только сначала flush tables, и снова это не сохранит позицию.

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

Python Imaging Library во FreeBSD

Нужно для django например. Странно, что пакет py27-django-1.4.2 (у меня) не втянул PIL по зависимостям.

Находится оно в graphics/py-imaging, впрочем есть еще graphics/py-pillow, юзер-френдли вариант. хз в чём это выражается.
Также может потребоваться поставить graphics/jpeg, если его не втянет само. Выражаться будет в том, что с jpeg будут ошибки, а всякие png будут обрабатываться нормально.

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

ZFS+DTrace+Zones+KVM

ZFS+DTrace+Zones+KVM
http://smartos.org/


SmartOS is a specialized Type 1 Hypervisor platform based on Illumos. It supports two types of virtualization:
  • OS Virtual Machines (Zones): A light-weight virtualization solution offering a complete and secure userland environment on a single global kernel, offering true bare metal performance and all the features Illumos has, namely dynamic introspection via DTrace
  • KVM Virtual Machines: A full virtualization solution for running a variety of guest OS's including Linux, Windows, *BSD, Plan9 and more

SmartOS is a "live OS", it is booted via PXE, ISO, or USB Key and runs entirely from memory, allowing the local disks to be used entirely for hosting virtual machines without wasting disks for the root OS. This architecture has a variety of advantages including increased security, no need for patching, fast upgrades and recovery.

Как работает ZFS

Как работает ZFS

Интересные материалы, плюс в комментах много.
часть 1: vdev
часть 2: metaslab

По мере появления буду обновлять, "в планах как минимум 8-10 статей про разные компоненты ZFS"

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

IPv4: вести с фронта

Из-за нехватки ipv4 адресов гайки начали закручивать уже несколько лет как.

Сейчас многие провайдеры не выдают более 1 блока, и для расширения этого блока надо сдать старый и сделают новый. Требования к причинам получения ужесточаются, первыми попали в запреты СЕО, которые часто выкупали под нужды проксей и парсинга блоки по 256 адресов и более (.24), потом были всякие VPN, всё неохотнее начали выдавать под виртуализацию. Многие полностью отказались от выдачи блоков и айпи можно получать только поштучно, описывая для каждого сферу применения.

Многие компании начали вводить плату за каждый айпи, например в fastvps 1 дополнительный айпи стоит 1200р, и более того, лимит 2-3 айпи на сервер.

Селектел также вводит оплату, но уже абонентку:
"С 17 января 2013 года вводится абонентская плата за аренду IPv4 адреса для услуги облачных серверов.
Стоимость аренды составит 10 копеек/час (2.4 рубля в сутки) за каждый арендованный IPv4-адрес.

Для того, чтобы сохранить возможность использовать ресурсы облака с минимальной стоимостью, мы к 17 января реализуем функцию, позволяющую отказаться от аренды IPv4 адреса и использовать только IPv6.

Введение мер по уменьшению использования IPv4-адресов и стимуляции перехода на IPv6 является вынужденной."
Из тикетов. То есть в месяц 1 айпи будет выходить примерно в 70 руб.

Документ, на который опираются многие:
https://www.ripe.net/ripe/docs/ripe-553

пятница, 14 декабря 2012 г.

хостинг rucenter - небольшой faq

переключение версии php
http://hosting.nic.ru/support/shift_host.shtml#p6

не работает session_start
http://forum.nic.ru/showthread.php?t=3713
(выключен модуль session)
Зайдите в Панель управления хостингом - Веб-сервер - Управление модулями - Далее кликаете на включенный у вас модуль PHP и там включаете session.
Там же можно и нужно включать mysql, mysqli, итд.

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

CentOS 5 и perl 5.10+

Дело в том, что штатно версия в системе 5.8.8.
Если надо свежее:
1) Подключить допрепу, например
https://packages.endpoint.com/rhel/5/os/

wget https://packages.endpoint.com/rhel/5/os/`uname -i`/endpoint-repo-1.0-2.i386.rpm
rpm -i endpoint*

yum install local-perl и далее perl-* заменяем на local-perl-*
(тут версия 5.10)

2) использовать perlbrew

The "Modern" way of setting up a version of Perl different from the system Perl is by using
perlbrew - this way you can maintain a Perl version on a per-user basis without messing too much with the system installed perl; this way system installed stuff that uses Perl still works without problems.

http://serverfault.com/questions/269018/perl-5-10-on-centos-5

yum install perlbrew

perlbrew init
(выполняем, что сказали)

смотрим список того, что нам вообще доступно
perlbrew available

Ставим.
perlbrew install perl-5.12.5
но тут можно получить "упс":

Можно получить
Installing /root/perl5/perlbrew/build/perl-5.12.5 into ~/perl5/perlbrew/perls/perl-5.12.5

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.log

Installing /root/perl5/perlbrew/build/perl-5.12.5 failed. See /root/perl5/perlbrew/build.log to see why.

А в логе:
...
./trygcc: line 25: gcc: command not found
./checkcc: line 10: cc: command not found
Uh-oh, the C compiler 'cc' doesn't seem to be working.

То есть нету gcc.
Доставим:
yum install -y gcc
Как я понимаю, компилятор обязателен, тогда непонятно, почему он не указан в зависимостях.

Повторяем install, получаем

Installed /root/perl5/perlbrew/build/perl-5.12.5 as perl-5.12.5 successfully. Run the following command to switch to it.

  perlbrew switch perl-5.12.5


Какие версии доступны для переключения
perlbrew list

Больше информации в perlbrew help

Также к нему рекомендуют ставить cpanm
плюс
"в общем, если сильно беспокоит вопрос актуального состояние всего и вся, то можно поставить App::cpanoutdated и с нужной периодичностью запускать «cpan-outdated | cpanm» сначала в тестовом окружении, а затем в продакшене"

3) собрать свои пакеты и поставить их.
Полно док типа
http://administraher.blogspot.ru/2010/12/upgrade-perl-588-to-5122-perl.html
но проблема в make install clean без контроля, что куда и как ставится. Поэтому _необходимо_ собрать пакеты и уже ставить их.
И да, будет конфликт версий, поэтому ставить надо будет  в нештатное место, что опять же при тупом make install clean приведет к проблемам.
И вообще, если perlbrew делает всё нужное включая отслеживание, сборку и установку, зачем извращаться?...

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

awstats в CentOS

В версии 6 пути были
/usr/share/awstats/wwwroot

Тогда как в 7 уже
/var/www/awstats/

Поэтому и настройки отличаются.
У меня selinuх отключается за ненадобностью, поэтому если нужна его настройка - искать отдельно правила.

Итак, сначала подключаем rpmforge. Потом
yum install awstats

Теперь надо проверить конфиг /etc/httpd/conf.d/awstats.conf, путь должен быть /var/www/awstats. Если не так - посмотреть в /etc/httpd/conf.d/awstats.conf.rpmnew

Часть 2:
настройка.
Настройки для парсинга сайтов лежат в /etc/awstats/ в формате awstats._site_.conf
Настроек в файле много, подробнее есть в доках. За основу можно взять конфиг awstats.model.conf

Для генерации статистики автоматом ставится скрипт на запуск раз в час, в
/etc/cron.hourly/00awstats
вписывается
/usr/bin/awstats_updateall.pl now -confdir="/etc" -awstatsprog="/var/www/awstats/awstats.pl"

Ручное обновление

awstats_buildstaticpages.pl -config=_site_ -update
(для 6 версии было perl /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=_site_ -update)


Теперь обращаемся за данными
site.com/awstats/awstats.pl?config=_site_
где вместо _site_ вписываем сайт так, как он указан в имени конфига.

Сами данные лежат в
/var/lib/awstats/

Нюансы
Лучше сразу настроить access_log как combined и указать это в настройках awstats для сайта, там информации будет побольше.

4 - Apache or Squid native common log format (NCSA common/CLF log format)
With LogFormat=4, some features (browsers, os, keywords...) can't work.

это про тип common.

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

503 Forbidden

You don't have permission to access /awstats/awstats.pl on this server.

Причина: в /etc/httpd/conf.d/awstats.conf прописано
order deny,allow
deny from all
allow from 127.0.0.1
решение - вписать свои айпи или просто сделать order allow,deny

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

nginx: внутренние переменные

http://wiki.nginx.org/HttpCoreModule#Variables

$uri + $args - полный исходный запрос без протокола и имени сайта.
$server_protocol + $host + $uri + $args - плюс имя хоста и протокол
$request_uri - адрес до модификаций, $uri (оно же $document_uri) - после.

Ещё из наиболее часто используемых (у нас)

$cookie_COOKIE
The value of the cookie COOKIE;



$http_HEADER
The value of the HTTP request header HEADER when converted to lowercase and with 'dashes' converted to 'underscores', e.g. $http_user_agent, $http_referer...;


$is_args
Evaluates to "?" if $args is set, "" otherwise.



Для отладки может пригодиться модуль echo.

?: keys.gnupg.net: Host not found

Бывает и так:

# gpg --keyserver  hkp://keys.gnupg.net --recv-keys E9F0E9223BBF077A
gpg: requesting key 3BBF077A from hkp server keys.gnupg.net
?: keys.gnupg.net: Host not found
gpgkeys: HTTP fetch error 7: couldn't connect: Connection timed out
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

Решение, поиск которого занял пол дня - использовать другой сервер. Вопрос именно в том, какой сервер указывать.
# gpg --keyserver hkp://subkeys.pgp.net --recv-keys E9F0E9223BBF077A

Дальше как обычно
# gpg -a --export 3BBF077A | apt-key add -

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

nginx: пишем location-ы

Оказалось, есть нюансы...

Основная дока:
(en) http://wiki.nginx.org/HttpCoreModule#location
(ru) http://wiki.nginx.org/NginxRuHttpCoreModule#location
Лучше читать англ версию, она актуальнее и более полная. Что странно, учитывая автора.

2 вида записи:

location [ = | ~ | ~* | ^~ ] uri { ... }
location { } @ name { ... }

Первый вариант рассмотрим далее, 2 - это внутренняя секция, куда можно попасть через try_files, error_page

Шаблоны указываются без кавычек.


Порядок обработки:

  1. = Строковые совпадения. Если найдено, проверка заканчивается. = значит полное совпадение шаблона и проверяемой строки, например = / - заход в секцию будет исключительно для корня, и даже файлы в корне уже сюда не подходят.
  2. ^~ Приоритетное строковое значение. Хотя по-моему было бы правильнее назвать "приоритетным регулярным выражением", поскольку в отличии от = требуется совпадение только начала. ^~ / полностью отключит регулярные выражения для секции server, если нет более точного location без ^~
  3. Строковые значения (/download/). Ищется максимальное совпадение, смотрится только с начала пути. Если нужно совпадение вида /*/download/, то это уже будет п.4, так что в уме можно читать такую запись как /download/* Но на этом проверка не заканчивается!
  4. ~, ~* Регулярные выражения, в порядке определения в конфиге. При совпадении - выполняется этот регэксп, проверка заканчивается. ~ - с учётом регистра, ~* - без.
  5. Если не было найдено подходящей регулярки, используется наибольшее совпадение из п.3.

"Для определения соответствия location'а и запроса сначала проверяются location'ы, заданные обычными строками. Среди них ищется максимальное совпадение. Так как строки лексически отсортированы, то поиск прекращается, как только URI становится лексически больше location'а. Конфигурация максимально совпавшего location'а запоминается. Затем проверяются регулярные выражения. В отличие от обычных строк, они не сортируются, а проверяются в порядке их следования в конфигурационном файле. И, кроме того, поиск прекращается уже после первого совпадения.

Если нужно запретить проверку регулярных выражений после проверки обычных строк, то это можно сделать с помощью префикса "^~". Если у максимально совпавшего location'а есть этот префикс, то регулярные выражения не проверяются.

Кроме того, с помощью префикса "=" можно задать точное совпадение URI и location. При совпадении поиск сразу же прекращается, так как дальше искать не имеет смысла. Например, если запрос "/" очень частый, то указав "location = /", можно ускорить обработку этого запроса, так как поиск location прекратится после первого же сравнения."

Некоторую путаницу может вызвать ^~ - тильда это признак регулярки, но символы регулярных выражений не принимаются.

Как быть, если надо ловить пути вида /что-то/что-то-еще/path123/ ? Путь только 1 - регэкспы.
location ~ /path123/ {

При отладке не забываем про режим debug в error_log сайта и оператор break, позволяющий остановить проверку.

Mysql: некоторые особенности ORDER BY

Оптимизация ORDER BY — о чем многие забывают

Мы тоже с этим столкнулись. В одной базе один запрос выполнялся 30-50 сек, с join 7 таблиц (такова структура проекта). При этом для одной из таблиц почему-то не использовались индексы, хотя они все были, и выбирало каждый раз все 500к строк, чтобы оставить в итоге 1. Плюс Using temporary; Using filesort

Убрав в конце ORDER BY, запрос стал выполняться порядка 5 секунд, и стали использоваться индексы Using index, но в rows всё-равно указывало все 500к строк.

Перешли на SELECT STRAIGHT_JOIN, сохранив сортировку - время вышло тоже порядка 5с, но при этом снова сортировало всё.

Плюс
http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html
Как MySQL оптимизирует ORDER BY, LIMIT и DISTINCT