Nagiosでサーバ監視〜導入編〜

運用しているサーバや常時稼働しているマシンを監視したいという願望はあったのだが、偶然Nagiosというものを知ったので、取り敢えず使ってみることにした。

 

長くなってしまった気がするので、導入編と利用編で分けようと思う。こちらは導入編。

 

環境はArch Linux(ただしsystemd-nspawnでコンテナ立ててその上に設置する。ホイホイ実験できて便利だね)

基本的にはいつもの通りNagios – ArchWikiで。

 

Nagiosは本来はWebサーバは必要としないのだが、Webフロントエンドがあるので、Webサーバを用意しておいた方が便利に使えるだろう…ということで、ArchWikiではnginx, php, php-fpm, fcgiwrapが良いと思うよって書いてある

ただ、nginx全然使い慣れてないし、nginxで四苦八苦することは今回の趣旨から外れるので、ApacheでPHP使えるようにして…みたいな感じで。省略。ちなみにNagios入れたあとPHP動かなくて苦しんだけど、どうやって解決したのか全く覚えてないので、自宅サーバ新調してから手順をまたまとめ直します()

 

公式リポジトリにnagiosはいらっしゃらないので、nagios – aurのお世話になる。また、monitoring-pluginsが必要になるやろって書いてあるので、それもインストールしておく。

$ yaourt -S nagios
$ sudo pacman -S monitoring-plugins

monitoring-pluginsをnagiosから使えるように設定する。具体的には、/etc/nagios/resource.cfgの$USER1$が向いている先をmonitoring-pluginsに変更する

#$USER1$=/usr/share/nagios/libexec
$USER1$=/usr/lib/monitoring-plugins

コンフィグファイルをsampleをもとに作成する(つってもコピーするだけ)

$ sudo cp /etc/nagios/cgi.cfg.sample /etc/nagios/cgi.cfg
$ sudo cp /etc/nagios/resource.cfg.sample /etc/nagios/resource.cfg
$ sudo cp /etc/nagios/nagios.cfg.sample /etc/nagios/nagios.cfg
$ sudo cp /etc/nagios/objects/commands.cfg.sample /etc/nagios/objects/commands.cfg
$ sudo cp /etc/nagios/objects/contacts.cfg.sample /etc/nagios/objects/contacts.cfg
$ sudo cp /etc/nagios/objects/localhost.cfg.sample /etc/nagios/objects/localhost.cfg
$ sudo cp /etc/nagios/objects/templates.cfg.sample /etc/nagios/objects/templates.cfg
$ sudo cp /etc/nagios/objects/timeperiods.cfg.sample /etc/nagios/objects/timeperiods.cfg

ファイル群のオーナー変更

$ sudo chown -R nagios:nagios /etc/nagios

認証情報作成(ArchWiki通りにユーザ名はnagiosadminにしてみた)

$ sudo htpasswd -c /etc/nagios/htpasswd.users nagiosadmin

/usr/share/nagiosがroot:rootだとまずいようなのでこれも変更しておく

$ sudo chown -R nagios:nagios /usr/share/nagios

Apacheにnagiosを設定する。ArchWikiではPHP5使っているようだけどPHP7でもおkっぽい

$ sudo vim /etc/httpd/conf/httpd.conf
〜略〜
LoadModule php7_module modules/libphp7.so
〜略〜
Include "conf/extra/nagios.conf"
〜略〜
Include "conf/extra/php7_module.conf

nagios.confを読み込ませるようにしているので、無いと死ぬ。作成する(サンプルからコピーする)

$ sudo cp /etc/webapps/nagios/apache.example.conf /etc/httpd/conf/extra/nagios.conf

Apacheの実行ユーザ(http)がnagiosグループに入っていないとこれも死ぬので追加

$ sudo usermod -G nagios -a http

PHPがnagiosのWebフロントエンドを実行できるようにopen_basedirを編集する

$ sudo vim /etc/php/php.ini
open_basedir = /usr/share/nagios/share/

以上でセットアップ終了。起動してブラウザからhttp://localhost/nagiosにアクセスしよう。設定しておいた認証情報(nagiosadminとか)を使ってログインできる。

$ sudo systemctl restart nagios
$ sudo systemctl restart httpd

 

最近はあまり見なくなったフレームレイアウト

 

以上。

PHPでiCalendarなデータをパースする

PukiWikiにGoogleカレンダーのデータを表示したかったんだけど、それらしいプラグインがいまいち見つからなかったので自前で書くことにした。

