Сегодня попался довольно интересный случай в саппорте, где пришлось отлаживать работу приложения на PHP, имея только виртуальный FTP аккаунт. В качестве примера я буду называть сайт www.example.com и FTP аккаунт supportuser@example.com, ограниченный корневой директорией исходников сайта. Сервер, на котором расположен сайт, работает под управлением WHM/cPanel.
Моя цель - получить доступ к логам вебсервера (которые находятся вне корневой директории сайта), чтобы понять причину глюков в работе приложения. В корне сайта валяется файлик error_log, но его содерживое не содержит ничего полезного, его происходит ошибка уровнем выше, чем интерпретатор PHP.
Заметки о Linux, системном администрировании, программировании, электронике и не только
среда, 29 августа 2012 г.
пятница, 24 августа 2012 г.
Сборка недостающих модулей ядра для платформы Android
Давненько мне хотелось попробовать себя в сборке модулей ядра для моего телефона на базе Android. Вчера мне потребовался OpenVPN, но для его работы нужен модуль tun/tap, который отсутствует в моей прошивке. Поискав по маркету я нашел приложение TUN.ko Installer, которое позволяет установить модуль нужной вам версии, если такой есть в репозитории проекта. Но поскольку спать еще не хотелось, и простых решения я не искал, то было решено собрать модуль самостоятельно.
пятница, 27 июля 2012 г.
Workflow: SSL сертификаты
Одна из рутинных операций, с которыми приходится сталкиваться системному администратору - управление SSL сертификатами. Я постараюсь собрать на одной странице справочное руководство, которое поможет управлять жизненным циклом сертификата. Для наглядности процесса я буду описывать процедуру в контексте WEB сервера (в остальных случаях многое совпадает, хотя есть и различия).
Для себя я выделяю несколько этапов в жизненном цикле SSL сертификата:
Для себя я выделяю несколько этапов в жизненном цикле SSL сертификата:
- создание SSL сертификата
- установка SSL сертификата
- мониторинг валидности и срока окончания SSL сертификата
пятница, 13 июля 2012 г.
Создание бинарного пакета с debug-символами в debian
Переодически приходится сталкиваться с ошибками в программах, которые приводят к их аварийному завершению. Типичный пример такой ошибки - завершение по сигналу SEGFAULT. Чтобы выяснить в каком месте и при каких условиях программа завершилась нужны отладчик и отладочные символы для исследуемой программы.
В моем случае это был tinymount, который я когда-то пакетировал ради интереса и сейчас наткнулся на ошибку в его новой версии. В моем варианте пакета отладочные символы были исключены и я добавил пару изменений в debian/control, debian/rules (сделал на примере отсюда) чтобы их получить.
После чего увеличил версию пакета:
и собрал его
В отчете lintian (его запускает debuild после окончании сборки) помимо отсутствующей страницы man для tinymount была ругань на "пустой пакет" tinymount-dbg. Он оказался почти пустым, т.к. отладочных символов в нем действительно не было.
Дальше было больше часа попыток нагулить причину. Но озарение пришло только после вдумчивого чтения логов сборки пакета (логи рулят!). При выполнении цели install в сгенеренном qmake'ом Makefile'е выполнялся strip для инсталируемого бинарника. Вот потому dh_strip и не находил никаких отладочных символов.
Немного порывшись в документации на qmake, я добавил в debian/rules к параметру DEB_QMAKE_ARGS значение CONFIG+=debug. После этого пересборка пакета и символы появились как и ожидалось.
В моем случае это был tinymount, который я когда-то пакетировал ради интереса и сейчас наткнулся на ошибку в его новой версии. В моем варианте пакета отладочные символы были исключены и я добавил пару изменений в debian/control, debian/rules (сделал на примере отсюда) чтобы их получить.
$ echo >> debian/control << EOF Package: tinymount-dbg Architecture: any Section: debug Priority: extra Depends: tinymount (= ${binary:Version}), ${misc:Depends} Description: debugging symbols for tinymount Tinymount is a simple UI tool to mount/unmount disks using UDisks. . This package contains the debugging symbols for tinymount. EOF
$ echo >> debian/rules << EOF DEB_DESTDIR := $(CURDIR)/debian/tinymount EOF
После чего увеличил версию пакета:
dch -v '0.2.5~pre-2' 'Added debug symbols'
и собрал его
$ debuild -us -uc
В отчете lintian (его запускает debuild после окончании сборки) помимо отсутствующей страницы man для tinymount была ругань на "пустой пакет" tinymount-dbg. Он оказался почти пустым, т.к. отладочных символов в нем действительно не было.
Дальше было больше часа попыток нагулить причину. Но озарение пришло только после вдумчивого чтения логов сборки пакета (логи рулят!). При выполнении цели install в сгенеренном qmake'ом Makefile'е выполнялся strip для инсталируемого бинарника. Вот потому dh_strip и не находил никаких отладочных символов.
Немного порывшись в документации на qmake, я добавил в debian/rules к параметру DEB_QMAKE_ARGS значение CONFIG+=debug. После этого пересборка пакета и символы появились как и ожидалось.
четверг, 5 июля 2012 г.
Maintenance page для сайтов, которые обслуживаются Apache
Я уже писал про maintenance page для сайтов, которые обслуживаются Nginx, а сегодня добавлю пример такой страницы для Apache.
Содержимое страницы maintenance.html остается прежним:
/var/www/maintenance/maintenance.html
Чтобы Apache выдавал страницу с кодом 503, нужно немного доработать .htaccess:
/var/www/maintenance/.htaccess
После этого maintenance страницу будет показывать всем кроме тех, кто заходит на сайт с ip 1.2.3.4.
Содержимое страницы maintenance.html остается прежним:
<html> <head> <title>Server Maintenance</title> </head> <body> <center> <h1>Server maintenance</h1> Our apologies for the temporary inconvenience. The page is temporarily unavailable as server is down for scheduled maintenance. We will be back soon. </center> </body> </html>
Чтобы Apache выдавал страницу с кодом 503, нужно немного доработать .htaccess:
ErrorDocument 503 /maintenance.html <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !^/maintenance.html$ RewriteCond %{REMOTE_ADDR} !1.2.3.4 RewriteRule .* /maintenance.html [R=503,L] </IfModule>
После этого maintenance страницу будет показывать всем кроме тех, кто заходит на сайт с ip 1.2.3.4.
суббота, 30 июня 2012 г.
DEADBEEF 0.5.5
Уже прошел почти месяц с тех пор, как был анонсирована новая версия плеера DEADBEEF 0.5.5. Список изменений у новой версии довольно впечатляющий, хотя по сути все это исправления существующих ошибок.
Уже позже, вечером, я начал ковырять пакет, который готовит апстрим, чтобы сравнить его с моей последней сборкой (у меня была только версия 0.5.2 в репозитарии). ИМХО недостатки официального пакета:
В итоге сейчас пакет доступен для:
changelog since 0.5.4
- fixed converter GUI plugin crash if the converter plugin not found
- fixed compiling on FreeBSD
- fixed race condition bug in streamer
- fixed flac embedded cover loading bug
- fixed multiline tag field editing
- fixed vorbis streaming audio bug
- fixed numlock handling in global hotkeys setup
- fixed KP_Return not working
- fixed filename being ignored in the search window
- fixed session saving on reboot/logout using XSMP via eggsmclient
- fixed few missing translation strings
- fixed many instability issues caused by improper use of pl_find_meta[_raw] calls
- fixed improper use of GtkStyle in playlist and tabs widgets
- fixed prev/next handling when playback is stopped
- fixed random playback bug caused by libsidplay2 calling srand(time(NULL))
- fixed crash in adplug when playing ADL files
- fixed crash in aac reload metadata
- fixed Grandia - Parallel Trippers.gbs crash in GME plugin
- fixed crash in GME plugin when a file doesn't exist
- fixed integer overflow bug in float32->int32 conversion
- fixed m3u parser string copy bug
- fixed several dsp bugs in the converter
- fixed up/down buttons in the converter's dsp preset editor
- fixed selected row bugs in dsp preset editors in gtkui preferences and converter
- fixed parent window of dsp plugin configure window
- fixed all known issues in gtk3 plugin -- it should be fully working now
Уже позже, вечером, я начал ковырять пакет, который готовит апстрим, чтобы сравнить его с моей последней сборкой (у меня была только версия 0.5.2 в репозитарии). ИМХО недостатки официального пакета:
- устанавливается в /opt/deadbeef, но не делает ссылку на бинарник в /usr/bin (нет возможности запустить из консоли не прописав полный путь);
- не работает pause toggle при клике средней кнопкой на иконку deadbeef в трее (в принципе не критично, если настроены глобальные комбинации);
- не работает регулировка громкости, если прокручивать колесо мыши над иконкой deadbeef в трее;
- недостающие recommended зависимости приходится ставить руками (поскольку пакет ставится не через APT, то установка проходит нормально, но при запуске пакет ругается в консоли - у меня к примеру не стояли libcddb2 и libzip1).
В итоге сейчас пакет доступен для:
- Debian: Squeeze, Wheezy, Sid (i386, amd64);
- Ubuntu: Maverick, Lucid, Oneiric, Natty, Precise (i386, amd64).
пятница, 29 июня 2012 г.
Увеличение числа одновременно открытых файлов в MySQL сервере
Сегодня довелось решать проблему с превышением лимита одновременно открытых файлов у MySQL сервера. Ошибка, которая свидетельствует о такой проблеме выглядит так:
Поскольку все коды ошибок я на память не помню, то первым делом заглянул в вывод perror:
Смотрим сколько разрешено открывать файловых дескрипторов пользователю mysql (пользователь, с правами которого работает MySQL сервер).
Далее смотрим, сколько дескрипторов разрешено в MySQL:
Увеличим лимит в 4 раза, до 4096:
Если лимит не изменился, то нужно посмотреть где подключен pam_limits.so в конфигурации PAM.
Для Debian нужно добавить строку
Осталось поправить конфиг MySQL, чтобы сервер начал использовать новый лимит. Для этого в my.cnf в секцию [mysqld] добавляем строчку
MySQL Error: Out of resources when opening file './db_name/table_name.MYD' (Errcode: 24)
Поскольку все коды ошибок я на память не помню, то первым делом заглянул в вывод perror:
$ perror 24 OS error code 24: Too many open files
Смотрим сколько разрешено открывать файловых дескрипторов пользователю mysql (пользователь, с правами которого работает MySQL сервер).
$ sudo su - mysql -c 'ulimit -n' 1024
Далее смотрим, сколько дескрипторов разрешено в MySQL:
$ mysql -se "show variables like 'open_files_limit'" Variable_name Value open_files_limit 1024
Увеличим лимит в 4 раза, до 4096:
$ echo 'mysql - nofile 4096' | sudo tee -a /etc/security/limits.d/mysql.conf $ sudo su - mysql -c 'ulimit -n' 4096
Если лимит не изменился, то нужно посмотреть где подключен pam_limits.so в конфигурации PAM.
$ grep -r limits /etc/pam.* /etc/pam.d/sshd:session required pam_limits.so /etc/pam.d/atd:session required pam_limits.so /etc/pam.d/login:session required pam_limits.so /etc/pam.d/sudo:session required pam_limits.so /etc/pam.d/cron:session required pam_limits.so /etc/pam.d/su:# session required pam_limits.so
Для Debian нужно добавить строку
session required pam_limits.so
в /etc/pam.d/common-session
$ echo 'session required pam_limits.so' | sudo tee -a /etc/pam.d/common-session
Осталось поправить конфиг MySQL, чтобы сервер начал использовать новый лимит. Для этого в my.cnf в секцию [mysqld] добавляем строчку
open_files_limit = 4096
Подписаться на:
Сообщения (Atom)