apache и mod_ruid – исполнение скриптов от имени пользователя

При использовании mod_php все скрипты исполняются от имени веб-сервера (www-data, apache, etc), из-за чего довольно трудно определить чем занят тот или иной процесс и кто делает нагрузку.
Да, можно использовать suPHP, fastCGI и т.д. Но в таком случае можно забыть про выставление параметров в .htaccess, потеря производительности, невозможность использования mod_php и другие фишки.
Можно использовать peruser или mpm-itk. В первом случае будут плодиться процессы, каждый из которых будет кушать память, что не особо хорошо.
Во втором случае – нужно пересобирать апач.

Как же быть ?
Как вариант – использовать модуль mod_ruid2. Почему именно mod_ruid ? Одна из причин – модуль поддерживается и развивается. Последний коммит в svn сделан неделю назад (от даты данного поста), это вселяет определенную надежду, что модуль и дальше будет развиваться, а найденные баги будут исправляться. mod_ruid не требует пересборки ни apache ни чего либо еще, будут нормально работать акселераторы (eAccelerator, xcache).

Read more apache и mod_ruid – исполнение скриптов от имени пользователя

Debian Squeeze 6.0 frozen

Сегодня, 6 августа, разработка дистрибутива Debian 6.0 (“Squeeze”) перешла в завершающую фазу – Debian Squeeze заморожен.
Это означает, что в дистрибутив уже не будут добавляться новые пакеты, а все силы будут направлены на “вылизывание” существующих багов.

В новой версии будет:
– ядро 2.6.32
– KDE 4.4.5, Gnome 2.30.0, LXDE 0.5.0, XFCE 4.6.2
– X.org 7.5
– OpenOffice.org 3.2
А также множество других новых и полезных пакетов, так что ждем выхода релиза  😛

Подробнее на сайте Проекта: http://www.debian.org/

Deb-пакеты nginx для Debian Lenny

Вышла очередная версия nginx.
По просьбам теперь собираются пакеты как для i386, так и для amd64.
Просьба качающим протестировать сборку для amd64, так как у меня просто нечем проверить.

Обратите внимание, что изменено поведение некоторых директив.

Изменения в nginx 0.8.48                                          03.08.2010

    *) Изменение: теперь по умолчанию директива server_name имеет значение 
       пустое имя "".
       Спасибо Геннадию Махомеду.

    *) Изменение: теперь по умолчанию директива server_name_in_redirect 
       имеет значение off.

    *) Добавление: переменные $geoip_dma_code, $geoip_area_code и 
       $geoip_region_name.
       Спасибо Christine McGonagle.

    *) Исправление: директивы proxy_pass, fastcgi_pass, uwsgi_pass и 
       scgi_pass не наследовались в блоки limit_except.

    *) Исправление: директивы proxy_cache_min_uses, fastcgi_cache_min_uses 
       uwsgi_cache_min_uses и scgi_cache_min_uses не работали; ошибка 
       появилась в 0.8.46.

    *) Исправление: директива fastcgi_split_path_info неверно использовала 
       выделения, если в выделения попадала только часть URI.
       Спасибо Юрию Тарадаю и Frank Enderle.

    *) Исправление: директива rewrite не экранировала символ ";" при 
       копировании из URI в аргументы. 
       Спасибо Daisuke Murase.

    *) Исправление: модуль ngx_http_image_filter_module закрывал 
       соединение, если изображение было больше размера image_filter_buffer.

Скачать deb-пакет разных версий для платформ i386 и amd64 можно тут

Deb-пакет nginx 0.8.45 для Debian Lenny

Изменения в nginx 0.8.45                                          13.07.2010

    *) Добавление: улучшения в модуле ngx_http_xslt_filter.
       Спасибо Laurence Rowe.

    *) Исправление: ответ SSI модуля мог передаваться не полностью после 
       команды include с параметром wait="yes"; ошибка появилась в 0.7.25. 
       Спасибо Максиму Дунину.

    *) Исправление: директива listen не поддерживала параметр setfib=0.

Изменения в предыдущей версии:

Изменения в nginx 0.8.44                                          05.07.2010

    *) Изменение: теперь nginx по умолчанию не кэширует ответы бэкендов, в 
       заголовке которых есть строка "Set-Cookie".

    *) Добавление: директива listen поддерживает параметр setfib.
       Спасибо Андрею Филонову.

    *) Исправление: директива sub_filter могла изменять регистр букв при 
       частичном совпадении.

    *) Исправление: совместимость с HP/UX.

    *) Исправление: совместимость с компилятором AIX xcl_r.

    *) Исправление: nginx считал большие пакеты SSLv2 как обычные текстовые 
       запросы.
       Спасибо Miroslaw Jaworski.

