sysmerge IT

1 авг. 2015 г.

Nagios: command not in docroot (/usr/lib64/nagios/cgi-bin/status.cgi)

После установки системы мониторинга Nagios на Apache версий > 2.* может возникнуть проблема с модулем suexec и корректной работой cgi скриптов Nagios. Если в логах наблюдаются ошибки следующего вида:

 [2015-08-01 08:50:40]: uid: (500/user) gid: (502/user) cmd: status.cgi  
 [2015-08-01 08:50:40]: command not in docroot (/usr/lib64/nagios/cgi-bin/status.cgi)  

то возможно это как раз ваш случай. Решения (по крайней мере из тех, что быстро приходят в голову) два:
  1. Пересобрать apache без suexec
  2. Для VirtualHost'а убрать SuexecUserGroup
Для работающего сервер решение 2 выглядит куда проще и удобнее, потому если опыта пересборки Apache у вас нет, то он вам идеально подойдет. Редактируем конфиг, рестартим apache и проверяем работу.
17 июл. 2015 г.

Установка sqlite2 для php5.3, php5.4

Довольно часто необходима кроме стандартного sqlite3 так же иметь и более старую версию sqlite. Так как из реп его установить возможности нет, то можно собрать руками. К сожалению версия исходников с pecl.php.net не собирается нормально (патчи тоже не помогли), то был найден альтернативный способ. О нем ниже.
Устанавливаем пакеты для работы с svn. После чего
 svn co http://svn.php.net/repository/pecl/sqlite/trunk sqlite  
 cd sqlite/  
 phpize  
 ./configure && make install  

Само собой предварительно нужно поставить php-devel и компилятор gcc.
После чего sqlite.so помещается в папку с модулями php (/usr/lib64/php/modules для Centos). Создает конфиг файл и перезапускаем апач
 # echo "extension=sqlite.so" > /etc/php.d/sqlite.ini  
 # service httpd restart  
5 июл. 2015 г.

Восстановление mysql таблиц из frm файла

Для того, чтобы восстановить таблицу mysql из .frm файла нужно выполнить пару простых операций.
В первую очередь в папке вашей бд ( /var/lib/mysql/БД/ ) создаем недостающие .MYD и .MYI файлики с нужными правами и владельцем (подсмотреть можно у соседни файлов).
После чего логинимся в консоль mysql
 # mysql -u root -p  

После чего переходим в нужную базу и исправляем поломку:
 mysql> use БД;  
 mysql> repair table ТАБЛИЦА use_frm;  

После последней операции должно получить что-то вроде
 mysql> repair table ТАБЛИЦА use_frm;  
 +-----------------+--------+----------+----------+  
 | Table      | Op   | Msg_type | Msg_text |  
 +-----------------+--------+----------+----------+  
 | БД.ТАБЛИЦА | repair | status  | OK    |  
 +-----------------+--------+----------+----------+  
 1 row in set (0.01 sec)  

Проверяем работу бд.
25 июн. 2015 г.

OpenBSD: звук в клиенте PSI

При использовании жаббер клиента Psi в OpenBSD можно столкнуться  с тем, что изначально звук уведомлений там не работает. Настраивается это очень легко.
Открываем настройки Psi, меню "Звуки" (Sound). В самом верху будет поле "Плейер" (Player), которое пока пустует.
Вписываем следующее:
 aucat -i  

Это команда для воспроизведения wav файлов. Сохраняем настройки и проверяем звук. Он должен работать.
21 июн. 2015 г.

mod_fcgid: HTTP request length exceeds MaxRequestLen

Ошибка "HTTP request length exceeds MaxRequestLen" решается довольно просто. Открывает конфиг для подключения модуля fcgi
 # nano /etc/apache2/mods-available/fcgi.load  

Содержимое приводим к виду
 LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so  
 # нужно добавить строки ниже  
 <IfModule fcgid_module>  
 FcgidMaxRequestLen 4000000  
 </IfModule>  

Стоит при этом учитывать, что значения параметра по умолчанию довольно мало (см тут) и составляет 131172 байта. Установленное нами выше - 4Mб.

Теперь сохраняем файл и рестартим apache
 # /etc/init.d/apache2 reload  
18 июн. 2015 г.

Сохранить правила iptables после ребута в Debian