Googleカレンダーでicsファイルへのリンクを取得して、それをプラグインで読み込んで、あとはてきとうにパースして整形して〜と思っていたけど、パース書くの面倒だなぁと思ってぐぐったら、File_IMCを使えば良いようなので使うことにした。

File_IMCはPearを通してインストールする…がPearもデフォルトでは入っていないのでインストールしよう。

環境はUbuntu 16.04.2

$ sudo apt-get install php-pear
$ pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.4.0 stable
Console_Getopt 1.4.1 stable
PEAR 1.10.1 stable
PEAR_Manpages 1.10.0 stable
Structures_Graph 1.1.1 stable
XML_Util 1.3.0 stable
$ pear install File_IMC
Failed to download pear/File_IMC within preferred state "stable", latest release is version 0.5.0, stability "beta", use "channel://pear.php.net/File_IMC-0.5.0" to install
install failed
$ pear install File_IMC-0.5.0 [Ret:1 16:11:41]
Cannot install, php_dir for channel "pear.php.net" is not writeable by the current user
$ sudo pear install File_IMC-0.5.0 [Ret:1 16:11:54]
downloading File_IMC-0.5.0.tgz ...
Starting to download File_IMC-0.5.0.tgz (32,161 bytes)
.....done: 32,161 bytes
install ok: channel://pear.php.net/File_IMC-0.5.0

以上でFile_IMCのインストールはおしまい。

 

使ってみる。

require_once('File/IMC.php');
$ical = file_get_contents('うんたらかんたら.ics');
$parse = File_IMC::parse('vCalendar');
$parse->fromText($ical);
$events = $parse->getEvents();

$data = array();
while ($events->valid()) {
$event = $events->current();
$data[] = array(
'start' => $event->getStart(),
'end' => $event->getEnd(),
'summary' => $event->getSummary(),
'description' => $event->getDescription()
);
$events->next();
}

print_r($data);

startの値でソートしたければ、

foreach((array) $data as $key => $value) {
$sort[$key] = $value['start'];
}
array_multisort($sort, SORT_ASC, $data);

 

あとはてきとうに整形するなりなんなりでいいんだけど…Googleカレンダーでは場所情報が記録できるのに、File_IMCにgetLocation()つーメソッドは無い。

見たとこイベント開始/終了時刻、タイトル(summary)、詳細(description)しか拾えないっぽいので強引になんとかしてやるぜ!

/usr/share/php/File/IMC/Parse/Vcalendar/Event.phpに各メソッドが記述されているので、これをそれらしく書き換えればなんとかなるのでは?

というわけで下記コードをてきとうに追加

public function getLocation()
{
return $this->data['LOCATION'][0]['value'][0][0];
}

あとは同じ感覚で$event->getLocation()とかすれば拾い出せるはず。

PHP欠片も勉強しないで触ってもなんとかなるもんだね(目的のプラグインが作れたので)

まーセキュリティは何も考えてないんですけど

Ubuntu16.04のApache2でHTTP/2する

あると思ったらなかったHTTP/2対応(?)

$ sudo a2enmod http2
ERROR: Module http2 does not exist!
$ ls /etc/apache2/mods-available/http2.load
ls: cannot access '/etc/apache2/mods-available/http2.load': No such file or directory

マジかよ。

 

ぐぐってきたら、mod_http2.soが無いらしいので自前でapache2ビルドしてやれ、という情報が。やってやるぜ!

 

参考サイト:

How To Set Up Apache with HTTP/2 Support on Ubuntu 16.04 – WebSetNet

Bug #1543572 “mod_http2 is not available under apache 2.4.18 / U…”:Bugs:apache2 package:Ubuntu

流れは、

1. ソースを拾えるようにリポジトリリストをいじる
2. ビルドに必要なパッケージをインストール
3. ビルドする
4. mod_http2.soをコピー
5. mods-availableに配置するべきloadファイルを作成する

参考サイトでは最初にlibnghttp2-devをインストールさせてるけど、ぶっちゃけようわからん(まがお)一応入れました

 

さて作業。

$ sudo apt-get install libnghttp2-dev
$ tail -n3 /etc/apt/sources.list
deb-src http://archive.ubuntu.com/ubuntu xenial main universe restricted multiverse
deb-src http://security.ubuntu.com/ubuntu xenial-security main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu xenial-updates main universe restricted multiverse
$ sudo apt-get update
$ cd ~
$ mkdir apache2 
$ cd apache2
$ apt-get source apache2
$ sudo apt-get build-dep apache2
$ cd apache2-2.4.18
$ fakeroot debian/rules binary

