вторник, 30 апреля 2013 г.

Включение maintenance режима в Nginx без помощи системного администратора

Вчера реализовал новую, более удобную для разработчиков, возможность перевести сайт в maintenance режим для всех посетителей, кроме тех, кто заходит с определенных ip (сайт всегда доступен самим разработчикам).

Имеем два ip адреса, с которых нужно пускать клиентов независимо от текущего режима сайта (для примера 67.81.43.124 и 67.23.44.5). Чтобы для включения maintenance режима не нужно было дергать администратора, будем считать наличие файла maintenance.flag в корне сайта, признаком включения maintenance режима.

Я использую nginx из Debian Squeeze и примеры будут ориентированы на него.

Для поддержки нового режима я добавил несколько секций в /etc/nginx/sites-enabled/www.example.com

geo $show_maintenance_page {
    default yes;
    67.81.43.124 no;
    67.23.44.5 no;
}

server {
    listen 80;
    server_name www.example.com example.com;

    if ( -f /var/www/www.example.com/maintenance.flag ) {
        set $maintenance y;
    }

    if ( $show_maintenance_page = yes ) {
        set $maintenance y$maintenance;
    }

    if ( $maintenance = yy ) {
        return 503;
    }

    error_page 503 @maintenance;

    location @maintenance {
        root /var/www/maintenance;
        rewrite ^(.*)$ /maintenance.html break;
    }

    # All other config

}

Содержимое /var/www/maintenance у меня существует еще с прежнего варианта, который я описывал ранее. Теперь чтобы перевести сайт в режим maintenance нужно создать файл maintenance.flag в корне сайта (/var/www/www.example.com). После этого всем посетителям будет выдавать maintenance страницу, а для тех, кто заходит с адресов 67.81.43.124 или 67.23.44.5 будет доступен сайт. Чтобы выключить maintenance достаточно удалить файл maintenance.flag.

понедельник, 22 апреля 2013 г.

WHM/cPanel: There are no databases associated with your account

Столкнулся с тем, что для некоторых пользователей в cPanel в разделе "MySQL Databases" стало долго думать, а затем выдавать ошибку "There are no databases associated with your account.".

Гугл выдает аналогичные проблемы и много вариантов решений, но мне ни одно не помогло. Базы видны в phpMyAdmin, но в cPanel с ними работать не удается.

Пока дебажил, заметил в процессах такую связку

cpsrvd (SSL) - waiting for c --llu=1366639891 --listen=3,4,5,6,7,8
 \_ cpaneld - serving 117.65.29 --llu=1366639891 --listen=3,4,5,6,7,8
    \_ /usr/local/cpanel/cpanel ./frontend/x3/sql/index.html
       \_ /usr/local/cpanel/bin/cpmysqlwrap
          \_ /usr/local/cpanel/3rdparty/bin/perl /usr/local/cpanel/bin/cpmysqladmin

Если подключиться к последнему процессу через strace, то видно что он ожидает на вызове read. Поскольку название скрипта намекает на связь с mysql, то смотрю список активных запросов

...
select TABLE_SCHEMA as DB,SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) AS SPACEUSED from information_schema.ta
...

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

Если несколько раз обновить страницу, то становится заметно, что ошибка появляется примерно через 2 минуты. Начинаю смотреть код скрипта и в первых строках нахожу причину

29 
30 $SIG{'ALRM'} = sub { die "Timeout: Alarm"; };
31 
32 alarm 120;
33 

Получается, что скрипт взводит "будильник" на 2 минуты и именно он мешает скрипту выполниться до конца. Меняю в 30 строке alarm 120 на alarm 300.

Теперь показ списка баз работает без ошибок. Правда непонятно, что делать с обновлениями cPanel, но этой проблемой займусь, когда она возникнет.

вторник, 16 апреля 2013 г.

Wine 1.5.28 for Debian Squeeze/Wheezy

Done with packaging Wine 1.5.28 for Debian Squeeze (i386, amd64) and Debian Wheezy (i386 only). Changelog for the new release. Binary packages can be installed via my repository.

Multi-arch support for Wheezy still not fixed.

суббота, 6 апреля 2013 г.

Переключение SATA в режим AHCI на ASUS EeePC 1000H


Чтобы получить максимум производительности от использования SSD диска в своем нетбуке ASUS EeePC 1000H мне пришлось поискать модифицированный BIOS, где есть поддержка этого режима. AHCI нужен для использования команды TRIM (по-умолчанию в 1000H sata порт работает в режиме эмуляции IDE и изменить это нельзя).

Поиски в гугле привели меня в ветку форума сайта bios-mods.com, где добрые люди выложили модифицированный BIOS для EeePC 1000H. На форуме можно скачать несколько модификаций этого BIOS, самая базовая из них только меняет OEM лого и включает опции настройки режима порта SATA. Я брал вариант ASUS 1000H ACPI BIOS Revision 2204GT (AHCI). На всякий случай я сделал зеркало этого файла у себя: 1000H-ASUS-2204GT-01.RAR

Для обновления BIOS нужна флешка, отформатированная в FAT32 (я использовал свою старую на 512MB). В архиве есть файл1000H-ASUS-2204GT-01.ROM, его нужно скопировать в корень вашей флешки и переименовать в 1000H.ROM. После этого перезагрузить нетбук и нажать Alt+F2 в момент прохождение POST - начнется процесс обновления BIOS (каждый раз, когда меняю прошивку в железе на мгновение замирает сердце, пока бежит прогрессбар).

После завершения прошивку нужно выключить нетбук и включить заново. При включении он пожалуется на неверную контрольную сумму и предложит либо продолжить загрузку (нужно нажать F2), либо зайти в BIOS и настроить параметры (нужно нажать F1). Я выбрал последний вариант.

Зайдя во вкладку "Advanced" в категории "IDE Configuration", задаю значение параметра "ATA/IDE Configuration" равным "Enhaced".

После этого активируется параметр "Configure SATA as" - его значение нужно выставить в "AHCI".

После сохранения параметров и перезагрузки SATA работал уже в режиме AHCI.

UPDATE: После установки старого жесткого диска появилась пауза при перезагрузке (примерно 30 секунд). При выключении такой паузы нет. Если SATA в режиме AHCI и установлен SSD диск, то паузы нет, а если установлен жесткий диск - пауза есть. Решается переключением SATA порта в режим эмуляции IDE.

среда, 3 апреля 2013 г.

Наглядное пособие по работе garbage collector в SSD дисках

Хорошая картинка для понимания работы SSD диска. Наглядно показано что такое page и erase block и как работает garbage collector.



Взято отсюда.

вторник, 2 апреля 2013 г.

Оптимизация дисковой подсистемы

В процессе апгрейда дискового массива одного из серверов я решил применить пару оптимизаций, которые на мой взгляд могут дать прирост производительности дисковой подсистемы.

Сперва добавил битмап к raid - это даст возможность быстрее восстановить raid массив после сбоя, поскольку будут синхронизироваться только занятые блоки, которые помечены в битмапе как используемые.

# mdadm -C /dev/md3 -b internal -c 64 -l 5 -n 4 /dev/sd[e-h]2

Размер чанка (chunk) нового массива равен 64k, теперь нужно создать группу томов на новом массиве используя выравнивание по размеру чанка.

# pvcreate -M2 --dataalignment 64k /dev/md3

Осталось переместить данные со старого raid массива на новый

# vgextend vg00 /dev/md3
# pvmove /dev/md1
# vgreduce vg00 /dev/md1

Ссылки
1 http://wiki.tldp.org/LVM-on-RAID
2 https://raid.wiki.kernel.org/index.php/RAID_setup