Zabbix – monitorowanie stanu serwera, instalacja i konfiguracja

Oprogramowanie Zabbix służy głównie do monitorowania pracy serwerów, ale można go również wykorzystać do sprawdzania stanu serwisów WWW.

Zabbix Server

Instalację serwera przeprowadzałem w systemie Debian (wersja squeeze). Pobieramy oraz rozpakowujemy źródła ostatniej stabilnej wersji ze strony:

Przechodzimy do katalogu ze źródłami oraz strukturą bazy danych. Następnie ładujemy strukturę bazy oraz dane wymagane do działania serwera:

cd zabbix-1.8.8/create/schema
cat mysql.sql | mysql -u root zabbix
cd ../data
cat data.sql | mysql -u root zabbix
cat images_mysql.sql | mysql -u root zabbix
cd ../../

Przed konfiguracją należy zainstalować kilka paczek ze źródłami. Lista będzie różnić się w zależności od wybranej bazy danych (w moim przypadku MySQL):

apt-get install libmysqlclient-dev libiksemel-dev libcurl4-openssl-dev libsnmp-dev libopenipmi-dev

Skonfigurujemy Zabbixa tak, aby możliwe było monitorowanie z wykorzystaniem protokołu SNMP (–with-net-snmp), wysyłane powiadomień poprzez protokół XMPP (–with-jabber):

./configure --enable-server --with-mysql --with-net-snmp --with-jabber --with-libcurl

Jeżeli konfiguracja przebiegła pomyślnie, możemy instalować:

make install

Dokumentacja zaleca dodanie usług, ale nie jest to konieczne. Do pliku /etc/services możemy dodać następujące wpisy:

zabbix-agent    10050/tcp  Zabbix Agent
zabbix-agent    10050/udp  Zabbix Agent
zabbix-trapper  10051/tcp  Zabbix Trapper
zabbix-trapper  10051/udp  Zabbix Trapper

Teraz czas na utworzenie pliku konfiguracyjnego. Przykład dostarczy wraz z aplikacją wystarczy do uruchomienia serwera:

mkdir /etc/zabbix
cp /root/zabbix/zabbix-1.8.8/misc/conf/zabbix_server.conf /etc/zabbix/zabbix_server.conf

Domyślnie Zabbix instaluje się w /usr/local/sbin, startujemy serwer poleceniem:

/usr/local/sbin/zabbix_server

Poleceniem ps możemy sprawdzić czy serwer działa:

ps aux | grep zabbix

Jeżeli nie zobaczymy procesu Zabbixa, to należy zajrzeć do pliku z dziennikiem. Domyślnie znajduje się w lokalizacji:

/var/log/zabbix_server

Panel administracyjny jest napisany w PHP. Do jego uruchomienia wystarczy skopiować odpowiednie pliki do katalogu, do którego dostęp posiada serwer WWW np.:

cd frontends/php
cp -a . /var/www/zabbix

Po uruchomieniu postępujemy zgodnie z instrukcjami w instalatorze. Domyślny login to „admin”, a hasło „zabbix”, które oczywiście należy zmienić po pierwszym logowaniu :)

Posiadamy już serwer, ale jeszcze nic nie jest monitorowane. W górnym panelu wybieramy menu Configuration -> Hosts i klikając w „Not monitored” włączamy monitoring na maszynie, na której zainstalowany jest serwer Zabbix. Po chwili pierwsza ikona z lewej strony zmieni kolor z czerwonego na zielony, co oznacza, że monitorowana maszyna jest włączona i można nawiązać z nią połączenie.

Zabbix Agent

Po instalacji serwera należy skonfigurować serwery, które chcemy monitorować. Do tego celu należy zainstalować agenta na każdym z nich. Przechodzimy do katalogu ze źródłami o wydajemy polecenia:

./configure --enable-agent
make install

Ponownie do pliku /etc/services możemy dopisać usługi:

zabbix_agent    10050/tcp
zabbix_trap     10051/tcp

Agenta uruchamiamy poleceniem:

/usr/local/sbin/zabbix_agentd

oraz weryfikujemy przy pomocy:

ps aux | grep zabbix

Logi są dostępne w pliku /var/log/zabbix_agent.

Konfiguracja serwera Zabbix

Po instalacji agenta na każdym serwerze, należy je powiązać z serwerem Zabbixa. Uruchamiamy panel i przechodzimy do menu Configuration -> Hosts. Klikamy na Create Host. Następnie podajemy nazwę serwera, adres IP oraz wybieramy domyślny szablon.

