本日も乙

ただの自己満足な備忘録。

Zabbixサーバによる統合監視(1) 〜Zabbixサーバ(2.2)をソースからインストールする〜

サーバを構築して運用するときに考慮しなければならないのが、サーバの監視です。

Webサービスのリリース直後は正常に動いていても、物理サーバの場合、時間が経過するとディスクや電源など至る所が故障したりして障害が発生することがあります。VPSクラウドの場合も、サーバ提供者による障害が発生する可能性もありますし、そもそもサーバ自体が正常でも自分たちが作成したプロダクトによって障害が発生することもありますので、ずっと正常にサービスを提供できる保証がありません。

そのような場合、サーバに異常がないか監視を行う必要が出てきますが、人の手による監視の場合、24時間365日監視を続けるにはそれなりの人手が必要ですし、人によって監視する項目が異なっていたりすると重大なアラートに気づかない可能性もあります。

もし、サーバ監視を自動的に行ってくれるなら、四六時中サーバに異常が無いか監視をしなくても済みますし、何らかの異常があった場合には予め定めておいた手段(メールなど)で運用者に通知したりくれますし、リカバリ手段があるならそれを組み込むことで素早くサービスの復旧を行うこともできます。

オープンソースのサーバ監視ソフトウェアとして提供されているもの有名なのが、Zabbix, Nagios, Munin, そして最近巷で流行しているSensuがあります。

そこで僕が仕事上、よく使っているZabbixを取り上げ、ローカル環境で統合監視環境を構築してみます。
監視環境を構築するにはボリュームが大きいので以下のように何回かに分けて記事を書いていきたいと思います *1

  1. Vagrantでローカル環境にサーバをたてる
  2. Zabbixサーバをインストールする
  3. Zabbixサーバを設定してモニタリングできる環境を構築する
  4. Zabbixエージェントをインストールして、サーバを監視する
  5. Zabbixプロキシをインストールして複雑な監視環境を構築する
  6. ZabbixSenderを使って特殊なパラメータを監視する
  7. ZabbixAPIを使ってZabbixを操作する

今回は1と2を取り上げます。

(余談ですが、僕はZabbixしか触ったことがないので、時間があればSensuなど使ってみたいと思います)

今回の目標

  • Vagrantでローカル環境に監視サーバをたてる
  • Zabbixサーバをソースからインストールする

サーバ環境

サーバ構成

以下のようなサーバを構築したいと思います。

  • Zabbixサーバ
    • 統合監視するサーバで、Zabbixエージェントから送信されるデータ(パフォーマンス、稼働状況など)を収集することでGUIで監視対象のサーバのデータをモニタリングできます
    • IPアドレス ・・・ 192.168.56.50
  • 監視対象サーバ
    • ZabbixエージェントがZabbixサーバ(もしくはZabbixプロキシ)に監視データを送信することによって監視状態になります
    • IPアドレス ・・・ 192.168.56.51
    • 今回の記事では使いません
  • Zabbixプロキシサーバ
    • Zabbixサーバの代わりZabbixエージェントから送信されるデータを収集し、Zabbixサーバに送信します
    • IPアドレス ・・・ 192.168.56.55
    • 今回の記事では使いません

Vagrantで監視サーバをたてる

Vagrantのインストール、使い方などはこちらの記事を参照してください。
今回はVagrantfileを編集して複数サーバを一気にたてるようにします。

Boxの登録

Boxの追加方法はこちらの記事を参照にしてください。

Vagrantfileの作成

Vagrantfileを作成するためにディレクトリ(/vagrant/zabbix)を作成します。

$ sudo mkdir -p /vagrant/zabbix

Vagrantfileを以下のように記述します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # Zabbix server VM machine
  config.vm.define :zabbix_server do |zabbix_server|
    zabbix_server.vm.box = "centos65_2"
    zabbix_server.vm.network "private_network", ip: "192.168.56.50"
    zabbix_server.vm.hostname = "zabbix-server"

    zabbix_server.vm.provider :virtualbox do |vb|
      # GUI mode off
      vb.gui = false
      # Memory 1024MB, CPU 2core
      vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
      # network
      vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
    end

    # vagrant-cachier plugin
    if Vagrant.has_plugin?("vagrant-cachier")
      zabbix_server.cache.scope = :box
    end
  end

  # Zabbix agent VM machine
  config.vm.define :zabbix_agent do |zabbix_agent|
    zabbix_agent.vm.box = "centos65_2"
    zabbix_agent.vm.network "private_network", ip: "192.168.56.51"
    zabbix_agent.vm.hostname = "zabbix-agent"

    zabbix_agent.vm.provider :virtualbox do |vb|
      # GUI mode off
      vb.gui = false
      # Memory 1024MB, CPU 2core
      vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
      # network
      vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
    end

    # vagrant-cachier plugin
    if Vagrant.has_plugin?("vagrant-cachier")
      zabbix_agent.cache.scope = :box
    end
  end

  # Zabbix proxy VM machine
  config.vm.define :zabbix_proxy do |zabbix_proxy|
    zabbix_proxy.vm.box = "centos65_2"
    zabbix_proxy.vm.network "private_network", ip: "192.168.56.55"
    zabbix_proxy.vm.hostname = "zabbix-proxy"

    zabbix_proxy.vm.provider :virtualbox do |vb|
      # GUI mode off
      vb.gui = false
      # Memory 1024MB, CPU 2core
      vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
      # network
      vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
    end

    # vagrant-cachier plugin
    if Vagrant.has_plugin?("vagrant-cachier")
      zabbix_proxy.cache.scope = :box
    end
  end