Скачать deb-пакет разных версий для Lenny можно тут

Memcached master-to-master replication

Имеем два сервера (fail-over), на которых крутятся несколько веб сайтов. Естественно, оба mysql-сервера работают по схеме master-to-master replication. Все вроде бы хорошо, файлы автоматически обновляются раз в 15 минут (rsync), базы также (master-to-master replication). При падении одного из серверов – второй вполне нормально справляется. Для снижения нагрузки файлы сессий стали писать в мемкашед-сервер.
И вот тут столкнулись с проблемой потери сессий в случае сбоя одного из серверов.

Проблему решили благодаря использованию патча для мемкашед сервера – repcached
repcached – add data replication feature to memcached 1.2.x
Этот патч позволяет получить мульти-мастер репликации,
также поддерживается асинхронный режим репликаций,
поддерживаются все memcached команды: set, add, delete, incr/decr, flush_all, cas

Качаем уже патченые исходники и распаковываем.
Read more Memcached master-to-master replication

Восстановление software raid после сбоя

На днях “выпал” из софтварного raid1 один из разделов.

# cat /proc/mdstat
Personalities : [raid1] md2 : active raid1 sdb3[1] 34178176 blocks [2/1] [_U]

md1 : active raid1 sda2[0] sdb2[1]
      19534976 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      240832 blocks [2/2] [UU]

По данным smart-а диск в порядке, в логах ничего не замечено.

Пробуем восстановить. Помечаем диск как сбойный:

# mdadm /dev/md2 -f /dev/sda3

Удаляем его из рейда

# mdadm /dev/md2 -r /dev/sda3

И пробуем его добавить обратно

# mdadm /dev/md2 -a /dev/sda3
mdadm: re-added /dev/sda3

Статус раздела после добавления обратно в массив:

# mdadm --detail /dev/md2
/dev/md2:
        Version : 00.90
  Creation Time : Fri Mar 19 18:53:17 2010
     Raid Level : raid1
     Array Size : 34178176 (32.59 GiB 35.00 GB)
  Used Dev Size : 34178176 (32.59 GiB 35.00 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 2
    Persistence : Superblock is persistent

    Update Time : Sat May 15 01:42:31 2010
          State : active, degraded, recovering
 Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 Rebuild Status : 7% complete

           UUID : d841d3cd:6e2537ed:02c08aff:db0fd513
         Events : 0.3905

    Number   Major   Minor   RaidDevice State
 2 8 4 0 spare rebuilding /dev/sda3
       1       8       19        1      active sync   /dev/sdb3

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

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

Помечаем все разделы сбойного диска как fail и удаляем их из рейда.


mdadm /dev/md0 -f /dev/sda1
mdadm /dev/md1 -f /dev/sda2
mdadm /dev/md2 -f /dev/sda3
mdadm /dev/md0 -r /dev/sda1
mdadm /dev/md1 -r /dev/sda2
mdadm /dev/md2 -r /dev/sda3

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

Копируем разметку с живого диска (sdb) на новый (sda)

# sfdisk -d /dev/sdb | sfdisk -f /dev/sda

Проверим, что оба диска имеют одинаковую разметку

# fdisk -l

Теперь добавим все разделы в массив рейда

# mdadm -a /dev/md0 /dev/sda1
# mdadm -a /dev/md1 /dev/sda2
# mdadm -a /dev/md2 /dev/sda3

Если сервер нагружен, можно указать максимальную скорость синхронизации дисков (указывается в кб/сек), это немного понизит нагрузку:

echo 3000 >/sys/block/md1/md/sync_speed_max

Не забываем установить grub на новый диск:

# grub
grub> root (hd0,1) # hd0 - указываем, что надо использовать диск sda, 1 - номер /boot раздела
grub> setup (hd0) # устанавливаем grub в MBR нового диска
grub> quit

Проверить текущий статус raid-массива можно так:

# cat /proc/mdstat

В принципе все … ну или как-то так 🙂

Обновление Debian Lenny до Squeeze

Решился я таки проапдейтить свою десктопную тачку (“тачка на прокачку” ? 🙂 ) с lenny на squeeze.

Первое что нужно сделать до апгрейда –  проверить что с системой и пакетами все впорядке и нет неразрешенных зависимостей.

aptitude update && aptitude -f install

Если все нормально получаем нечто такого:

# aptitude update
Hit http://ftp2.debian.org.ua lenny Release.gpg
Ign http://ftp2.debian.org.ua lenny/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/non-free Translation-en_US
Ign http://ftp2.debian.org.ua lenny/contrib Translation-en_US
Hit http://ftp2.debian.org.ua lenny/updates Release.gpg
Ign http://ftp2.debian.org.ua lenny/updates/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/updates/contrib Translation-en_US
Ign http://ftp2.debian.org.ua lenny/updates/non-free Translation-en_US
Hit http://ftp2.debian.org.ua lenny/volatile Release.gpg
Ign http://ftp2.debian.org.ua lenny/volatile/main Translation-en_US
Ign http://ftp2.debian.org.ua lenny/volatile/contrib Translation-en_US
Ign http://ftp2.debian.org.ua lenny/volatile/non-free Translation-en_US
Hit http://ftp2.debian.org.ua lenny Release
Hit http://ftp2.debian.org.ua lenny/updates Release
Hit http://ftp2.debian.org.ua lenny/volatile Release
Ign http://ftp2.debian.org.ua lenny/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/non-free Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/main Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/non-free Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/contrib Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/non-free Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/main Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/contrib Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/updates/non-free Sources/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/main Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/contrib Packages/DiffIndex
Ign http://ftp2.debian.org.ua lenny/volatile/non-free Packages/DiffIndex
Hit http://ftp2.debian.org.ua lenny/main Packages
Hit http://ftp2.debian.org.ua lenny/non-free Packages
Hit http://ftp2.debian.org.ua lenny/contrib Packages
Hit http://ftp2.debian.org.ua lenny/main Sources
Hit http://ftp2.debian.org.ua lenny/non-free Sources
Hit http://ftp2.debian.org.ua lenny/contrib Sources
Hit http://ftp2.debian.org.ua lenny/updates/main Packages
Hit http://ftp2.debian.org.ua lenny/updates/contrib Packages
Hit http://ftp2.debian.org.ua lenny/updates/non-free Packages
Hit http://ftp2.debian.org.ua lenny/updates/main Sources
Hit http://ftp2.debian.org.ua lenny/updates/contrib Sources
Hit http://ftp2.debian.org.ua lenny/updates/non-free Sources
Hit http://ftp2.debian.org.ua lenny/volatile/main Packages
Hit http://ftp2.debian.org.ua lenny/volatile/contrib Packages
Hit http://ftp2.debian.org.ua lenny/volatile/non-free Packages
Reading package lists… Done

# aptitude -f install
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0B of archives. After unpacking 0B will be used.
Writing extended state information… Done
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done

Убедились, что текущая версия обновлена и не имеет проблем с пакетами и их  зависимостями. Теперь в файле /etc/apt/sources.list  заменим где встречается lenny на squeeze.

# cat /etc/apt/sources.list
deb http://ftp2.debian.org.ua/debian/ squeeze main non-free contrib
deb-src http://ftp2.debian.org.ua/debian/ squeeze main non-free contrib

deb http://ftp2.debian.org.ua/debian-security/ squeeze/updates main contrib non-free
deb-src http://ftp2.debian.org.ua/debian-security/ squeeze/updates main contrib non-free

обновляем списки пакетов:

# aptitude update

Теперь нужно поставить новые версии apt, dpkg и aptitude

# aptitude install apt dpkg aptitude
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done
The following packages are BROKEN:
apt-utils libapt-pkg-perl
The following packages will be upgraded:
apt aptitude dpkg libept0
The following packages are RECOMMENDED but will NOT be installed:
aptitude-doc-cs aptitude-doc-en aptitude-doc-fi aptitude-doc-fr aptitude-doc-ja libparse-debianchangelog-perl
4 packages upgraded, 0 newly installed, 0 to remove and 802 not upgraded.
Need to get 7048kB of archives. After unpacking 471kB will be freed.
The following packages have unmet dependencies:
libapt-pkg-perl: Depends: libapt-pkg-libc6.9-6-4.7 which is a virtual package.
apt-utils: Depends: libapt-pkg-libc6.9-6-4.7 which is a virtual package.
The following actions will resolve these dependencies:

Remove the following packages:
libperl-dev

Upgrade the following packages:
apt-utils [0.7.21 (now) -> 0.7.23.1 (testing)]
libapt-pkg-perl [0.1.23 (now) -> 0.1.24 (testing)]
libperl5.10 [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl-base [5.10.0-22 (now) -> 5.10.0-25 (testing)]
perl-modules [5.10.0-22 (now) -> 5.10.0-25 (testing)]

Score is 419

Accept this solution? [Y/n/q/?] Y
The following packages will be REMOVED:
libperl-dev{a}
The following packages will be upgraded:
apt apt-utils aptitude dpkg libapt-pkg-perl libept0 libperl5.10 perl perl-base perl-modules
The following packages are RECOMMENDED but will NOT be installed:
aptitude-doc-cs aptitude-doc-en aptitude-doc-fi aptitude-doc-fr aptitude-doc-ja libparse-debianchangelog-perl
10 packages upgraded, 0 newly installed, 1 to remove and 795 not upgraded.
Need to get 16.6MB of archives. After unpacking 5968kB will be freed.
Do you want to continue? [Y/n/?] Y
Writing extended state information… Done
Get:1 http://ftp2.debian.org.ua squeeze/main dpkg 1.15.3.1 [2164kB]
Get:2 http://ftp2.debian.org.ua squeeze/main perl-modules 5.10.0-25 [3199kB]
Get:3 http://ftp2.debian.org.ua squeeze/main perl 5.10.0-25 [4512kB]
Get:4 http://ftp2.debian.org.ua squeeze/main libperl5.10 5.10.0-25 [620kB]
Get:5 http://ftp2.debian.org.ua squeeze/main perl-base 5.10.0-25 [968kB]
Get:6 http://ftp2.debian.org.ua squeeze/main apt-utils 0.7.23.1 [193kB]
Get:7 http://ftp2.debian.org.ua squeeze/main libept0 0.5.29 [208kB]
Get:8 http://ftp2.debian.org.ua squeeze/main aptitude 0.4.11.11-1+b2 [3034kB]
Get:9 http://ftp2.debian.org.ua squeeze/main libapt-pkg-perl 0.1.24 [87.6kB]
Get:10 http://ftp2.debian.org.ua squeeze/main apt 0.7.23.1 [1642kB]
Fetched 16.6MB in 3min 0s (92.3kB/s)
(Reading database … 148233 files and directories currently installed.)
Removing libperl-dev …
(Reading database … 148237 files and directories currently installed.)
Preparing to replace dpkg 1.14.26 (using …/dpkg_1.15.3.1_i386.deb) …
Unpacking replacement dpkg …
Processing triggers for man-db …
Setting up dpkg (1.15.3.1) …
Installing new version of config file /etc/logrotate.d/dpkg …
(Reading database … 148232 files and directories currently installed.)
Preparing to replace perl-modules 5.10.0-22 (using …/perl-modules_5.10.0-25_all.deb) …
Unpacking replacement perl-modules …
Preparing to replace perl 5.10.0-22 (using …/perl_5.10.0-25_i386.deb) …
Unpacking replacement perl …
Preparing to replace libperl5.10 5.10.0-22 (using …/libperl5.10_5.10.0-25_i386.deb) …
Unpacking replacement libperl5.10 …
Preparing to replace perl-base 5.10.0-22 (using …/perl-base_5.10.0-25_i386.deb) …
Unpacking replacement perl-base …
Processing triggers for man-db …
Setting up perl-base (5.10.0-25) …
(Reading database … 148235 files and directories currently installed.)
Preparing to replace apt-utils 0.7.21 (using …/apt-utils_0.7.23.1_i386.deb) …
Unpacking replacement apt-utils …
Preparing to replace libept0 0.5.26+b1 (using …/libept0_0.5.29_i386.deb) …
Unpacking replacement libept0 …
Preparing to replace aptitude 0.4.11.11-1+b1 (using …/aptitude_0.4.11.11-1+b2_i386.deb) …
Unpacking replacement aptitude …
Preparing to replace libapt-pkg-perl 0.1.23 (using …/libapt-pkg-perl_0.1.24_i386.deb) …
Unpacking replacement libapt-pkg-perl …
Preparing to replace apt 0.7.21 (using …/archives/apt_0.7.23.1_i386.deb) …
Unpacking replacement apt …
Processing triggers for man-db …
Processing triggers for menu …
Setting up apt (0.7.23.1) …
Installing new version of config file /etc/cron.daily/apt …
gpg: key 6070D3A1: “Debian Archive Automatic Signing Key (4.0/etch) <ftpmaster@debian.org>” not changed
gpg: key ADB11277: “Etch Stable Release Key <debian-release@lists.debian.org>” not changed
gpg: key BBE55AB3: “Debian-Volatile Archive Automatic Signing Key (4.0/etch)” not changed
gpg: key F42584E6: “Lenny Stable Release Key <debian-release@lists.debian.org>” not changed
gpg: key 55BE302B: “Debian Archive Automatic Signing Key (5.0/lenny) <ftpmaster@debian.org>” not changed
gpg: key 6D849617: “Debian-Volatile Archive Automatic Signing Key (5.0/lenny)” not changed
gpg: Total number processed: 6
gpg: unchanged: 6
Setting up libperl5.10 (5.10.0-25) …
Setting up apt-utils (0.7.23.1) …
Setting up libept0 (0.5.29) …
Setting up aptitude (0.4.11.11-1+b2) …
Setting up libapt-pkg-perl (0.1.24) …
Setting up perl-modules (5.10.0-25) …
Setting up perl (5.10.0-25) …
Processing triggers for menu …
localepurge: Disk space freed in /usr/share/locale: 12488K
localepurge: Disk space freed in /usr/share/man: 444K

Total disk space freed by localepurge: 12932K

Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Writing extended state information… Done
Reading task descriptions… Done

Current status: 795 updates [-11].

Все что нужно было, aptitude сделал сам. Теперь, собственно, делаем апгрейд всей системы

# aptitude full-upgrade

В процессе обновления возникнут проблемы с зависимостями, которые решаются подтверждением обновления версии. Так же будут установлены новые пакеты.

Как восстановить сохраненный пароль в kopete

Для восстановления сохраненного пароля в kopete для jabber-аккаунта  можно воспользоваться следующим кодом на питоне:

from ConfigParser import ConfigParser
import sys
from kdecore import KStringHandler
config = ConfigParser()
config.read(".kde/share/config/kopeterc")
cryptedpass = config.get("Account_JabberProtocol_" + sys.argv[1], 'Password')
print KStringHandler().obscure(cryptedpass.decode('utf-8'))

Сохраняем код в файле ~/getpass.py и затем выполняем его:

# python ./getpass.py userid@jabber.org

В итоге получаем расшифрованный пароль для аккаунта 🙂

Если в скрипте заменить Account_JabberProtocol_ на Account_ICQProtocol_ то можно вытянуть из конфига kopete пароль от icq

Код нашел на этом блоге.

Для KDE4 код такой:

from ConfigParser import ConfigParser
import sys
from PyKDE4.kdecore import *
config = ConfigParser()
config.read('./kopeterc')
cryptedpass = config.get('Account_JabberProtocol_' + sys.argv[1], 'Password')
print KStringHandler.obscure(cryptedpass.decode('utf-8'))

Этот код для KDE4 любезно предоставил Lex

nginx 0.8.15

Собрал свежую версию nginx для Дебиан-а.  Пакет собран с опциями:

–with-mail
–with-mail_ssl_module
–with-http_stub_status_module
–with-http_flv_module
–with-http_ssl_module
–with-http_dav_module
–with-http_sub_module
–with-http_realip_module
–with-http_gzip_static_module
–with-debug

Также в сборку включены два  патча Кирилла Коринского,  который выдает 503 ошибку в случае превышения заданного в конфиге значения load average

Взять можно тут

Создание полной копии hdd средствами nc и dd

Попросили рассказать как сохранить копию hdd в линуксе по сети.
Вот, рассказываю 🙂

Создание полной копии винта (именно винта, а не раздела).

Что нужно: два компа, сеть, LiveCD или LiveFlash
Допустим, нужна полная копия винта с компа “comp1” этот комп имеет ip 192.168.0.1
Комп, куда мы сохраняем копию имеет адрес 192.168.0.3 и назовем его “backup”.

Итак, на “backup”-e набираем в консоли:
# nc -l -p 5000 | gzip -5 -c > ./my_good_hdd_copy.img.gz

На comp1:
Грузимся с livecd, открываем консоль и набираем:
# dd if=/dev/sda | nc -w 10 192.168.0.3 5000

Ждем некоторое время. После завершения на бакаповом компе будет полная упакованная копия указанного винта.

/dev/sda – винт, копию которого хочется сохранить (/dev/hda /dev/sdb и т.д.)
5000 – порт на которым будем принимать данные с comp1 (можно любой указать)

Восстановление полной копии.
На компе, где хотим восстановить копию винта:
Опять же грузимся с liveCD и набираем:
# nc -l -p 8000 | dd of=/dev/sda

на “backup”-e :
zcat ./my_good_hdd_copy.img.gz | nc 192.168.0.1 8000

Ждем… по завершению копия будет восстановлена.

Поскольку операция необратима, нужно быть внимательным при восстановлении копии – вся информация будет *удалена* с того винта куда делаем dd

hint: чтобы наблюдать что происходит при копировании, открываем вторую консоль и там набираем:
# watch -n 30 killall -SIGUSR1 dd

на первую консоль будет выводиться раз в 30 сек информация сколько данных уже скопировано.

Несколько сумбурно, но надеюсь принцип понятен 🙂