Dockerで作る開発環境:apache exporterを別サービスに切り出す

スポンサーリンク
Dockerで作る開発環境:apache exporterを別サービスに切り出す ノウハウ
Dockerで作る開発環境:apache exporterを別サービスに切り出す
この記事は約13分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、dockerで構築した開発環境において、apache exporterを別のサービスに切り出しましたのでその手順をご紹介します。

スポンサーリンク

実行環境

この記事では、下記の記事で構築している開発環境を前提にしていますので、環境構築をされていない方は、記事を参考に環境構築をお願いします。

背景

Apache Exporterは、PrometheusとGrafanaなどのツールを使用して、Apacheのメトリクスを収集し、可視化するためのPrometheus Exporterの一種です。一方、ApacheはWebサーバーソフトウェアであり、Webページの配信やアプリケーションの実行に使用されます。

Apache ExporterとApacheを別々のサービスとして実行することには、以下のような理由があります。

  1. メトリクス収集とWebサーバーの分離

Apache ExporterとApacheを別々のサービスとして実行することで、メトリクス収集とWebサーバーの機能を分離できます。これにより、Webサーバーの性能に影響を与える(Apache Exporter用にメモリの確保やCPUの性能を考慮する必要がないという意図)ことなく、メトリクスを収集し、分析できます。

  1. セキュリティの向上

Apache ExporterとApacheを別々のサービスとして実行することで、セキュリティを向上させることができます。Apache Exporterは、Webサーバーのネットワークトラフィックを受信する必要がないため、攻撃のリスクが低くなります。また、Apache Exporterによって収集されたメトリクスは、Apacheのログや設定ファイルなどの機密情報と分離されるため、セキュリティが向上します。

  1. 拡張性の向上

Apache ExporterとApacheを別々のサービスとして実行することで、拡張性を向上させることができます。Apache Exporterは、Prometheusとの統合が容易であり、Prometheusと組み合わせることで、Apache以外のさまざまなシステムのメトリクス収集が可能になります。

これらの理由から、Apache ExporterとApacheを別々のサービスとして実行することにしました。すでにmysqlの方でそのような対応をしているので、その構成に統一しました。

ディレクトリ構造

ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。

.
├── LICENSE
├── Makefile
├── README.md
└── app
    ├── apache-exporter (新規)
    │   └── Dockerfile (新規)
    ├── compose.yml (リネーム&更新)
    ├── flyway
    ├── grafana
    ├── influxdb
    ├── k6
    ├── mysql
    ├── mysqld-exporter
    ├── prometheus
    ├── schemaspy
    └── web (更新)
          ├── Dockerfile (更新)
          ├── server-status.conf (更新)
          └── prometheus-httpd.service (削除)

compose.yml

docker-compose.yml を compose.yml にリネームしました。

59行目の - 9117:9117 を削除します。

下記の赤字内容をファイル(compose.yml) 61 – 66 行目に追記します。

  web:
    build: ./web
    container_name: web
    platform: linux/x86_64
    privileged: true
    volumes:
      - ./web/CodeIgniter-3.1.13/application:/var/www/application
      - ./web/CodeIgniter-3.1.13/system:/var/www/system
      - ./web/index.php:/var/www/html/index.php
      - ./web/info.php:/var/www/html/info.php
      - ./web/.htaccess:/var/www/html/.htaccess
      - ./web/httpd.conf:/etc/httpd/conf/httpd.conf
      - ./web/server-status.conf:/etc/httpd/conf.d/server-status.conf
      - ./web/xhprof-html.conf:/etc/httpd/conf.modules.d/xhprof-html.conf
      - ./web/xdebug.ini:/etc/opt/remi/php74/php.d/xdebug.ini
    ports:
      - 8080:80
      - 9117:9117 (削除)
    networks:
      - net
    healthcheck:
      test: "curl -f http://localhost/ || exit 1"
      start_period: 30s
      retries: 3
      timeout: 10s
      interval: 10s

下記の赤字内容をファイル(compose.yml) 141 – 156 行目に追記します。

  apache-exporter:
    build: ./apache-exporter
    container_name: apache-exporter
    privileged: true
    ports:
      - mode: ingress
        target: 9117
        published: "9117"
        protocol: tcp
    restart: unless-stopped
    entrypoint: /bin/apache_exporter --scrape_uri="http://web/server-status?auto"
    networks:
      - net
    depends_on:
      web:
        condition: service_healthy

apache-exporter/Dockerfile

下記の内容で新規ファイル(apache-exporter/Dockerfile)を作成します。

FROM lusotycoon/apache-exporter

prometheus/prometheus.yml

下記の赤字内容でファイル(prometheus/prometheus.yml) を更新します。

global:
  scrape_interval: 15s
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: 'mysql'
    static_configs:
      - targets: ['mysqld-exporter:9104']

web/Dockerfile

ファイル(web/Dockerfile)の下記の61 – 68行目を削除します。

# apache_exporter
RUN useradd --system --shell /sbin/nologin prometheus \
 && wget https://github.com/Lusitaniae/apache_exporter/releases/download/v0.13.3/apache_exporter-0.13.3.linux-amd64.tar.gz \
 && tar xvzf apache_exporter-0.13.3.linux-amd64.tar.gz \
 && cd apache_exporter-0.13.3.linux-amd64 \
 && cp apache_exporter /usr/local/bin/
COPY ./prometheus-httpd.service /etc/systemd/system/prometheus-httpd.service
RUN systemctl enable prometheus-httpd