В Debian схема работы с iptables немного отличается от Centos. После ребута правила в таблицах будут сброшены, а значит нам нужно создать небольшой скрипт, который будет их восстанавливать.
Поместим эти скрипты мы в директорию  '/etc/network/if-pre-up.d', скрипты из которой запускаются автоматически перед конфигурацией интерфейса, который будет подниматься.
Итак, чтобы сохранить правила iptables после ребута машины нам понадобится следующее.
Для начала сохраняем текущие правила в файл
 # iptables-save > /etc/iptables.up.rules  

Теперь создаем скрипт, который будет эти правила восстанавливать
 # nano /etc/network/if-pre-up.d/iptables  

Скрипты в папке if-pre-up.d запускаются, как видно из названия, перед стартом интерфейса.
В скрипт ложим такое содержимое:
 #!/bin/sh  
  /sbin/iptables-restore < /etc/iptables.up.rules  

И, конечно же, даем ему права на исполнение
 # chmod +x /etc/network/if-pre-up.d/iptables  

Готово. Теперь ваши правила iptables будут актуальны даже после ребута рабочей машины.
15 июн. 2015 г.

ffmpeg version: error while loading shared libraries

После сборки ffmpeg и проверки лицензии командой
 # ffmpeg -version  

получаем ошибку "ffmpeg: error while loading shared libraries: libavdevice.so.56: cannot open shared object file: No such file or directory". Судя по всему по время компиляции что-то пошло не так и бинарник ffmpeg был слинкован с библиотеками, найти которых он не может. Проверим нашу  теорию с помощью ldd:
 # ldd `which ffmpeg`  
      linux-vdso.so.1 => (0x00007fff085ff000)  
      libavdevice.so.56 => not found  
      libavfilter.so.5 => not found  
      libavformat.so.56 => not found  
      libavcodec.so.56 => not found  
      libswresample.so.1 => not found  
      libswscale.so.3 => not found  
      libavutil.so.54 => not found  
      libm.so.6 => /lib64/libm.so.6 (0x0000003413e00000)  
      libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003413200000)  
      libc.so.6 => /lib64/libc.so.6 (0x0000003412e00000)  
      /lib64/ld-linux-x86-64.so.2 (0x0000003412600000)  

Пробуем найти эти библиотеки в системе, к примеру самую первую
 # find /usr/ -name "libavdevice.so.56"  
 /usr/local/lib/libavdevice.so.56  

14 июн. 2015 г.

Блокировка поисковых ботов в iptables

Мое мнение, что кроме 3-4 краулеров все остальные попросту не нужны. Боты шастают по сайтам, пачкают логи, создают лишнюю нагрузку. Оставлять имеет смысл Яндекс и Гуглобота. Так же в некоторых случаях Бинг, мейлру, яху. Потому пользуемся простым bash скриптом, который блокирует заданный список поисковых ботов по юзерагентам.
Скрипт:
 #!/bin/bash  
 bots="msnbot  
 bingbot  
 BLEXBot  
 MJ12bot  
 BuddhaBot  
 Ezooms  
 AhrefsBot  
 Baiduspider  
 PaperLiBot  
 Twitterbot  
 QuerySeekerSpider  
 meanpathbot  
 Mail.RU_Bot  
 SemrushBot  
 SolomonoBot  
 Butterfly  
 UnwindFetchor  
 rogerbot  
 NING  
 TweetmemeBot  
 SeznamBot  
 coccoc  
 Yeti  
 Moreover  
 TurnitinBot  
 METASpider  
 Nekstbot  
 SputnikBot  
 Nigma.ru";  
 bots=`echo $bots | sed ':a;N;$!ba;s/\n//g'`;  
 for i in $bots ; do  
 iptables -A INPUT -m string --algo kmp --string $i -p tcp --dport 80 -j DROP  
 echo "$i has banned.."  
 done  

После чего сохраняем правила. В Centos/RHEL
 # service iptables save  

В Debian/Ubuntu
 # iptables-save  

13 июн. 2015 г.

Touchpad - настройка клика (OpenBSD)

Очень удобно при использовании тачпада иметь возможность по тапу на него эмулировать клик. Не то чтобы даже удобно, это работает по дефолту на многих ОС, но на OpenBSD искаропки мне этого получить не удалось, а значит придется добавлять руками. Чтобы добавить эту возможность в OpenBSD (у меня 5.7 current), достаточно нескольких строк в xorg.conf.

 Section "InputClass"  
        Identifier "touchpad"  
        Driver "synaptics"  
        MatchIsTouchpad "on"  
        Option "TapButton1" "1"  
 EndSection  