Uwagi

Należy zwrócić uwagę na dużą liczbę danych, które są zbierane przez aplikację. Po tygodniu od uruchomienia aplikacji oraz podłączeniu trzech serwerów baza danych zawiera już ponad 2 500 000 rekordów. Domyślny okres przechowywania danych jest ustawiony na jeden rok :) W większości przypadków, gdy chcemy być jedynie powiadamiani o stanie serwera, można zmniejszyć ten okres do kilku tygodni lub dni.

Zaszufladkowano do kategorii Linux | Możliwość komentowania Zabbix – monitorowanie stanu serwera, instalacja i konfiguracja została wyłączona

Custom Code Completion for NetBeans

W pracy stosuję system szablonów Open Power Template. Pomimo wielu zalet system posiada jedną wadę, polecenia są stosunkowo długie :) Nie znalazłem sposobu na dodanie własnych poleceń do listy podpowiedzi w NetBeansie, więc napisałem plugin, który to umożliwia.

Plugin pozwala na utworzenie własnej listy podpowiedzi do kodu (np. nazw funkcji, klas itd.) lub po prostu zwykłych fraz w oknie edytora. W chwili obecnej działa jedynie z plikami XML (text/xml), ale łatwo można dodać inne typy edytując plik „layer.xml”.

Przykładowe listy fraz znajdują się w katalogu samples. Plugin wymaga wersji 7.0 lub nowszej środowiska. Źródła oraz skompilowana wersja znajdują się w serwisie GitHub.

Źródła w serwisie GitLab.

Linki

http://platform.netbeans.org/tutorials/nbm-code-completion.html

Zaszufladkowano do kategorii Java, PHP, Projekty | Możliwość komentowania Custom Code Completion for NetBeans została wyłączona

Usuwanie nieużywanych instalatorów MSI

Po usunięciu aplikacji, które były instalowane instalatorem MSI na dysku może jeszcze zostać wiele niepotrzebnych plików. Możemy je usunąć przy pomocy aplikacji Windows Install CleanUp.

Po pobraniu oraz instalujemy programu, w konsoli wykonujemy polecenie:

"C:\Program Files\Windows Installer Clean Up\MsiZap.exe" G!

Na moim komputerze powyższa operacja zwolniła ok. 2 GB miejsca na partycji systemowej.

Zaszufladkowano do kategorii Windows | Możliwość komentowania Usuwanie nieużywanych instalatorów MSI została wyłączona

JSONP w WCF

Na potrzeby jednego z projektów wykonywałem Web Service przy użyciu technologii Windows Communication Foundation. Usługa musiała zwracać dane w postaci JSNOP tak, aby przeglądarka mogła odwołać się bezpośrednio do niej bez konieczności tworzenia proxy np. w PHP. Niestety, usługi w .NET obsługują tylko dwa format: XML oraz JSON.

Na stronie Microsoftu są dostępne przykłady wykorzystania WCF. Jeden z nich opisuje sposób implementacji JSNOP, ale rozwiązanie wydaje się być bardzo skomplikowane jak na taką prostą funkcjonalność ;)

Z pomocą przyszedł StackOverflow, na którym znalazłem rozwiązanie podobnego problemu. Pytanie dotyczyło wprawdzie zwracania zawartości zdjęcia, ale skoro możemy zwrócić obrazek w postaci binarnej, to z pewnością uda się wysłać do przeglądarki również dane w postaci tekstowej ;)

Rozwiązanie okazało się bardzo proste. Wystarczy ustawić atrybut „BodyStyle” na „Bare”, a typ wartości zwracanej przez metodę na „Stream”. W definicji metody zwracamy obiekt klasy „MemoryStream”, który zawiera dane. Należy również pamiętać o ustawieniu odpowiedniego „ContentType” (w naszym przypadku jest to oczywiście „application/javascript”).

Implementacja:

[OperationContract]
[WebInvoke(
	Method = "GET",
	BodyStyle = WebMessageBodyStyle.Bare,
	UriTemplate = "/GetProducts?callback={callback}")]
	Stream GetProducts(string callback)
public Stream GetProducts(string callback)
{
	string[] values = new string[] { "a", "b", "c" };

	OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;

	context.ContentType = "application/javascript";
	context.StatusCode = System.Net.HttpStatusCode.OK;

	JavaScriptSerializer js = new JavaScriptSerializer();
	string response = string.Format("{0}({1})", callback, js.Serialize(values));

	return new MemoryStream(Encoding.ASCII.GetBytes(response));
}