web/prometheus-httpd.service

ファイル(web/prometheus-httpd.service)を削除します。

web/server-status.conf

下記の赤字内容でファイル(web/server-status.conf) を更新します。


ExtendedStatus On

<Location /server-status>
    SetHandler server-status
    Require all denied
    Require host apache-exporter.app_net
</Location>

動作確認

下記のコマンドを実行して、サービスを起動します。

make setup

ブラウザで「http://localhost:3000/」にアクセスして、Grafanaにログインし、prometheusのデータソースを追加後、apache-exporter用のダッシュボードをインポートして、データが可視化できれていれば成功です。

Grafanaでのデータソースの追加とダッシュボードのインポート方法については、下記の記事を参考にしてみてください。

解説

apache-exporterの定義について

  apache-exporter:
    build: ./apache-exporter
    container_name: apache-exporter
    privileged: true
    ports:
      - mode: ingress
        target: 9117
        published: "9117"
        protocol: tcp
    restart: unless-stopped
    entrypoint: /bin/apache_exporter --scrape_uri="http://web/server-status?auto"
    networks:
      - net
    depends_on:
      web:
        condition: service_healthy

Docker ComposeでApache Exporterコンテナを下記のように定義しています。

  • build: ./apache-exporter: DockerイメージをビルドするためのDockerfileが含まれたディレクトリへのパスを指定しています。
  • container_name: apache-exporter: コンテナの名前を指定しています。
  • privileged: true: コンテナを特権モードで実行するために必要なパラメータです。
  • ports: コンテナのポートをホストマシンのポートにマッピングするためのパラメータです。ここでは、9117ポートをホストマシンの9117ポートにマッピングしています。
  • restart: unless-stopped: コンテナが停止した場合に自動的に再起動するように設定しています。
  • entrypoint: /bin/apache_exporter --scrape_uri="http://web/server-status?auto": コンテナが起動するときに実行されるコマンドを指定しています。ここでは、Apache Exporterを起動するためのコマンドを指定しています。また、--scrape_uriオプションによって、メトリクスを取得するためのApacheのURLを指定しています。
  • networks: コンテナが接続するDockerネットワークを指定しています。
  • depends_on: コンテナが起動する前に、依存する別のコンテナが健康であることを確認するためのパラメータです。ここでは、webサーバーがhealthyであることを確認しています。

exporterの分離について

Apache ExporterとApacheを別のサービスとして実行するかどうかは、いくつかのメリットとデメリットを考慮する必要があります。

別のサービスとして実行する場合のメリット

  1. セキュリティ:Apache Exporterは、Apacheのプロセスにアクセスするために必要な権限を持っています。これらの権限をApacheと同じサービスで実行すると、セキュリティ上のリスクがある可能性があります。別のサービスとして実行することで、セキュリティを向上させることができます。
  2. パフォーマンス:Apache ExporterとApacheを別のサービスとして実行すると、両方のサービスが互いに影響を与えることなく、より効率的に動作する可能性があります。Apache Exporterが大量のリクエストを処理している場合、Apacheに影響を与えることがなくなります。
  3. メンテナンス:Apache ExporterとApacheを別々のサービスとして実行すると、それぞれのサービスを個別にメンテナンスすることができます。たとえば、Apacheをアップグレードする必要がある場合、Apache Exporterに影響を与えることなく、Apacheをアップグレードすることができます。

別のサービスとして実行する場合のデメリット

  1. セットアップの複雑さ:Apache ExporterとApacheを別々のサービスとして実行する場合、それぞれのサービスを個別にセットアップする必要があります。このため、セットアップの複雑さが増す可能性があります。
  2. 監視の複雑さ:Apache ExporterとApacheを別々のサービスとして実行する場合、両方のサービスを監視する必要があります。このため、監視の複雑さが増す可能性があります。
  3. リソースの使用:Apache ExporterとApacheを別々のサービスとして実行する場合、それぞれのサービスに必要なリソースが増加する可能性があります。たとえば、別々に実行する場合、両方のサービスに必要なメモリが増加する可能性があります。

まとめ

以上を考慮すると、Apache ExporterとApacheを別々のサービスとして実行するかどうかは、実行環境によって異なります。より高度なセキュリティが必要な場合や、リソースを最適化する必要がある場合は、別々のサービスとして実行することを検討することができます。一方、シンプルな環境やセットアップを簡略化する必要がある場合は、同じサービスとして実行することを選択することができます。

ただし、どちらの場合でも、監視と管理を容易にするために、適切なログとメトリクスが設定されていることを確認する必要があります。また、パフォーマンスの観点から、Apache ExporterとApacheを同じサーバーで実行する場合、CPUやメモリなどのリソースを適切に管理する必要があります。

総じて、Apache ExporterとApacheを別々のサービスとして実行するかどうかは、環境や要件に応じて検討する必要があります。セキュリティやパフォーマンスを優先する場合は、別々のサービスとして実行することを検討することができます。しかし、シンプルな環境や管理を容易にする必要がある場合は、同じサービスとして実行することが適しているかもしれません。

おわりに

今日は、dockerで構築した開発環境でapache exporterを別サービスにした手順についてご紹介しました。dockerは1コンテナ1機能で定義していくのがよさそうなので、apacheとphpもそのうち分離したいと思います。

今回使用したファイルは下記のGitHubにタグ付けしています。

もし、質問等あればコメント頂ければ確認後、ご連絡いたしますので、ご入用の方はコメント下さい。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました