poniedziałek, 13 lipca 2020

Nagios + Nginx na CentOS 7

Dawno nic nie pisałem, ale że akurat skończyłem rozstawiać Nagios na serwerze z CentOS 7 i było to wyzwaniem większym niż powinno, poniżej opis kroków aby uruchomić Nagios na takim serwerze bez uruchamiania Apache.

Istotna kwestia. Wszystko wykonywałem z poziomu root, dlatego poniższym komendom brak sudo wskazującego które komendy wymagają podniesienia uprawnień. Z zasady nie powinno się tak robić pomimo tego, że tak jest łatwiej.

1. Zainstaluj zależności

# yum install -y gcc unzip git libmcrypt4 libpcre3-dev ntp make cifs-utils openssl-devel

W razie jeśli któraś z paczek jest już zainstalowana, może zostać zaktualizowana przez yum przy tym kroku. Nie ma obaw, yum dobrze dba o zależności.

2. Pobierz paczkę

# wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.gz

Jak będziesz to czytać pewnie wersja paczki Nagios Core się zmieni korzystając ze strony z historią wersji Nagios Core można znaleźć jaki jest numer ostatniego stabilnego wydania i po prostu podmienić numer w komendzie (oby nie zmienili struktury na serwerze).

3. Rozpakuj paczkę

# tar -zxvf nagios-4.4.6.tar.gz
# rm nagios-4.4.6.tar.gz

Usunąłem paczkę zaraz po rozpakowaniu, ale to już moja sprawa. Nie potrzebowałem aby się walała.

4. Zmiany na użytkownikach

# useradd nagios -M -r
# usermod -a -G nagios nginx

Dodaj użytkownika dla nagios jako użytkownika systemowego (-r) bez katalogu domowego (-M). Przy okazji dodaj użytkownika nginx do grupy nagios, co pozwoli na dostęp do zasobów nagiosa z poziomu procesu nginx.

5. Skompiluj i zainstaluj Nagios

# cd nagios-4.4.6
# ./configure --with-nagios-group=nagios --with-command-group=nginx --with-mail=/usr/sbin/sendmail
# make all
# make install
# make install-init
# make install-commandmode
# make install-config

6. pobierz paczkę z pluginami

# cd ~
# wget https://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz

7. rozpakuj paczkę z pluginami

# tar -xzvf nagios-plugins-2.3.3.tar.gz
# rm nagios-plugins-2.3.3.tar.gz

8. skompiluj i zainstaluj pluginy

# cd nagios-plugins-2.3.3
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl
# make
# make install
# chown -R nagios:nagios /usr/local/nagios/libexec

Na koniec jeszcze ustawiłem własność folderu z libexec w nagios, gdzie rezydują wszystkie pluginy. Domyślnie była ustawiona na roota.

9. pobierz i zainstaluj NRPE

# cd ~
# wget https://netix.dl.sourceforge.net/project/nagios/nrpe-3.x/nrpe-3.3.0.tar.gz
# tar -xzvf nrpe-3.3.0.tar.gz
# rm nrpe-3.3.0.tar.gz
# cd nrpe-3.3.0
# ./configure --enable-command-args --with-nagios-user=nagios --with-nagios-group=nagios --with-ssl=/usr/bin/openssl --with-ssl-lib=/usr/lib64/
# make all
# make install
# make install-init
# make install-config
# systemctl enable --now nrpe.service

Jedyna nowość to od razu włączyłem usługę nrpe do startu razem z systemem, a opcja --now uruchomiła ją również w tej sesji.

10. Instalacja fcgi

Nagios używa fcgi do części czynności. Nginx nie obsługuje samodzielnie fcgi dlatego potrzebne jest dodatkowe narzędzie do tego. Wygląda na to, że najlepszą opcją jest użycie fcgiwrapper. Tu też pojawia się największa różnica względem tutoriali, na których pracowałem. W większości miejsc zalecane jest użycie spawn-fcgi. Okazuje się, że spawn-fcgi nie jest potrzebny, a nawet przeszkadza. Wystarczy odpowiednie użycie systemd.