Zmienna „values” to dowolny, serializowalny obiekt. Parametr „callback” to nazwa metody zdefiniowana w JavaScripcie, która zostanie wywołana po odebraniu żądania.

Zaszufladkowano do kategorii C#, Windows | Możliwość komentowania JSONP w WCF została wyłączona

HipHop for PHP – instalacja w Ubuntu 11.04

Postanowiłem opisać instalację oraz sposób użycia tego kompilatora, gdyż nie znalazłem zbyt wielu materiałów w języku polskim na ten temat.

Na początek uaktualniamy istniejące oprogramowanie:

sudo apt-get update
sudo apt-get upgrade

Pobieramy niezbędne programy oraz biblioteki:

sudo apt-get install git-core cmake g++ libboost-dev libmysqlclient-dev libxml2-dev libmcrypt-dev libicu-dev openssl binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev wget memcached libreadline-dev libncurses-dev libmemcached-dev libicu-dev libbz2-dev libc-client2007e-dev php5-mcrypt php5-imagick

Teraz tworzymy na dysku katalog, do którego będziemy pobierali wszystkie potrzebne do instalacji pliki:

mkdir sources
cd sources

Wszystkie polecenia należy uruchamiać właśnie z tego katalogu. Skrypty będą automatycznie powracać do katalogu, z którego zostały wywołane.

Pobieramy źródła kompilatora (w chwili obecnej zajmują ok. 23 MB):

git clone git://github.com/facebook/hiphop-php.git
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
cd ..

HipHop for PHP potrzebuje również bibliotek „libevent” oraz „curl”. Nie instalujemy ich jednak z oficjalnych repozytoriów, gdyż obie wymagają poprawek wprowadzonych przez programistów Facebooka.

Kompletne skrypty instalujące obie biblioteki poniżej:

wget http://www.monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
tar -xzvf libevent-1.4.14b-stable.tar.gz
cd libevent-1.4.14b-stable
cp ../hiphop-php/src/third_party/libevent-1.4.14.fb-changes.diff .
patch -p1 < libevent-1.4.14.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..
wget http://curl.haxx.se/download/curl-7.21.2.tar.gz
tar -xvzf curl-7.21.2.tar.gz
cd curl-7.21.2
cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
patch -p1 < libcurl.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Teraz czas na kompilację kompilatora. Osobom które testują HipHopa na maszynie wirtualnej polecam uprzednie przydzielenie trochę większej ilość pamięci RAM niż zwykle. W przeciwnym wypadku system będzie korzystał z pliku wymiany co znacząco wydłuży cały proces.

HipHop był tworzony dla systemów 64-bitowych. W chwili obecnej wsparcie dla 32-takich systemów jest eksperymentalne i nie wszystko może poprawnie działać.

cd hiphop-php
cmake .
make

Po zakończonej kompilacji dodamy alias, aby nie trzeba było za każdym razem wpisywać pełnej ścieżki do programu:

alias hphp=`pwd`/src/hphp/hphp

Teraz czas na test. Przed rozpoczęciem pracy z kompilatorem należy zdefiniować trzy zmienne. Zrobiliśmy już to wcześniej, ale podam odpowiednie polecenia jeszcze raz:

export HPHP_HOME=`pwd`
export HPHP_LIB=`pwd`/bin
export CMAKE_PREFIX_PATH=`/bin/pwd`/../

W chwili obecnej struktura katalogów wygląda u mnie w taki sposób:

.
├── bin
├── curl-7.21.2
├── curl-7.21.2.tar.gz
├── hiphop-php
├── include
├── lib
├── libevent-1.4.14b-stable
├── libevent-1.4.14b-stable.tar.gz
├── php_files
└── share

8 directories, 2 files

Na dysku tworzymy katalog, a w nim przykładowy skryptem PHP, który wypisze słowa „Hello, World” na ekranie (zakładam, że nadal znajduje się w katalogu „hiphop-php”):

cd ..
mkdir php_files
cd php_files
echo "<?php echo 'Hello, World', \"\n\";" > test.php
php test.php

Najprostszym sposobem na uruchomienie kompilatora jest uruchomienie programu hphp:

hphp test.php

Drugi sposób uruchamiania kompilatora zachowuje skompilowane programy w katalogach tymczasowych co pozwala na późniejsze uruchomienie aplikacji oraz podgląd źródeł C++:

hphp test.php --keep-tempdir=1 --log=3