В принципе в рамках текущей сесси можно это сделать с помощью команды
 # synclient TapButton1=1  


11 июн. 2015 г.

mysqld: Can't open file (errno: 24)

Внезапно упал мускуль, логи пестрят ошибками вида
 [ERROR] /usr/sbin/mysqld: Can't open file: './admin_cs/cscart_settings_sections.frm' (errno: 24)  

Вероятнее всего уперлись в лимит открытых файлов. О подобной проблеме но с nginx я упоминал тут. По сути действия очень похожи.

В /etc/security/limits.conf прописываем:
 mysql    soft  nofile  9999  
 mysql    hard  nofile 99999  

После чего в конфиг my.cnf секции [mysqld] добавляем
 open-files-limit  = 9999  

Рестартим mysql
 # /etc/init.d/mysqld restart  

Проверяем работу мускуля и логи.
10 июн. 2015 г.

nginx geoip - блокируем китайцев

Недавно  один из серверов клиента активно тыкали палочкой боты из Китая, Индонезии, Японии и Тайваня. Выход был прост  - заблокировать трафик из данных стран путем с помощью модуля nginx geoip. Работа была на системе Centos 6.6
Итак.
Ставим базу
 # yum install GeoIP-GeoLite-data  

Файл бд должен появится тут /usr/share/GeoIP/GeoIP.dat. Открываем конфиг nginx /etc/nginx/nginx.conf. В самом начале блока http {} вставляем:
 geoip_country /usr/share/GeoIP/GeoIP.dat;  
 map $geoip_country_code $allowed_country {  
     default yes;  
     CN no;  
     JP no;  
     ID no;  
     TW no;  
 }  

Теперь у нас есть правила для "плохих" и "хороших" стран. Это работает и обратную сторону, если нужно разрешить только несколько стран:
 map $geoip_country_code $allowed_country {  
     default no;  
     RU yes;  
   }  

В нужной секции server {} добавляем
 if ($allowed_country = no) {  
       return 403;  
     }  

То есть в случае, если клиент подпадает под правило "плохой" страны, возвращаем 403 код ошибки.

Заглянем в лог:
 110.84.170.33 - - [09/Jun/2015:20:33:55 +0300] "GET /ann.php?info_hash=9%3B%E8b%1EC%C8%86%DF%E9%99%C4%0D%A8%14%85%9B%85%E2h&peer_id=%2DSD0100%2DW%3E%FF%DB%C6%16%FD%0A%FFV%26I&ip=100.64.4.238&port=11181&uploaded=637620092&downloaded=637620092&left=373207172&numwant=200&key=9623&compact=1 HTTP/1.0" 403 162 "-" "Bittorrent" "-"  

Как видим, он получает 403, как и было задумано.
9 июн. 2015 г.

Смена регистра названий папок

Сменить регистр названий папок можно с помощью многофункциональной команды find. Однажды клиент залил на сервер кучу папок с названиями в нижнем регистре, которые должны были быть в верхем. Решается просто:
 find . -type d -name "*" -execdir rename 'y/a-z/A-Z/' {} \;  

7 июн. 2015 г.

Установка php 5.2 на Centos

Не смотря на то, что на дворе 2015, но часто есть необходимость установить на сервере Centos php5.2.  Года 2 назад это можно было сделать из centalt (пока он не закрылся). Сейчас же, если вам очень лень компилировать 5.2 руками, то уже собранный можно установить из этого репа:
 [PHP52]  
 name=PHP 5.2 Packages for Enterprise Linux 6 - $basearch  
 baseurl=http://yum.mchost.ru/pub/php52/centos/6/x86_64/  
 enabled=1  
 gpgcheck=0  

Создаем файл /etc/yum.repos.d/php52.repo и добавляем туда текст выше. Предварительно необходимо закрыть php версий выше из репозиториев CentOS-Base.repo и других(remi, epel) если таковые подключены. По сути remi можно выключить вообще. В CentosBase записи приводим к виду:
 [base]  
 name=CentOS-$releasever - Base  
 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra  
 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/  
 gpgcheck=1  
 exclude=php*5.4* php*5.3*   
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6  

для секций base, updates, и extras.
Далее
 yum update  