# yum install -y fcgiwrap

Tworzymy konfigurację socket fcgiwrap dla systemd. W pliku /etc/systemd/system/fcgiwrap.socket

[Unit]
Description=fcgiwrap Socket

[Socket]
SocketMode=0600
SocketUser=nginx
SocketGroup=nginx
ListenStream=/run/nginx/fcgiwrap.sock

[Install]
WantedBy=sockets.target

Tworzymy konfigurację procesu fcgiwrap dla systemd. W pliku /etc/systemd/system/fcgiwrap.service:

[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target

[Service]
ExecStart=/usr/sbin/fcgiwrap
User=nginx
Group=nginx

[Install]
Also=fcgiwrap.socket

Teraz wystarczy już tylko włączyć i uruchomić nowe komponenty systemd

# systemctl enable --now fcgiwrap.socket
# systemctl enable --now fcgiwrap.service

Teraz jeszcze wyjaśnienie czemu spawn-fcgi nie jest potrzebny, a mi nawet przeszkadzał. Na pierwszy rzut oka wydawało się, że robił to samo, bo uruchamiał proces fcgiwrap i tworzył socket. Kłopot był z SELinux. spawn-fcgi tworzył socket i spawnował proces w niewłaściwym kontekście przez co nginx nie miał możliwości się z nimi komunikować. W przeglądarce pojawiał się błąd 503, a w logach można było znaleźć informację o odrzuceniu połączenia. Problem można było obejść na 2 sposoby: osłabić SELinux, albo go nawet wyłączyć (odpada), albo dodać dla nginx uprawnienia do dostępu do kontekstu socket tak jak ustawił go spawn-fcgi. To niestety też tworzyło lukę bezpieczeństwa, więc odpadało. Skorzystanie bezpośrednio z systemd i odpowiednia konfiguracja socket i service zupełnie eliminują ten problem. Na to rozwiązanie natrafiłem tutaj.

11. Konfiguracja Nginx

Tu już wiele zależy od konfiguracji konkretnego serwera i domeny. W moim przypadku nagios uruchomiony jest w ścieżce /nagios na istniejącej domenie. Dlatego też poniżej nie zamieszczam pełnej konfiguracji domeny, a jedynie część dla nagios.

location /nagios {
    try_files $uri $uri/ /index.php$is_args$args;
    index index.php index.html index.htm;
    alias /usr/local/nagios/share;
    allow all;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param AUTH_USER $remote_user;
        fastcgi_param REMOTE_USER $remote_user;
    }  

    location ~ \.cgi$ {
        root /usr/local/nagios/sbin;
        rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param AUTH_USER $remote_user;
        fastcgi_param REMOTE_USER $remote_user;
        fastcgi_pass unix:/var/run/nginx/fcgiwrap.sock;
    }  

    auth_basic "Nagios";
    auth_basic_user_file /usr/local/nagios/etc/htpasswd.users;
}

location ~ ^/nagios/nagiosgraph/cgi-bin/(.*\.cgi)$ {
    alias /usr/local/nagiosgraph/cgi/$1;
    allow all;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_param AUTH_USER $remote_user;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_pass unix:/var/run/nginx/fcgiwrap.sock;
}

location /nagios/nagiosgraph {
    alias /usr/local/nagiosgraph/share;
    allow all;
}

Istotne są konfiguracje cgi. Jak widać wszystkie zapytania do tych lokacji są proxy do socket fcgiwrap.

To już wszystko. Teraz pozostaje tylko skonfigurować konkretne checki na Nagios i nadzorować swoje serwery.

Źródła

wtorek, 18 kwietnia 2017

Symfony 2: użycie Doctrine Cache dla zapytań SOAP