Na ekranie powinniśmy uzyskać podobny wydruk:

running hphp...
creating temporary directory /tmp/hphp_BZhZSg ...
parsing inputs...
parsing inputs took 0'00" (15 ms) (null)
pre-optimizing...
pre-optimizing took 0'00" (2 ms) (null)
inferring types...
inferring types took 0'00" (0 ms) (null)
post-optimizing...
post-optimizing took 0'00" (2 ms) (null)
creating CPP files...
creating CPP files took 0'00" (154 ms) (null)
compiling and linking CPP files...

compiling and linking CPP files took 3'44" (224574 ms) (null)
running executable /tmp/hphp_BZhZSg/program --file test.php...
Hello, World
all files saved in /tmp/hphp_BZhZSg ...

Jak widać skrypt skompilował oraz uruchomił się poprawnie. Ostatnia linia zawiera katalog, w którym znajduje się skompilowany program oraz źródła. Interesujący jest rozmiar pliku wykonywalnego. Plik zajmuje ok. 25 MB, choć jego jedynym zadaniem jest wypisanie tekstu na ekranie ;)

Teraz możemy uruchomić aplikację:

/tmp/hphp_BZhZSg/program

oraz podejrzeć źródła C++:

cat /tmp/hphp_BZhZSg/php/test.cpp

Program możemy uruchomić również jako serwer. Do tego celu służy polecenie:

sudo /tmp/hphp_BZhZSg/program -m server -p 8080

Powinniśmy uzyskać potwierdzenie uruchomienia serwera. Teraz wystarczy odwiedzić poniższy adres w przeglądarce, aby uruchomić aplikację:

http://localhost:8080/test.php

Tak uruchomionym serwerem możemy sterować przy pomocy wiersza poleceń. Pełną listę poleceń znajdziemy pod adresem (korzystam z polecenia curl, gdyż wydruk jest czytelniejszy w konsoli):

curl http://localhost:8088

Serwer zatrzymujemy poleceniem „stop”:

curl http://localhost:8088/stop

Po pełną listę poleceń oraz więcej przykładów użycia odsyłam w chwili obecnej na oficjalne Wiki.

Linki

https://github.com/facebook/hiphop-php/wiki/Building-and-Installing-on-Ubuntu-10.10
https://github.com/facebook/hiphop-php/wiki/Running-HipHop
http://php.webtutor.pl/en/2011/05/17/drupal-hiphop-for-php-vs-apc-benchmark/

Zaszufladkowano do kategorii Linux, PHP | Możliwość komentowania HipHop for PHP – instalacja w Ubuntu 11.04 została wyłączona

sendmail – wysyłanie e-maili pod Windows z PHP

Szukałem sposobu na testowanie oraz monitorowanie owej wysyłki podczas pracy pod Windowsem bez konieczności ciągłego kopiowania plików na serwer testowy po każdej wprowadzonej zmianie lub instalacji dodatkowego oprogramowania w postaci serwera SMTP. Mogę oczywiście wysyłać e-maile przy pomocy biblioteki PHPMailer skonfigurowanej tak, aby wysyłka odbywała się przez dowolną skrzynkę SMTP, ale trudno jest monitorować taki proces. Chciałbym dokładnie wiedzieć jakie dane zostały wysłane na serwer oraz dlaczego niektóre wiadomości nie były poprawnie wysyłane.

Rozwiązaniem problemu okazał się sendmail. Program jest dostarczy np. razem z XAMMP-em, ale możemy go również pobrać i zainstalować osobno.

Konfiguracja jest bardzo prosta, wystarczy podać adres serwera SMTP, login oraz hasło do skrzynki pocztowej. Dodatkowo możemy nakazać logowanie komunikatów o błędach oraz wszystkich danych przesyłanych do oraz odbieranych z serwera SMTP do plików, co jest bardzo pomocne podczas testów. Ważne jest dla mnie również to, że taki mechanizm nie wymaga wprowadzania dodatkowego kodu do projektu, a wysyłka może odbywać się przy pomocy funkcji mail.

Przykładowa konfiguracja:

[sendmail]
smtp_server = adres.serwera.smtp
smtp_port = 587
error_logfile = error.log
debug_logfile = debug.log

auth_username = login_konta_smtp
auth_password = hasło_konta_smtp

[mail function]

sendmail_path = „C:\sendmail\sendmail.exe -t”

Po restarcie serwera WWW e-maile będą wysyłane z konta, które skonfigurowaliśmy w sendmailu, a treść każdej wiadomości oraz komunikaty błędów będą logowane do odpowiednich plików.

