docker composeによるZabbix環境構築

備忘のため構築の要点だけまとめておく。
docker-composeの導入は前に書いた記事を参照。

https://qiita.com/kod314/items/a1e990db693f790bee80

本稿では下記2点も手順に盛り込んでいる。

- nginxによるリバースプロキシ経由アクセスのための設定
- Zabbixサーバ自身の監視設定

# インストール
```sh
# githubからzabbix-dockerをclone
$ git clone https://github.com/zabbix/zabbix-docker
$ cd zabbix-docker
# 構築したい環境のyamlファイルをdocker-compose.yamlの名称でコピーする
$ cp docker-compose_v3_centos_mysql_latest.yaml docker-compose.yaml
$ docker-compose pull
```
yamlはos,dbの組み合わせで複数用意されている。
今回はCentOSとMySQLの組み合わせで構築した。

#【重要】ipマスカレードを有効にする
これをしないとdbの通信ができないので注意。

```
$ firewall-cmd --add-masquerade --permanent
```

# WebUIのポート変更
Zabbix WebUIは、デフォルトだと80番ポートを使用するようになっている。
80番ポートは後述のリバースプロキシ用のnginxが使用するため、別のポートを割り当てる


```sh:docker-compose.yaml
-略-
zabbix-web-nginx-mysql:
 image: zabbix/zabbix-web-nginx-mysql:centos-5.4-latest
 ports:
  #- "80:8080"
  # 80番ポートはnginxで使用するため別ポートを充てる
  - "127.0.0.1:4444:8080"
  - "443:8443"
-略-
```

ポイントはホストIPをローカルに指定している点。
単純に`4444:8080`とバインドしてしまうと、外部から`http://xx.xx.xx.xx:4444`でアクセスできてしまうため、セキュリティーの観点から必要となる。

# リバースプロキシのnginx設定
`/etc/nginx/nginx.conf`にリバースプロキシの設定を入れる。
外部から`http://xx.xx.xx.xx/zabbix/`の形式でアクセスされると、nginx内部で`http://localhost:4444/`に置換される。
`location`, `proxy_pass`のパラメータは、最後に必ず`/`を入れること。

```conf:nginx.conf
location /zabbix/ {
     proxy_pass http://localhost:4444/;
}
```

設定できたらnginxを再起動する。

```sh
$ systemctl restart nginx
```

# タイムゾーンの変更
デフォルトだと時刻表記が日本時間でないため、`env_vars/.env_web`の`PHP_TZ`パラメータを下記のように修正する。

```sh:.env_web
PHP_TZ=Asia/Tokyo
```

# Zabbix起動
```sh
$ docker-compose up -d
# 起動状況のログをチェック
$ docker-compose logs -f
```
問題なく起動できたら`http://xx.xx.xx.xx/zabbix/`にアクセスしてみる。ログイン画面が出たら成功。
初期アカウントは、`Username:Admin, Password:zabbix`となる。

# Zabbix agentの導入
agentは物理サーバに直接インストールするパターンと、docker上に導入するパターンが考えられる。
ここでは前者の方法で進める。
まずエージェントのインストールを行う。

```sh
$rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
$dnf clean all
$dnf install -y zabbix-agent
```

次に`zabbix_agentd.conf`の編集を行う。このとき、コンテナ側のNWと物理サーバ側のNWの疎通が必要になることから、事前にNW構成を確認する必要がある。
まず`docker-compose.yaml`の設定を確認してみる。

```yaml:docker-compose.yaml
networks:
  zbx_net_frontend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24
  zbx_net_backend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    internal: true
    ipam:
      driver: default
      config:
      - subnet: 172.16.239.0/24
```

下記の方法でも確認できる。

```sh
$ ifconfig
br-45de546f164e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.238.1  netmask 255.255.255.0  broadcast 172.16.238.255
...

br-9cdd7d15cb48: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.239.1  netmask 255.255.255.0  broadcast 172.16.239.255
...

$ docker network ls
NETWORK ID     NAME                             DRIVER    SCOPE
8314617d0481   bridge                           bridge    local
fa78b50c61fe   host                             host      local
c087a7491bfb   none                             null      local
8d0041079d16   zabbix-docker_default            bridge    local
9cdd7d15cb48   zabbix-docker_zbx_net_backend    bridge    local
45de546f164e   zabbix-docker_zbx_net_frontend   bridge    local
```

以上のことから、物理サーバとdocker上のzabbix serverは`172.16.238.0/24(frontend)`, `172.16.239.0/24(backend)`の2つの接続があることがわかる。ここではfrontendのNWを設定する。
`/etc/zabbix/zabbix_agentd.conf`を次のように設定した。

```sh:zabbix_agentd.conf
# vi /etc/zabbix/zabbix_agentd.conf
Server=127.0.0.1,172.16.238.0/24
ServerActive=127.0.0.1
Hostname=Zabbix server
```
そしてagentを起動する。

```sh
$ systemctl enable zabbix-agent.service
$ systemctl start zabbix-agent.service
```

Zabbix serverのWebコンソール上ではホスト情報のAgent IPは`172.16.238.1`を指定する。`127.0.0.1`だと、dockerコンテナ自身を指す設定となってしまうため、うまく動作しないので注意。


# 参考
https://github.com/zabbix/zabbix-docker
https://kuroeveryday.blogspot.com/2019/03/effect-of-trailing-slash-on-nginx-reverse-proxy.html