DoctrineCache zwykle kojarzy się z zastosowaniem pamięci podręcznej dla metadanych i wyników zapytań na bazie danych. Tymczasem w prosty sposób można wykorzystać go również do przechowania wyników zapytań do zewnętrznych usług. Poniżej na szybko i z przykładami opis w jaki sposób można to uzyskać.

wtorek, 7 lutego 2017

JavaScript: trochę szerzej o Constraint Validation

Dawno temu napisałem krótki post o Constraint Validation, który miał przedstawić koncepcję i wskazać kierunek dla czytelnika, który chciałby bliżej poznać ten mechanizm. Dziś drobne rozszerzenie do poprzedniego posta: JavaScript: użycie Constraints Validation czyli fajne dymki na polach. Postaram się rozszerzyć nieco myśli rozpoczęte w tamtym poście i opisać parę metod i zdarzeń, które warto znać chcąc stosować Constraint Validation we własnej aplikacji.

środa, 11 stycznia 2017

Animowanie ikony w CSS

Dawno nic ciekawego nie było, więc dziś prosty opis jak w samym CSS zrobić prostą animację ikony 'serduszka', która może zachęcić użytkownika do 'polubienia' jakiegoś elementu w naszym serwisie.

piątek, 11 marca 2016

JavaScript: użycie Constraints Validation czyli fajne dymki na polach

Nie jestem programistą JavaScript, ale jestem programistą, a od paru lat etatowo pracuję przy projektach w PHP, więc co i rusz zdarza się napisać kilka linii kodu w JS. Od pewnego czasu, pracuję przy projekcie w Symfony 2, gdzie w widokach w rosnącej skali wykorzystywany jest Bootstrap. Stopniowo implementujemy też walidację po stronie klienta, dlatego dziś mały post o walidacji przy pomocy ograniczeń, czyli Constraints Validation.

Wrażenia po targach Mieszkań i Domów Mieszkaniowi.pl

W niedzielę 21 lutego 2016 wybraliśmy się na targi Mieszkań i Domów, które odbyły się w hali Expo XXI w Warszawie. Zapraszam do przejrzenia nie tyle 'relacji' co raczej zbioru przemyśleń i opinii o tym wydarzeniu.

sobota, 16 stycznia 2016

Mint: upgrade do wersji 17.3

Wziąłem się wreszcie za mojego starego laptopa i postanowiłem dostosować go do roli maszyny do pisania, jaką ostatnio pełnił. Postawiłem na nim Linux Mint i podstawowe narzędzia. Nim jednak skończyłem, pojawiła się nowa wersja Minta i teoretycznie mogłem zacząć od nowa.

wtorek, 15 grudnia 2015

Android: ustawianie koloru przy rysowaniu po mapie

Pracuję aktualnie nad projektem z wykorzystaniem mapy i po niej rysuję. Miałem z Androidem na tyle długą przerwę, że wiele rzeczy muszę sobie odświeżyć. W związku z tym, dziś taki szybki opis w jaki sposób ustawić kolor figury rysowanej na mapie.

piątek, 30 października 2015

Linux: jak wyczyścić plik zachowując jego parametry

Dzisiaj bardzo krótki post o strasznie użytecznym i sprytnym triku na wyczyszczenie pliku z zachowaniem wszystkich jego atrybutów wykorzystując Bash. Wykorzystuje to proste przekierowanie i działa zawsze jeśli tylko masz uprawnienia do pisania do pliku. Co ciekawe zachowuje wszystkie atrybuty SELinux, więc jest bezpieczne również na środowisku skonfigurowanym w ten sposób.

wtorek, 6 października 2015

Lego: Mercedes Arocs 42043 drożeje

Jak to zwykle, w okresie gdy zbieram się do zakupu jakiegoś zestawu, śledzę jego ceny i szukam sklepu, gdzie będzie najtaniej. Dziś po raz kolejny przejrzałem oferty i posmutniałem, bo ceny odczuwalnie poszły w górę. Bez wątpienia winny jest tu wzmacniający się dolar amerykański.