end

前回のVagrantfileと異なるのは、config.vm.defineでそれぞれのVMを定義している点です。
vagrant upすると、定義した3つのVMすべてが起動します。

# 3つすべてのVMが起動する
$ vagrant up

# zabbix_serverのみを起動させたい場合
$ vagrant up zabbix_server

今回はzabbix_serverのみを設定するため、以下のようにコマンド実行します。

# VM起動
$ vagrant up zabbix_server
# VMにSSHログイン
$ vagrant ssh zabbix_server

[vagrant@zabbix-server ~]$

Zabbixサーバをソースからインストール

前置きが長くなりましたが、ここからZabbixサーバをインストールしていきます。

依存パッケージのインストール

$ sudo yum install gcc wget fping curl-devel

Webサーバ(Apache, nginxなど)、RDBMS(MySQL, PostgreSQLなど), PHPがインストールされていない場合は、予めインストールしておきます *3
今回は手間を省くためにyumでインストールします。

$ sudo yum install httpd php php-gd php-mbstring php-mysql php-xml mysql-server mysql-devel

Zabbixサーバを動かすためには、PHPのバージョンが5.3.0以上で、以下のモジュールを組み込む必要があります。

  • bcmath
  • gd
  • mbstring
  • mysql
  • xmlreader
  • xmlwriter

bcmathは、yumPHPをインストールしても入っておらず、yumphp-bcmathが見つからなかったため、今回はrpmからインストールしました。 ソースからPHPをインストールする場合は、configureのオプションに--enable-bcmathを付けるだけです。

$ sudo rpm -Uvh ftp://195.220.108.108/linux/centos/6.5/updates/x86_64/Packages/php-bcmath-5.3.3-27.el6_5.
x86_64.rpm
Retrieving ftp://195.220.108.108/linux/centos/6.5/updates/x86_64/Packages/php-bcmath-5.3.3-27.el6_5.x86_64.rpm
Preparing...                ########################################### [100%]
   1:php-bcmath             ########################################### [100%]

rpmファイルは RPM resource php-bcmathからインストールしたPHPのバージョンやサーバのアーキテクチャに合ったものを選んでください。

ソースのダウンロード、インストール

$ cd /usr/local/src
$ sudo wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/2.2.3/zabbix-2.2.3.tar.gz
$ sudo tar zxvf zabbix-2.2.3.tar.gz
$ cd zabbix-2.2.3
$ sudo ./configure --enable-server --enable-agent --with-mysql --with-libcurl

以下、configureのオプションです。
今回は、Zabbixサーバ自身も監視するため、Zabbixエージェントも合わせてインストールします。

[plain] --enable-server ・・・ Zabbixサーバを使えるようにする --enable-agent ・・・ Zabbixエージェントを使えるようにする --with-mysql ・・・ データ保存にMySQLを使うようにする --with-libcurl ・・・ Web監視を使えるようにする [/plain]

コンパイルが通れば、以下のような表示が出ます。
[Enable server]と[Enable agent]がYesになっていればOK。

Configuration:

  Detected OS:           linux-gnu
  Install path:          /usr/local
  Compilation arch:      linux

  Compiler:              gcc
  Compiler flags:        -g -O2  -I/usr/include/mysql  -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buff
er-size=4 -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC   -DUNIV_LINUX -DUNIV_LINUX


  Enable server:         yes
  Server details:
    With database:         MySQL
    WEB Monitoring:        cURL
    Native Jabber:         no
    SNMP:                  no
    IPMI:                  no
    SSH:                   no
    ODBC:                  no
    Linker flags:          -rdynamic      -L/usr/lib64/mysql
    Libraries:             -lm -ldl -lrt  -lresolv    -lmysqlclient             -lcurl

  Enable proxy:          no

  Enable agent:          yes
  Agent details:
    Linker flags:          -rdynamic
    Libraries:             -lm -ldl -lrt  -lresolv     -lcurl

  Enable Java gateway:   no

  LDAP support:          no
  IPv6 support:          no

***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

make installでインストールが完了します。

$ sudo make install

最後に

今回は第一弾としてZabbixサーバをソースからインストールしました。 設定は次の記事に続きます。

*1:あくまで予定なので悪しからず!

*2:Vagrantに関してはこちらの記事を参照してください

*3:インストール方法は当ブログで紹介していますのでそちらをご参照ください