以上でビルドが完了するはず。あとはコピーして有効化してなんたらかんたら

$ sudo cp ~/apache2/apache2-2.4.18/debian/apache2-bin/usr/lib/apache2/modules/mod_http2.so /usr/lib/apache2/modules/
$ cat /etc/apache2/mods-available/http2.load
LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so

<ifModule http2_module>
LogLevel http2:info
</ifModule>
$ sudo a2enmod http2
$ cat /etc/apache2/sites-enabled/default-ssl.conf
<ifModule mod_ssl.c>
<VirtualHost _default_:443>
〜略〜
Protocols h2 http/1.1
〜略〜
$ sudo service apache2 restart

あとはDeveloper Toolsでプロトコル調べるとかなんとかして動作チェックしよう。

Let’s encryptでサラッとHTTPSする

もうそこかしこに情報あるだろうけど、手元で実験出来たので取り敢えず記録。

状況は、

・http://test.tea-soak.org:12345で運用中とする(ホストは192.168.0.5)
・http://tea-soak.org:80でも別サービスを運用中(ホストは192.168.0.4)

で、test.の方をHTTPSにする。各ドメインは同じグローバルIPアドレスを指しているが、ポート番号によって区別し、192.168.0.5に行くか192.168.0.4に行くかをルータで振り分けている。

 

ArchLinuxを使っているのでLet’s encrypt – ArchWikiの通りに。

$ sudo pacman -S certbot
$ certbot certonly --manual
The following error was encountered:
[Errno 13] Permission denied: '/var/log/letsencrypt/letsencrypt.log'
If running as non-root, set --config-dir, --work-dir, and --logs-dir to writeable paths.

面倒なのでroot(sudo)でやりなおす

$ sudo certbot certonly --manual
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):honyarara@honyahonya.com

Please read the Terms of Service at ...
(A)gree/(C)ancel: A

Would you be willing to share your email address...
(Y)es/(N)o: n

Please enter in your domain names(s) (comma and/or space separated)  (Enter 'c' to cancel):test.tea-soak.org
...
Make sure your web server displays the following content at http://test.tea-soak.org/.well-known/acme-challenge/LT6x2... before continuing:

LT6x2...k4.JenbAW...

If you don't have HTTP server configured, you can run the following command on the target server (as root):
...
Press Enter to Continue

(長くなってしまうので抜粋しまくっておいた)

Press Enter to Continueのところで止まるので、http://test.tea-soak.org/.well-known/acme-challenge/LT6x2…でアクセスできるようにファイルを配置する。具体的にはfollowing command on the target server以下に並んでいるコマンドを参考になんとかする。

ドメインの存在確認のacme-challenge(そういう意味だよね?)はhttp://test.tea-soak.org:80に行くと思われるので、つまり192.168.0.4にアクセスが飛んでしまう。今回は面倒なので192.168.0.4に所定のファイルを設置した。

うまくいくと、/etc/letsencrypt/live/test.tea-soak.org/以下に鍵と証明書が保存されるはず。

privkey.pem:証明書の秘密鍵
fullchain.pem:証明書(多くのサーバソフトで使えるらしい)

各ファイルの説明はREADMEに入っている(上記はてきとう和訳)

 

test.tea-soak.orgではnginxが動いているので設定をいじる。

大雑把に以下みたいな感じ

server {
listen 12345;
server_name test.tea-soak.org;
ssl on;
ssl_certificate /etc/letsencrypt/live/test.tea-soak.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.tea-soak.org/privkey.pem;
]

あとはsudo systemctl restart nginxすると設定が有効になるはず

従来通りHTTPアクセスすると400 Bad Requestが返ってくるが、HTTPSではきちんとアクセスできることを確認しておしまい。

 

このやり方だと、証明書の更新は自動では出来ない。実験環境でなく本番環境で使うなら、こういうところの管理は自動化したいところだし、ArchWikiの下の方読もう()

SQLのデータベース操作(いつも忘れる)

使うけれど使うときにいつも忘れちゃうのでメモ。毎度ぐぐってくるの面倒なのだ

 

・データベースとそれ用ユーザをつくる

CREATE DATABASE database_name;
CREATE USER 'user_name'@'localhost' IDNETIFIED BY 'password';
GRANT ALL PRIVILEGES ON database_name.* TO 'user_name'@'localhost';
FLUSH PRIVILEGES;

・ユーザの一覧を見る

USE mysql;
SELECT user,host FROM user;

・テーブル、データベースを削除する

DROP TABLE table_name;
DROP DATABASE database_name;