И ставим php.
 yum install php php-common  

Список готовых пакетов в репе можно посмотреть по ссылке из repo файла, в большинстве случаев их достаточно с головой, в случае чего можно дособрать руками, все же это быстрее, чем полностью собирать php.
6 июн. 2015 г.

nginx: accept4() failed (24: Too many open files)

Если в логе nginx обнаруживаем ошибку accept4() failed (24: Too many open files), значит уперлись в лимит открытых файлов.Проверяем системный лимит командой:
# ulimit -n  

На выходе получим какое-то значение, его нам нужно увеличить. Вариантов несколько.
 # ulimit -n 99999  
увеличит лимит "на лету", но после ребута сервера он сбросится.

Поднимаем "жестко". В файл /etc/sysctl.conf вписываем
 fs.file-max = 99999  
а так же в файле /etc/security/limits.conf 
 nginx    soft  nofile  9999  
 nginx    hard  nofile 99999  

После этого выполняем команду
 # sysctl -p  
чтобы изменения вступили в силу.

Так же в самом конфиге nginx по пути /etc/nginx/nginx.conf необходимо поднять параметр worker_rlimit_nofile до необходимой величины( к примеру worker_rlimit_nofile 99999;) Сохраняем конфиг и рестартим сервис
 # /etc/init.d/nginx restart  

Проверяем логи, если все в порядке, то установленных лимитов достаточно.
5 июн. 2015 г.

Compiling Opennx under Debian 8 'jessie'

К большому сожалению не нашел (или плохо искал?) на Debian 8 пакета Opennx клиента. На самом сайте Opennx есть ссылки на собранные пакеты для 5го и 6го Дебиана, но нам они не особо полезны.
Качаем исходники с этой страницы
 wget http://sourceforge.net/projects/opennx/files/opennx/CI-source/opennx-0.16.0.729.tar.gz  

Распаковываем
 tar -xvf opennx-0.16.0.729.tar.gz  

Переходим в папку
 cd opennx-0.16  

Устанавливаем необходимые нам библиотеки (собственно компилятор и wxWidgets, необходимый для работы Opennx)
 apt-get install build-essential  
 apt-get install libwxgtk3.0-dev  

Далее
 ./configure  

После запуска ./configure выполняем
 make install  

и я столкнулся с такими ошибками
 AsyncProcess.cpp:211:69: error: cannot pass objects of non-trivially-copyable type ‘class wxCStrData’ through ‘...’  
        ::myLogTrace(MYTRACETAG, wxT("Sending: '%s'"), s.c_str());  
                                    ^  
 AsyncProcess.cpp: In member function ‘bool AsyncProcess::Start()’:  
 AsyncProcess.cpp:252:70: error: cannot pass objects of non-trivially-copyable type ‘class wxCStrData’ through ‘...’  
      ::myLogTrace(MYTRACETAG, wxT("Starting '%s'"), m_sCmd.c_str());  
                                    ^  
 AsyncProcess.cpp:265:24: warning: ‘wxThreadError wxThreadHelper::Create(unsigned int)’ is deprecated (declared at /usr/include/wx-3.0/wx/thread.h:760) [-Wdeprecated-declarations]  
          Create();  
             ^  
 Makefile:1225: recipe for target 'opennx-AsyncProcess.o' failed  
 make[1]: *** [opennx-AsyncProcess.o] Error 1  
 make[1]: Leaving directory '/root/opennx-0.16'  
 Makefile:2397: recipe for target 'install-recursive' failed  
 make: *** [install-recursive] Error  

Решил проблему путем редактирования AsyncProcess.cpp (строки 252 и 211). s.c_str() и m_sCmd.c_str() были заменены на s.wx_str() и m_sCmd.wx_str(). Ошибка пропала.
Запускаем make install снова. Готово.

Конвертация InnoDB в MyISAM

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

 mysql -u username -p -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" | tail -n+2 >> alter.sql  

db_name заменяем на актуальное название бд. Выхлопом получим файл alter.sql, который теперь можно(точнее нужно) попросту импортировать в текущую БД InnoDB. После чего получим на выходе MyISAM базу.
4 июн. 2015 г.

Импорт/экспорт БД с удаленного сервера

