こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、nginx-exporterを導入した手順をご紹介します。
実行環境
この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。
ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。
背景
nginx-prometheus-exporterは、NginxのWebサーバーからメトリクスを収集し、Prometheusのメトリクス収集機能と統合するためのツールです。
Nginxは、HTTPリクエストを処理するための非常に人気のあるWebサーバーであり、リバースプロキシ、ロードバランシング、コンテンツ配信などの機能を提供しています。nginx-prometheus-exporterを使用することで、Nginxサーバーの稼働状況を監視し、可視化することができます。Nginxサーバーの可用性を向上させるために、nginx-prometheus-exporterを導入することをお勧めします。
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。
.
├── LICENSE
├── Makefile
├── README.md
└── app
├── apache-exporter
├── compose.yml
├── flyway
├── grafana
│ ├── dashboard.yml
│ └── dashboards
│ └── nginx.json
├── influxdb
├── k6
├── memcached
├── memcached-exporter
├── nginx
│ └── default.conf
├── nginx-exporter
│ └── Dockerfile
├── php-fpm
├── php-fpm-exporter
├── mongo
├── mysql
├── mysqld-exporter
├── prometheus
│ └── prometheus.yml
├── schemaspy
├── web
└── xhgui
compose.yml
下記の内容をファイル(compose.yml) 225-236 行目に追加します。
nginx-exporter:
build: ./nginx-exporter
container_name: nginx-exporter
ports:
- "9113:9113"
restart: unless-stopped
entrypoint: nginx-prometheus-exporter -nginx.scrape-uri=http://nginx/nginx_status
networks:
- net
depends_on:
- nginx
nginx/default.conf
下記の内容をファイル(nginx/default.conf) 15-23行目に追記します。
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 172.18.0.0/16; # This is my local docker IP range
allow 192.168.0.0/16; # This is my production server IP range
deny all;
}
nginx-exporter/Dockerfile
下記の内容でファイル(nginx-exporter/Dockerfile) を更新します。
FROM nginx/nginx-prometheus-exporter:0.10.0
prometheus/prometheus.yml
下記の赤字内容でファイル(prometheus/prometheus.yml) を更新します。
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'docker-for-mac'
static_configs:
- targets: ['docker.for.mac.host.internal:9323']
- job_name: 'apache'
static_configs:
- targets: ['apache-exporter:9117']
- job_name: 'php-fpm'
static_configs:
- targets: ['php-fpm-exporter:9253']
- job_name: 'nginx'
static_configs:
- targets: ['nginx-exporter:9113']
- job_name: 'memcached'
static_configs:
- targets: ['memcached-exporter:9150']
- job_name: 'mysql'
static_configs:
- targets: ['mysqld-exporter:9104']
grafana/dashboard.yml
下記の赤字内容をファイル(grafana/dashboard.yml) 26-36行目に追記します。
- name: 'nginx'
orgId: 1
folder: 'Service'
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards/nginx.json
foldersFromFilesStructure: false
grafana/dashboards/nginx.json
jsonファイルは行数が多いので、ここでの掲載は割愛します。
作成方法は、grafanaのdashboardで12708をインポートして、JSON出力したものになります。詳細は、GitHUBのコードをご参照ください。
動作確認
下記のコマンドを実行して、サービスを起動します。
make setup
ブラウザで「http://localhost:3000/dashboards」にアクセスして、nginxのダッシュボードが表示されていて、ダッシュボードを開いたときに、メトリクス情報が取得できていれば、成功です。
解説
nginx-exporterについて
Nginx Prometheus Exporterは、Nginxの各種メトリクスをPrometheus形式でエクスポートすることができます。主なメトリクスは以下の通りです。
- nginx_connections_accepted_total: コネクションの受け入れ数
- nginx_connections_active: アクティブなコネクション数
- nginx_connections_handled_total: コネクションの処理数
- nginx_connections_reading: 読み込み中のコネクション数
- nginx_connections_waiting: 待機中のコネクション数
- nginx_connections_writing: 書き込み中のコネクション数
- nginx_http_requests_total: HTTPリクエスト数
- nginx_http_status_total: HTTPステータスコードの数
- nginx_upstream_failures_total: upstreamの失敗数
- nginx_upstream_health_checks_checks_total: health checkの実行回数
- nginx_upstream_health_checks_fails_total: health checkの失敗回数
- nginx_upstream_health_checks_unhealthy_total: unhealthyなupstreamの数
- nginx_upstream_requests_total: upstreamへのリクエスト数
- nginx_upstream_response_time_seconds: upstreamのレスポンスタイム
- nginx_upstream_responses_total: upstreamからのレスポンス数
- nginx_upstream_weight: upstreamの重み
- nginx_worker_processes: Nginxのワーカープロセス数
- nginx_connections_dropped_total: ドロップされた接続の数
上記の他にも、Nginxのキャッシュに関するメトリクスや、SSL/TLSに関するメトリクスもエクスポートすることができます。また、Nginxの設定ファイルによっては、エクスポートされるメトリクスが異なる場合があります。
おわりに
今日は、dockerで構築した開発環境にnginx-exporterを導入し、grafanaでメトリクス情報を可視化しました。ぜひ、性能改善等に使用してみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。
また明日お会いしましょう!
コメント