EC2上のCentOS 6.6にZabbix 2.4をインストール（RDS+nginx+PHP5.6)

AWSにはCloudWatchがありますが、[データの保存期間がたったの2週間しかありません。](http://aws.amazon.com/jp/cloudwatch/details/)
それでは運用を続けていくにあたって短すぎるので、Zabbixサーバを構築してCloudWatchから値を取得しつつ、Zabbixからも監視を行うようにします。

## 公式ドキュメント

https://www.zabbix.com/documentation/2.4/doku.php

## 動作確認構成

* EC2(c3.large)
	* CentOS 6.6
	* Zabbix 2.4.3
	* PHP 5.6.5
	* nginx 1.6.2

* RDS(db.m3.medium)
	* MySQL 5.6.22

## RDS

### Security Group作成

* ZabbixサーバからPort 3306へのアクセスが必要

|Type|Protocol|Port Range|Source|
|---|---|---|---|
|3306|TCP|3306|`Zabbixサーバ`|

### DB Subnet Group作成

* 既存のVPC Subnetを追加したDB Subnet Groupを作成

### Parameter Group作成

* `Parameter Groups` -> `Create Parameter Group`
* パラメータを適宜設定

![RDS_create_parameter_group.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/12a57c82-91a2-7acd-a9c3-9c3fd3cfc3c3.png "RDS_create_parameter_group.png")

---

### Option Group作成

* `Option Groups` -> `Create Group`
* オプションを適宜設定

![RDS_create_option_group_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/2b3fd1f8-6a99-77a1-50db-29d138ac9bf6.png "RDS_create_option_group_2015-03-31.png")

---

### RDS起動

* RDS -> `Launch a DB Instance` -> `MySQL`
* `Do you plan to use this database for production purposes?`で適宜選択
* Backup/Maintenanceは適宜設定

![rds-1_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/88bf7cf3-7552-29c6-e413-e016f505e4c3.png "rds-1_2015-03-31.png")

---

![rds-2_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/6ce0e821-faa4-2c74-de0c-a95f27919931.png "rds-2_2015-03-31.png")


![rds-3_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/951204d8-a257-0d6e-3e59-1ee8249e5f47.png "rds-3_2015-03-31.png")


## EC2起動

### IAM Role作成

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "autoscaling:Describe*",
        "cloudwatch:Describe*",
        "cloudwatch:Get*",
        "cloudwatch:List*",
        "logs:Get*",
        "logs:Describe*",
        "logs:TestMetricFilter",
        "sns:Get*",
        "sns:List*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

### EC2起動

* 作成したIAM Roleを指定した上でEC2を起動
* c3.large
* CentOS 6.6
* Secutiry GroupにてTCP Port 22/443をIP限定して開放
* 既存のVPCに所属させる
* EIPを付与

## PHP 5.6 インストール

```
# rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

```
# yum install --enablerepo=remi,remi-php56 php php-cli php-common php-gd php-pdo php-mysql php-xml php-bcmath php-mbstring php-fpm php-devel
# php --version
PHP 5.6.5 (cli) (built: Jan 21 2015 17:50:29)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
```

```
# vi /etc/php.ini
```

```diff:/etc/php.ini
-max_execution_time = 30
+max_execution_time = 300
-max_input_time = 60
+max_input_time = 300
-post_max_size = 8M
+post_max_size = 32M
-;always_populate_raw_post_data = -1
+always_populate_raw_post_data = -1
+date.timezone = Asia/Tokyo
```

## MySQLクライアント インストール

http://dev.mysql.com/downloads/repo/yum/

### MySQL公式リポジトリを有効化

```
# rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
```

### MySQL最新版をインストール

```
# yum install mysql
# mysql --version
mysql  Ver 14.14 Distrib 5.6.22, for Linux (x86_64) using  EditLine wrapper
```

## Zabbix 2.4 インストール

http://www.zabbix.com/jp/download.php

### Zabbix公式リポジトリを有効化

```
# rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
```

### Zabbix最新版をインストール

```
# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-web-japanese zabbix-get
```

## Zabbix データベース作成

```
# mysql -u root -p -h zabbix-db-1.xxxxxx.ap-northeast-1.rds.amazonaws.com
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@'10.0.%' identified by 'xxxx';
```

### schema定義/データ投入

```
# cd /usr/share/doc/zabbix-server-mysql-2.4.3/create
# mysql -u root -p -h zabbix-db-1.xxxxxx.ap-northeast-1.rds.amazonaws.com zabbix < schema.sql
# mysql -u root -p -h zabbix-db-1.xxxxxx.ap-northeast-1.rds.amazonaws.com zabbix < images.sql
# mysql -u root -p -h zabbix-db-1.xxxxxx.ap-northeast-1.rds.amazonaws.com zabbix < data.sql
```

### Zabbix Server設定

```
# vi /etc/zabbix/zabbix_server.conf
```

```
DBHost=zabbix-db-1.xxxxxx.ap-northeast-1.rds.amazonaws.com
DBName=zabbix
DBUser=zabbix
DBPassword=xxxx
```

### Zabbix Server起動

```
# chkconfig zabbix-server on
# service zabbix-server start
```

### Zabbix Agent起動

```
# chkconfig zabbix-agent on
# service zabbix-agent start
```

## nginx インストール

ここではstableの1.6系をインストールする。
ただ、[nginx作者いわく、stableよりmainlineを使うべき](http://www.slideshare.net/narimichitakamura/nginx-201401201412)ということなので、[mainline](http://nginx.org/en/linux_packages.html#mainline)の方がいいかも。

### nginxリポジトリをインストール

```
# rpm -ivh http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm
```

### nginx最新版をインストール

```
# yum install nginx
# nginx -v
nginx version: nginx/1.6.2
```

### シンボリックリンク作成

```
# ln -s /usr/share/zabbix /usr/share/nginx/html/zabbix
```

### SSL証明書作成

* `Organization Name`や`Common Name`などは適宜設定すること

```
# openssl req -new -days 365 -x509 -sha256 -newkey rsa:2048 -nodes -keyout /etc/nginx/zabbix-cert.key -out /etc/nginx/zabbix-cert.crt
Generating a 2048 bit RSA private key
................................+++
.........+++
writing new private key to '/etc/nginx/zabbix-cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato
Organization Name (eg, company) [Default Company Ltd]:Enigmo Inc.
Organizational Unit Name (eg, section) []:System
Common Name (eg, your name or your server's hostname) []:zabbix.example.com
Email Address []:
```

```
# chmod 400 /etc/nginx/zabbix-cert.*
# openssl x509 -in /etc/nginx/zabbix-cert.crt -text -noout | grep "Signature\|Public-Key"
    Signature Algorithm: sha256WithRSAEncryption
                Public-Key: (2048 bit)
    Signature Algorithm: sha256WithRSAEncryption
```

### Zabbix用の設定

```
# vi /etc/nginx/conf.d/zabbix.conf
```

```
server {
    listen 80;
    listen 443 default_server ssl spdy;

    root /usr/share/nginx/html;
    ssl                  on;
    ssl_certificate      /etc/nginx/zabbix-cert.crt;
    ssl_certificate_key  /etc/nginx/zabbix-cert.key;

    ssl_session_timeout  5m;

    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
    ssl_prefer_server_ciphers   on;

    server_name zabbix.example.com;
    index index.html;
    access_log /var/log/nginx/zabbix-access_log main;
    error_log  /var/log/nginx/zabbix-error_log error;

    location /zabbix {
        index index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
```

### 基本的なチューニング

```
# vi /etc/nginx/nginx.conf
```

```diff:/etc/nginx/nginx.conf
-worker_processes  1;
+worker_processes  2;
+worker_rlimit_nofile 100000;

 events {
     worker_connections  1024;
+    multi_accept on;
+    use epoll;
 }

http {
-    #tcp_nopush     on;
+    tcp_nopush      on;

-    #gzip  on;
+    gzip  on;
+    gzip_vary on;
+    gzip_comp_level 6;
+    gzip_min_length 1024;
+    gzip_types text/plain application/javascript text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
+
+   open_file_cache max=100000 inactive=20s;
+   open_file_cache_valid 30s;
+   open_file_cache_min_uses 2;
+   open_file_cache_errors   on;
+
+    server_tokens  off;
}
```

### 設定ファイルチェック

```
# service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

### nginx, php-fpm起動

```
# chkconfig nginx on
# service nginx start
# chkconfig php-fpm on
# service php-fpm start
```

## AWS監視用パッケージ インストール

### AWS CLI インストール


* EPEL設定

```
# rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

```
# vi /etc/yum.repos.d/epel.repo
```

```diff:/etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
-enabled=1
+enabled=0
```

* python-pipをインストール

```
# yum --enablerepo=epel install python-pip
```

* awscliをインストール

```
# pip install awscli
```

* 確認

```
# aws --version
aws-cli/1.7.3 Python/2.6.6 Linux/2.6.32-504.1.3.el6.x86_64
```

### AWS CLI設定

作成したUserのAccess Key/Secret Access Keyを設定する。

```
# sudo -u zabbix aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]:
```

```
# aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]:
```

### jq インストール

```
# yum --enablerepo=epel install jq
```

## Zabbix設定

### Web UIにアクセス

https://zabbix.example.com/zabbix/setup.php

### Zabbix Server初期設定

* `Next`

![zabbix-1.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/e37252a7-2327-9cbd-d515-db815790b469.png "zabbix-1.png")

* `Next`

![stylehaus-zabbix-setting-1.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/90d02d11-75c8-cc48-5c75-8d136337c068.png)

* User/Passwordを入力後、`Test connection`で`OK`と表示されることを確認。
* `Next`

![zabbix-1_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/4cf6794b-0743-7878-12e9-6f9efa4555b7.png "zabbix-1_2015-03-31.png")

* 識別用の名前を指定する場合は`Name`に入力
* `Next`

![zabbix-2_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/7cfbcecc-7623-e766-9dc9-bf7803d48d1e.png "zabbix-2_2015-03-31.png")

* `Next`

![zabbix-3_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/b5268769-ec65-77b4-f78f-103ea88ea466.png "zabbix-3_2015-03-31.png")

* `Finish`

![zabbix-6.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/66397a03-ac6d-3d52-8031-ee7b35435d9d.png "zabbix-6.png")

* Username: Admin, Password: zabbix
* `Sign in`

![zabbix-7.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/5cb71f40-1bb1-2bea-65f5-b4dc1a80a040.png "zabbix-7.png")

## メール送信設定

### Postfix設定

ホスト名設定。

```
# vi /etc/postfix/main.cf
```

```diff:/etc/postfix/main.cf
+myhostname = zabbix.example.com
```

```
# service postfix check
# service postfix reload
```

### DNSレコード設定

* TXTレコードにZabbixサーバのEIPを追加
* ZabbixサーバのAレコードを設定
    * zabbix.example.com -> ZabbixサーバのEIP
    * Postfixで設定したホスト名と合わせること

### AWSでメール送信制限の解除申請

* Elastic IP Address 1 -> ZabbixサーバのEIP
* Reverse DNS Record for EIP 1 -> zabbix.example.com

https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request

![zabbix-5_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/dd4cb3b0-32db-f91a-9f9a-33be2061090d.png "zabbix-5_2015-03-31.png")

* 受理されると以下のようなメールが送られてくる

```
Your AWS Inquiry

We have configured the reverse DNS record(s) you requested. Your request was mapped for xxx.xxx.xxx.xxx. :zabbix.example.com. Please note that propagation of this update to DNSBL services that Amazon works with may take up to a week.

If you also requested removal of the email sending limitations on your account, these have also been removed for any IPs and instances under your account.
```
### SMTP設定

* 管理 -> Email
* SMTPサーバー: localhost
* SMTP helo: zabbix.example.com
* 送信元メールアドレス: zabbix@example.com

## 監視設定

以下を利用・参考にして設定。

* http://www.zabbix.org/wiki/Zabbix_Templates
    * nginx: https://github.com/blacked/zbx_nginx_template

* http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html
    * http://dev.classmethod.jp/cloud/aws/zabbix-with-cloudwatch/

## クライアント側

監視される側で行う作業は以下。

### Zabbix公式リポジトリを有効化

```
# rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
```

### Zabbix Agentインストール

```
# yum install zabbix-agent
```

### Zabbix Agent設定

```
# vi /etc/zabbix/zabbix_agentd.conf
```

```diff:/etc/zabbix/zabbix_agentd.conf
-Hostname=Zabbix server
+#Hostname=Zabbix server

+EnableRemoteCommands=1

+HostMetadataItem=system.uname
```

### Zabbix Agent起動

```
# chkconfig zabbix-agent on
# service zabbix-agent start
```

## 監視対象ホストを自動登録する場合

下記手順を元に設定する。
https://www.zabbix.com/documentation/2.4/manual/discovery/auto_registration

### サーバ側でアクション設定

Web UIにて以下を実施。

1. `設定` -> `アクション`
1. `イベントソース`のプルダウンメニューで`自動登録`を選択
1. `アクションの作成`
1. `アクション`タブ内の`名前`で、アクションに名前を付ける
1. `アクションの実行条件`タブで、任意の条件を指定（指定しない場合は全てのホストが対象となる）
	* ホスト名やホストメタデータ(HostMetadata or HostMetadataItem)などを条件とすることが可能 
1. `アクションの実行内容`タブで、以下の実行を追加
	* ホストを追加
	* ホストグループに追加
	* テンプレートとリンク
	* ユーザーグループにメッセージを送信

![action-1.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/77dab069-7d54-b325-a4e4-3e6cf573df51.png "action-1.png")

---

![action-2.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/619f4066-f759-df27-ad35-ae2891ca3d0b.png "action-2.png")

---

![action-3.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/0bdec2c1-2d52-bb14-f618-1253b77052f6.png "action-3.png")

### クライアント側で設定確認

* /etc/zabbix/zabbix_agentd.conf内の`ServerActive `でZabbix ServerのIPが指定されていることを確認

```
# grep ^ServerActive /etc/zabbix/zabbix_agentd.conf
ServerActive=xxx.xxx.xxx.xxx
```

* 設定を変更した場合はZabbix Agentを再起動

```
# service zabbix-agent restart
```

## Zabbixサーバのリソース

まだ監視対象が少ないので余裕がある状態です。

* host: 10台
* 監視項目数: 4.96/秒

![zabbix-status_2015-03-31.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/62ad3c40-9f46-f5ed-2e34-6df6dcf26155.png "zabbix-status_2015-03-31.png")

![zabbix-2_20150331.png](https://qiita-image-store.s3.amazonaws.com/1163/3539/e9d9d6c8-c62d-177a-0950-81fa753f11fa.png "zabbix-2_20150331.png")