В случае нехватки места на текущем рабочем сервере может понадобится выполнить операцию  с импортом/экспортом базы с удаленного сервера напрямую, не переливая дамп между узлами.
Команды простые.
Экспорт бд с удаленного remotehost в локальный file.sql:
 ssh user@remotehost mysqldump -u remotemuser -p remotedb > file.sql  

Восстановление бд на удаленный сервер:
 ssh user@remotehost mysql -u remotemuser -p remotedb < file.sql  


3 июн. 2015 г.

Options +Indexes не срабатывает

Столкнулись с проблемой, данный код в виртуалхостах не работает
 <Directory /home/admin/web/site/public_html>  
     AllowOverride All  
     Options +Includes +Indexes +ExecCGI  
 </Directory>  

Ожидалось при отсутствии index.(php|html) файла получить вместо 403 ошибки просто список файлов директории. Но нет. Понятное дело, где-то был -Indexes, который перекрывал. И он нашелся. /etc/httpd/conf.d/welcome.conf ( Centos 6.6 ) с содержимым
 <LocationMatch "^/+$">  
   Options -Indexes  
   ErrorDocument 403 /error/noindex.html  
 </LocationMatch>  

Этот конфиг перекрывал содержимое <Directory>, что вполне логично, если ознакомиться с документацией на сайте apache раздел "How the sections are merged". Последовательность простая:

  • <Directory> (кроме регулярных выражений) и htaccess выполняются одновременно (.htaccess может перекрывать <Directory>)
  • <DirectoryMatch> (и <Directory ~>)
  • <Files> и <FilesMatch> выполняются одновременно
  • <Location> и <LocationMatch> выполняются одновременно
Комментируем код welcome.conf , рестартим httpd, все работает как нужно, в браузере видим список файлов.

xephyr несколько X сессий

Часто имеется необходимость запустить вторую X сессию в уже активной. К примеру для дебага конфига Awesome WM, так как падующий Awesome не оставляет за собой много следов.  Делается просто:

 Xephyr :1 -ac -br -noreset -screen 1152x720 &  
 DISPLAY=:1.0 awesome -c ~/.config/awesome/rc.lua.x  

В данном случае запускается новый инстанс awesome с указанием нужного вам конфига. И в случае наличия каких-либо проблем в конфиге мы сразу же увидим вывод ошибок. Можно запускать любой другой WM с той же целью.

В случае проблем перелогиниваемся, удаляем активные "левые"  x сессии и пробуем снова.
2 июн. 2015 г.

OpenBSD: wrong magic number

При попытке примонтировать USB устройство в OpenBSD может возникнуть ошибка
 wrong magic number X (expected Y)  

Для решения проблемы пробуем пересоздать файловую систему на флешке так
 mkfs.ext2 -I 128 /device/  

Проверка разделов после монтирования
 disklabel sd0   

Вместо sd0 может быть любое другое usb устройство, узнать его можно по выхлопу dmesg.
1 июн. 2015 г.

Очистить очередь Exim и Postfix

Exim:
Проверка очереди
 exim -bp  

Удаление сообщения из очереди по номеру
 exim -Mrm {message-id}  

Удаление всех сообщений из очереди exim:
 exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash  

или так
 exim -bp | exiqgrep -i | xargs exim -Mrm  

Postfix:
Очистка сообщения из очереди по ID
 postsuper -d ID  

Очистка всей очереди
 postsuper -d ALL  

31 мая 2015 г.

Apache: (28)No space left on device: Очистка семафоров

Часто после падения сервера Apache он отказывается запускаться, выдавая подобную ошибку:
 [Tue Apr 21 15:50:00 2009] [emerg] (28)No space left on device: Couldn't create accept lock (/var/lock/apache2/accept.lock.19320) (5)  

Первым делом, конечно же, мы проверим место на диске(и заодно иноды) командами df -h и df -i соответственно. И внезапно может оказаться, что места на диске достаточно и иноды свободны. В чем же еще может быть причина? Она может быть в семафорах. Семафор - это средство для осуществления взаимодействия между различными потоками и их синхронизации.

Проверяем наличие семафоров с помощью команды ipcs:
 ipcs -s | awk '/apache/ {print $2}'   

Если на выходе есть данные, то удаляем с помощью этого кода:
 for i in `ipcs -s | awk '/apache/ {print $2}'`; do (ipcrm -s $i); done   

В случае частого возникновение такой проблемы можно и баш-скринт набросать. Ну и пробуем запустить Apache заново.
 service httpd restart