Ubuntu — Rsyslog server, nginx acces log collector
Надоело мне смотреть логи nginx на разных серверах кластера путём переключения консолей, а захотелось видеть всё в одном потоке. Такое умеет стандартный менеджер логов в поставке Ubuntu (и не только) - rsyslog, его и будем использовать.
Для начала настроим клиенты, те машины что логи будут отправлять:
$ModLoad imfile
# Указываем какой файл будем экспортировать
$InputFileName /var/log/nginx/access.log
# Назначаем тэг, который будет дописываться на сервере получателе, чтобы можно было понять с какой машины пришла запись
$InputFileTag hostX-access:
# Временный файл, в который rsyslog будет записывать текущую позицию
$InputFileStateFile access
# Источник сообщения
$InputFileFacility local0
# Уровень серьёзности сообщения
$InputFileSeverity info
# Запускаем мониторинг изменений в файле
$InputRunFileMonitor
# Отправлять накопленные данные будем каждую секунду
$InputFilePollInterval 1
# Указываем куда будем отправлять, в данном случае все сообщения local0 будут отправляться по UDP со сжатием gzip 7 на сервер 192.168.1.1
local0.* @(z7)192.168.1.1:514
Такой конфиг нужно будет сделать на каждом сервере (hostX можно пронумеровать по каждому серверу или назначить более понятные вам теги).
Также нужно проверить что rsyslog сможет прочитать логи и сохранить файлы состояний:
chmod 0750 /var/spool/rsyslog && \
chmod 0755 /var/log/nginx/ && \
chmod 0644 /var/log/nginx/access.log
Если у вас работает logrotate то нужно поправить конфиг чтобы новые файлы логов nginx создавались с правами 0644:
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0644 www-data adm # поправлено
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Конфиг сервера, в /etc/rsyslog.conf добавить настройку приёма логов по UDP:
$UDPServerRun 514 # Порт нужно будет открыть на фаерволе
# Не забываем установить ограничения от кого можно принимать логи, IP перечисляются через запятую
$AllowedSender UDP, 192.168.1.0/24
В конфиге по-умолчанию, если логи с серверов не нужны в syslog сервера нужно добавить указание куда их собирать
local0.* -/var/log/group.access.log
service rsyslog restart и можно наблюдать полную картину:
Отладка
Если что-то не будет работать, можно запустить rsyslog в режиме отладки, например так:
На сервере можно слушать порт таким образом:
Ubuntu — Cyborg R.A.T. 9
Подарили мне на ДР сие чудо техники. Драйвера для Windows можно скачать с сайта производителя, в Ubuntu же эта мышка из коробки не работает, а хочется, нашёл
Для начала убедимся что нужная директория существует:
И запишем правильную конфигурацию кнопок для этой мышки:
Identifier "Saitek PLC"
MatchUSBID "06a3:0cfa"
Driver "evdev"
MatchIsPointer "on"
MatchProduct "R.A.T.9|Saitek Cyborg R.A.T.9 Mouse"
MatchVendor "Saitek|SAITEK"
MatchDevicePath "/dev/input/event*"
Option "Protocol" "auto"
Option "Buttons" "21"
Option "ButtonMapping" "1 2 3 4 5 0 0 8 9 7 6 12 0 0 0 16 17 18 19 20 21"
Option "ZAxisMapping" "4 5 6 7"
Option "AutoReleaseButtons" "13 14 15"
EndSection
Вот и всё, все кнопки (кроме, кажется, красной) работают 🙂
Linux — Video streaming и iPad 2
Получив в своё распоряжение сей девайс и чуток поигравшись с ним захотелось чего-то бо́льшего нежели просто игры - например просмотр любого видео из домашней коллекции без необходимости синхронизироваться с iTunes. Программ такого рода оказалось довольно много - на любой вкус и цвет но, они все работают только под Windows или Mac OS X, печально - мне нужно чтобы работало в Ubuntu. Поискав ещё, удалось найти варианты с заявленной поддержкой Linux, «из коробки» они конечно же не запускаются.
В итоге получился интересный мануальчик (для (K)Ubuntu) по установке серверной части для программ Air Video и VLC Streamer.
Свой выбор я остановил на платной версии Air Video (есть и бесплатная но показывает в списке к просмотру не все файлы на компьютере) т.к. у неё более дружественный интерфейс и имеется одна немаловажная особенность - перемотка видео на любую точку (как ролики на YouTube), в VLC же видео можно смотреть и перематывать только в пределах обработанного участка. Собственно вот небольшая табличка сравнения:
Air Video | VLC Streamer | |
---|---|---|
Цена | $2.99 | $1.99 |
Ограничения бесплатной версии | Есть - отображает не все файлы на ПК | Нет, поддерживается за счёт рекламы iAd |
Кодирование на лету | Есть, вывод сразу в поток | Есть, вывод в файл + передача в поток |
Перемотка | Есть | Есть, только в пределах перекодированного фрагмента |
Очередь перекодирования | Есть, вывод в отдельный файл m4v (можно скопировать или перенести в iTunes) | Есть, только подготовка для дальнейшего просмотра. |
Предпросмотр кодируемого видео | Есть | Нет |
Изменение масштаба, усиление звука | Есть | Нет |
Управление субтитрами | Есть | Вкл/Выкл |
Выбор звуковой дорожки | Есть | Нет |
GUI | Нет | Есть |
Linux — Debmirror и несколько зеркал
Debmirror это perl скрипт который применяется для организации зекала репозитория Debian или Ubuntu.
Однако сам по себе он делает только то, для чего предназначен и не каплей больше (но настроек у него от этого не меньше и сделать зеркало он может по-различным протоколам и с различными условиями). Что же делать если нужно организовать несколько зеркал?
Cacti — XBT Tracker statistics
И снова cacti. На этот раз выкладываю свой вариант шаблона для мониторинга XBTT т.к. тот, что выложен на официальном сайте, уже устарел да и вообще, говорят что он не работает, а у меня как раз есть рабочий 🙂
Архив с шаблоном и скриптом.
MD5:
Версия 0.2 для обновлённого вывода статистики в XBTT (добавились проценты у seeders и т.п.)
MD5:
Для работы нужны следующие программы:
- bash
- lynx
- awk
Установка:
1) Распаковать
2) Скопировать xbtt_stat.sh в /scripts/ (проверьте чтобы lynx и awk лежали там же где и в скрипте)
3) Импортировать шаблон
Cacti — MegaFon balance
Т.к. в
Скрипт адаптирован для Московского региона но при желании легко переделывается под другой регион и даже под другого оператора (если оператор предоставляет такие данные для автоматического сбора и не ставит на них капчу).
Не забудьте убедиться что в
Архив с шаблоном и скриптом.
MD5:
Установка:
1) Распаковать
2) Скопировать megafon.pl в /scripts/
3) Импортировать шаблон
ATI — 10.9 FGLRX не собирается в DKMS
Очередное обновление, очередное «исправление», новые ошибки...одним словом - ATI.
Симптомы - fglrx не проходит фазу компиляции в DKMS, build log показывает что-то такое:
Сбт Сен 25 16:09:51 MSD 2010
AMD kernel module generator version 2.1
doing Makefile based build for kernel 2.6.x and higher
/var/lib/dkms/fglrx/8.771/build/2.6.x
rm -rf *.c *.h *.o *.ko *.GCC* .??* *.symvers
make -C /lib/modules/2.6.32-25-generic/build SUBDIRS=/var/lib/dkms/fglrx/8.771/build/2.6.x modules
make[1]: Вход в каталог `/usr/src/linux-headers-2.6.32-25-generic'
CC [M] /var/lib/dkms/fglrx/8.771/build/2.6.x/firegl_public.o
CC [M] /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_acpi.o
CC [M] /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_agp.o
CC [M] /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_debug.o
CC [M] /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.o
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c: In function ‘KCL_IOCTL_AllocUserSpace32’:
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c:196: error: implicit declaration of function ‘compat_alloc_user_space’
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c:196: warning: return makes pointer from integer without a cast
make[2]: *** [/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.o] Ошибка 1
make[1]: *** [_module_/var/lib/dkms/fglrx/8.771/build/2.6.x] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-headers-2.6.32-25-generic'
make: *** [kmod_build] Ошибка 2
build failed with return value 2
Чтобы обойти ошибку можно подождать пару недель, вроде обещали исправить в октябре - но это же слишком долго.
Решение
Сделать нужно следующее - от root открыть файл /usr/src/linux-headers-2.6.32-25-generic/arch/x86/include/asm/compat.h (или что у Вас сейчас используется), действие действительно и для x86 и для x86_64 архитектур (у меня например x86_64):
Мотаем вниз файла и видим строчку:
Между этой строчкой и последней фигурной скобкой ( } ) копируем и вставляем код:
{
struct pt_regs *regs = task_pt_regs(current);
return (void __user *)regs->sp - len;
}
(на самом деле не обязательно вставлять код именно в это место - просто на всякий случай, чтобы не вставить его в какую-нибудь другую функцию)
Сохраняем файл и пробуем переустановить fglrx. Теперь всё должно получиться 🙂
Не думаю что этот код что-то может сломать но после установки его можно удалить, если есть желание.
Kubuntu 10.04 — Эффекты и проприетарные драйвера для ATI
После обновления (а точнее после чистой установки) Kubuntu 10.04 установил проприетарные драйвера для своей ATI Radeon HD 4800 Series и как обычно что-то сломалось...на этот раз сломались эффекты рабочего стола (Через XRender работали но уж очень медленно). Что впрочем не удивительно т.к. дрова свежие и ещё толком не обкатанные. К тому же это ведь ATI...
Для справки - драйвера можно установить через jockey-kde или же:
sudo apt-get install linux-headers-`uname -r` fglrx fglrx-amdcccle fglrx-dev fglrx-modaliases
sudo aticonfig --initial
sudo reboot
Покопавшись в настройках обнаружил что эффекты будут работать если выставить флаг «Отключить внутреннюю проверку» в разделе Параметры системы - Рабочий стол - Эффекты рабочего стола - Дополнительно
Но нужно же что бы они работали и в обычном режиме 🙂
Для этого нужно проверить чтобы в соответствующих разделах xorg.conf были эти значения:
Option "AllowGLXWithComposite" "true"
EndSection
Section "Extensions"
Option "Composite" "Enable"
Option "DAMAGE" "Enable"
Option "RENDER" "Enable"
EndSection
После применения настроек эффекты работают и при отключении «Отключить внутреннюю проверку».
KDE 4.4.0 — Поломался Skype — Kubuntu 9.10
С горем пополам обновился на KDE 4.4.0.
Всё красиво но сломался Smooth Tasks и Skype.
По Smooth Tasks отписал автору (не у меня одного такая проблема), а вот Skype пришлось реанимировать своими силами.
Запуск из консоли выдавал вот такой листинг и Skype намертво зависал 🙁
bt_audio_service_open: connect() failed: В соединении отказано (111)
bt_audio_service_open: connect() failed: В соединении отказано (111)
QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: Нет такого файла или каталога
(process:7282): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.22.3/gobject/gtype.c:2458: initialization assertion failed, use IA__g_type_init() prior to this function
(process:7282): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed
(process:7282): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.22.3/gobject/gtype.c:2458: initialization assertion failed, use IA__g_type_init() prior to this function
(process:7282): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.22.3/gobject/gtype.c:2458: initialization assertion failed, use IA__g_type_init() prior to this function
(process:7282): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.22.3/gobject/gtype.c:2458: initialization assertion failed, use IA__g_type_init() prior to this function
(process:7282): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion `G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
(process:7282): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.22.3/gobject/gtype.c:2458: initialization assertion failed, use IA__g_type_init() prior to this function
(process:7282): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion `G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
(process:7282): Gtk-CRITICAL **: gtk_widget_style_get: assertion `GTK_IS_WIDGET (widget)' failed
Ничего лучше в голову не пришло как переустановить GKT темы.
Как оказалось gtk2-engines у меня установлено не было (а может оно и не нужно).
После чего зашёл в настройки внешнего вида и заново выбрал тему для GTK+ - оказалось этого достаточно т.к. Skype заработал 🙂
Версия Skype 2.1.0.81 (ИМХО предыдущая была лучше, эта иногда виснет).
Nginx — Как убрать вопрос «?» в строке адреса
Бывает необходимо сделать из адреса /index.php? просто /index.php (без ненужного вопроса). Для чего? Ну например для
Помню что где-то видел решение, но где забыл, а заодно и забыл как это было сделано 🙁
Пришлось сделать своё, метод далеко не нов, но лучше я его запишу:
...
set $rr 0;
if ($request_uri ~ ^/index.php\?$) {
set $rr 1;
}
if ($request_method = POST) {
set $rr 0;
}
if ($rr) {
rewrite .* /index.php permanent;
}
...
}
Очень просто.