GCEで作成したnginxのDockerコンテナをCloud Monitoringで監視する

# はじめに

- 業務でGCEのVMを使って、nginxのリバースプロキシを作成する必要がありましたので、その際のCloud Monitoringの設定方法を説明したものになります。
- Stackdriver公式からnginxのモニタリング用プラグインが提供されており、本記事ではそれを使用しています。
- 以下の公式ドキュメントはVMに直接nginxをインストールするやり方を説明しているのですが、本記事ではDockerコンテナでnginxを作成する際の設定方法になります。

[Nginx プラグイン](https://cloud.google.com/monitoring/agent/plugins/nginx?hl=ja)

# GCP環境

今回検証した環境は以下になります。同様な環境を構築しておく・VMにSSHログインできることが前提です。

- GCE VM N1 n1-standard-1 CentOS7 
- Docker version 20.10.3
- ゾーン：asia-northeast1-b
- 外部IPがあることも前提です（内部IPのみは検証していません）

# Cloud MonitoringのエージェントをVMにインストールする

以下の記事に従って、Cloud MonitoringのエージェントをVMにインストールします。

[単一の VM に Cloud Monitoring エージェントをインストールする](https://cloud.google.com/monitoring/agent/installation?hl=ja)


- エージェントのパッケージ リポジトリを追加します。

```bash
curl -sSO https://dl.google.com/cloudagents/add-monitoring-agent-repo.sh
sudo bash add-monitoring-agent-repo.sh
```

- エージェントのバージョン一覧を確認します。

```bash
sudo yum list --showduplicates stackdriver-agent
```

- 今回は6.1.1のバージョンのエージェントをインストールしました。

```bash
sudo yum install -y stackdriver-agent-6.1.1
```

- エージェント サービスを開始します

```bash
sudo service stackdriver-agent start
```

- エージェントが期待どおりに動作していることを確認します

```bash
sudo service stackdriver-agent status
```

```
stackdriver-agent is running                               [  OK  ]
```

- 正常にエージェントのインストールが終了すると、Monitoring > ダッシュボード画面でMonitoringエージェントのステータスが緑色であるのを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156927/f8c78139-d9bb-28d5-b690-72aa6afb1efa.png)


# Nginxモニタリングプラグインを有効にする

以下の記事に従って、Nginxのモニタリング用のプラグインをインストールします。ApacheやMySQLなどのそのほかのプラグインもあるようです。

https://cloud.google.com/monitoring/agent/plugins/nginx?hl=ja

- Nginx のステータス情報ハンドラを有効にする必要があります。まずは、以下からファイル`status.conf`を取得する。

```bash
curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/nginx/conf.d/status.conf
```

```status.conf
server {
    listen 80;
    server_name local-stackdriver-agent.stackdriver.com;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
    location / {
        root /dev/null;
    }
}
```

- 以下のような`default.conf`ファイルを用意し、上でダウンロードしてきた`status.conf`の情報を記載します
    - VMにインストールされたエージェントがDockerコンテナ内のNginxのステータスを取得できるように、`location /nginx_status`のallowにVMの内部IPを記載します。

```default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow xxx.xxx.xxx.xxx;  #　←VMの内部IPを記載する 
        deny all;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

- NginxのDockerコンテナを以下のコマンドで起動します。
    - 今回、`--network="host"`を指定して起動することで、ホストのネットワークを利用するようにコンテナを作成しています。こうすることで、VMのMonitoringエージェントが、VMの内部IPを指定し、`http://VM内部IP:80/nginx_status`と通信できるようにしました。

```bash
sudo docker run --name nginx-server \
-v $PWD/default.conf:/etc/nginx/conf.d/default.conf \
-d --network="host" nginx
```

- curlコマンドでnginxのステータス情報を取得してみます。

```bash
curl http://VMの内部IP/nginx_status
```

- 以下のようなステータス情報が取得できます。

```
Active connections: 2
server accepts handled requests
 5 5 14
Reading: 0 Writing: 1 Waiting: 1
```

- nginxのモニタリングプラグインの設定ファイルを取得します。

```bash
(cd /etc/stackdriver/collectd.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/collectd.d/nginx.conf)
```

- 取得した`nginx.conf`のファイルを以下のように書き換えます。

```bash
sudo vi /etc/stackdriver/collectd.d/nginx.conf
```

```nginx.conf
# This is the monitoring configuration for Nginx.
# Make sure to enable stub_status in your Nginx configuration.
# Look for NGINX_HOST and NGINX_PORT to adjust your configuration file.
LoadPlugin nginx
<Plugin "nginx">
    # When using non-standard Nginx configurations, replace the below with
    #URL "http://NGINX_HOST:NGINX_PORT/nginx_status"
    #URL "http://local-stackdriver-agent.stackdriver.com:80/nginx_status"
    URL "http://VMの内部IP:80/nginx_status"
</Plugin>
```

- モニタリングエージェントを再起動します。

```bash
sudo service stackdriver-agent restart
```

- GCPの`Monitoring > ダッシュボード > VM Instances > VM名`をクリックします。正常に設定できていると、以下のようにNGINXタブがありますので、クリックする。
    - nginxへのコネクション数やリクエスト数が確認できます。
    - [nginxのエージェント指標](https://cloud.google.com/monitoring/api/metrics_agent?hl=ja#agent-nginx)を知りたい方は、このリンクを参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156927/692bd55e-7af5-7f56-ecef-f233fde09982.png)

以上で、Cloud MonitoringでDockerコンテナ内のnginxを監視する設定は完了です。

# 参考文献

- [単一のVMにCloud Monitoring エージェントをインストールする](https://cloud.google.com/monitoring/agent/installation?hl=ja)
- [Nginxプラグイン](https://cloud.google.com/monitoring/agent/plugins/nginx?hl=ja)
- [Dockerのbridgeとhostネットワークについて勉強する](https://qiita.com/toshihirock/items/f5b9f7799ec8bf8c328e)