Zaszufladkowano do kategorii PHP, Windows | Możliwość komentowania sendmail – wysyłanie e-maili pod Windows z PHP została wyłączona

Instalacja LAMP w Ubuntu 11.04

W najnowszych wersjach Ubuntu instalacja stosu LAMP jest bardzo prosta. Wystarczy wydać dwa polecenia w terminalu:

sudo apt-get update
sudo apt-get install lamp-server^

W trakcie instalacji zostaniemy kilkukrotnie poproszeni o hasło do bazy MySQL dla użytkownika „root”.

Po zakończonej instalacji sprawdzamy czy serwer został zainstalowany i uruchomiony poprawnie odwiedzając stronę:

http://localhost/
Zaszufladkowano do kategorii Linux, PHP | Możliwość komentowania Instalacja LAMP w Ubuntu 11.04 została wyłączona

Node.js – pobieranie stron (web scraping)

Zwykle chcąc pobrać stronę WWW i przeskanować je zawartość korzystamy z narzędzia typu Wget lub cURL, a następnie przetwarzamy dane przy pomocy np. wyrażeń XPath. Oczywistą wadą takiego rozwiązania jest brak możliwości pobrania informacji generowanych przez Java Script.

Do parsowania stron generowanych przy pomocy Java Scriptu, można wykorzystać serwer Node.js oraz konsolową przeglądarkę PhantomJS.

Instalacja Node.js

wget http://nodejs.org/dist/v0.8.14/node-v0.8.14.tar.gz
tar xvzf node-v0.8.14.tar.gz
cd node-v0.8.14
./configure
make
make install

Instalacja PhantomJS

Oprócz narzędzi potrzebnych do kompilacji programu:

apt-get install build-essential chrpath git-core libssl-dev libfontconfig1-dev

możemy zainstalować jeszcze aplikację do kompresji plików binarnych:

apt-get install upx

Przystępujemy do pobrania oraz kompilacji:

wget http://phantomjs.googlecode.com/files/phantomjs-1.7.0-source.zip
unzip phantomjs-1.7.0-source.zip
cd phantomjs-1.7.0
./build.sh
deploy/package.sh

Po kompilacji w katalogu „deploy” znajdziemy archiwum

Instalacja modułu PhantomJS dla Node.js

npm install phantom

Teraz musimy dodać ścieżkę do pliku wykonywalnego PhantomJS do zmiennych środowiskowych. W systemie Windows modyfikujemy zmienną PATH, a w systemie Linux możemy utworzyć dowiązanie symboliczne w katalogu /usr/bin.

Poprawnym efektem działania powyższej operacji ma być możliwość wydania polecenia „phantomjs”, które uruchomi aplikację.

Linki

http://nodejs.org/http://phantomjs.org/https://github.com/sgentle/phantomjs-nodehttp://net.tutsplus.com/tutorials/javascript-ajax/web-scraping-with-node-js/
Zaszufladkowano do kategorii Linux | Możliwość komentowania Node.js – pobieranie stron (web scraping) została wyłączona

Instalacja Oracle XE w Ubuntu

Bazę w wersji Express możemy zainstalować z repozytoriów udostępnianych przez firmę Oracle.

Dodajemy repozytorium do pliku /etc/apt/sources.list o pobieramy klucz.

deb http://oss.oracle.com/debian/ unstable main non-free
wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -

Instalujemy bazę oraz klienta.

sudo apt-get update
sudo apt-get install oracle-xe oracle-xe-client

Po instalacji uruchamiamy skrypt do konfiguracji bazy.

sudo /etc/init.d/oracle-xe configure

Po zakończeniu konfigurowania bazy, wchodzimy pod poniższy adres:

http://127.0.0.1:8080/apex

Pojawi się ekran logowania. Wspisujemy login „system” oraz hasło podane podczas instalacji.

Zaszufladkowano do kategorii Linux, Oracle | Możliwość komentowania Instalacja Oracle XE w Ubuntu została wyłączona

Sieć neuronowa – rozpoznawanie znaków

Projekt akademicki. Zadaniem aplikacji jest rozpoznawanie znaków przy pomocy sieci neuronowej. Sieć uczy się metodą wstecznej propagacji błędów.

Źródła w serwisie GitLab.

Zaszufladkowano do kategorii C#, Projekty | Możliwość komentowania Sieć neuronowa – rozpoznawanie znaków została wyłączona