Dockerで作る開発環境:apache のヘルスチェックパスを静的ファイルに修正

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

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

今日は、dockerで構築した開発環境において、apacheのヘルスチェックパスを変更しましたので、その手順をご紹介します。

スポンサーリンク

実行環境

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

背景

dockerでのwebサービスを起動時に下記のようにヘルスチェックを行っています。

    healthcheck:
      test: "curl -f http://localhost/ || exit 1"
      start_period: 30s
      retries: 3
      timeout: 10s
      interval: 10s

http://localhost/ のパスだと、index.phpが実行されるため、phpのプロセスが動作します。httpdサービスが起動しているかどうかを確認したいため、phpの起動は不要だと思い、テキストファイルを置いて、テキストファイルのレスポンス有無でヘルスチェックをするように修正しました。

ディレクトリ構造

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

.
├── LICENSE
├── Makefile
├── README.md
└── app
    ├── apache-exporter
    ├── compose.yml (更新)
    ├── flyway
    ├── grafana
    ├── influxdb
    ├── k6
    ├── mysql
    ├── mysqld-exporter
    ├── prometheus
    ├── schemaspy
    └── web
          └── healthcheck.txt (更新)

compose.yml

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

    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/healthcheck.txt:/var/www/html/healthcheck.txt
      - ./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

下記の赤字内容でファイル(compose.yml) 63 行目を更新します。

    healthcheck:
      test: "curl -f http://localhost/healthcheck.txt || exit 1"
      start_period: 30s
      retries: 3
      timeout: 10s
      interval: 10s

web/healthcheck.txt

下記の内容で新規ファイル(web/healthcheck.txt) を作成します。

OK

動作確認

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

make setup

ブラウザで「http://localhost:8080/healthcheck.txt」にアクセスして、OKと表示されていれば成功です。

解説

apacheのヘルスチェックについて

今回はテキストファイルを追加して対応しましたが、下記のコードのようにテキストファイルを追加しなくてもできそうだと思っていたのですが、うまく機能しませんでした。もしこのあたりの知見に明るい方がいれば、教えて下さい。

<Location /healthcheck>
    SetHandler server-status
    SetEnvIf Request_URI "^/healthcheck$" healthcheck
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/healthcheck$
    RewriteRule .* - [R=200]
    Header set Health-Check-Status OK
    Header set Content-Type "text/plain"
    Header set Connection close
    Header unset Content-Length
    RewriteRule .* - [L]
</Location>

apacheのヘルスチェックに静的ファイルを利用する理由

Apacheのヘルスチェックに静的ファイルを利用する理由は下記になります。

  1. 軽量化

動的なヘルスチェックを行う場合、ApacheがPHPやPythonなどのスクリプト言語を処理するためのリソースを消費します。これに対して、静的なファイルを利用する場合は、Apacheがファイルを読み込むだけで済むため、軽量化することができます。

  1. 構成の簡素化

動的なヘルスチェックを実行するためには、Apacheの設定ファイルにスクリプト言語の設定を追加する必要があります。一方で、静的なファイルを利用する場合は、設定ファイルに追加する必要がないため、構成を簡素化することができます。

  1. 高い信頼性

静的なファイルを利用する場合、Apacheがクライアントからのリクエストに対して正常にレスポンスを返すかどうかを確認することができます。一方で、動的なヘルスチェックを利用する場合、Apache自身が正常に動作しているかどうかを確認することができず、Apacheがスクリプトを処理できない場合にも正常なレスポンスを返してしまうことがあります。静的なファイルを利用することで、Apache自身の健全性を確認することができます。

以上のように、静的なファイルを利用することで、Apacheのヘルスチェックをより軽量化し、構成を簡素化し、高い信頼性を実現することができます。

おわりに

今日は、dockerで構築した開発環境でapacheのヘルスチェックパスをphpが起動しない形に修正しました。これからも細かい修正をしていきたいと思います。

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

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

よっしー
よっしー

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

コメント

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