ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

Apache HTTPサーバーの同時接続数の設定について(Windows)

今回はApache HTTPサーバーの同時接続数の設定を確認していきたいと思います。動作環境としては、WindowsにインストールしたApache HTTPサーバーを対象とします。Webで検索してもWindowsにおけるApacheの設定について示した情報がとても少なく、何が正しいのかを判断するのに苦労しました。ですので、同じような境遇の方がいればお読みいただければ少しは助けになるかもしれません。よければ最後までお付き合いください!

動作環境

今回の確認で使用した動作環境は以下の通りです。
・OS
AWS EC2でWindows Serverを無料利用枠でサクッと立てています。Window Server 2019 Datacenterエディションです。
Apache
Apacheのバージョンは、Apache 2.4.46です。

MPM(マルチプロセッシングモジュール)とは

同時接続数の設定に入る前に前提知識として必要なことをおさらいしたいと思います。Apacheは様々な機能をモジュールとして管理しています。その中で最も重要なモジュールがMPMです。MPM(マルチプロセッシングモジュール)とは、プラットフォーム(WindowsLinux)ごとに最適化された基本的な機能(リクエスト受付する、受付したリクエストを子プロセスやスレッドに割り当てるなど)を備えたモジュールのことです。MPMはいくつか種類があり、その中から一つを選択することができます。ただし、WindowsApacheをインストールする場合はWindows向けに最適化された「winNT」と呼ばれるものが基本的には使用されます。Apacheの再ビルド、インストール作業をすれば、Windowsでも他のMPMが使用可能なのかもしれませんがそこはよくわかりません・・・。
他の代表的なMPMとしては、prefork、worker、eventなどがあります。今回は、Windows ServerにインストールしたApacheですのでMPMは「winNT」という前提で話を進めていきます。

因みに、現在インストールされているMPMを確認する場合は以下のようなコマンドを実行します。
Server MPMのところに「WinNT」と記載されているのが確認できます。ここを見て判定します。

httpd.exe -V ・・・ vは大文字です
f:id:mr_star:20201007232908p:plain
Apache MPMの確認1

簡単にMPMのおさらいをしました。Apacheの同時接続数の設定変更をする場合は、現在自分が使う予定もしくは使っているApacheのMPMを把握しておく必要があります。なぜならば、Apacheの同時接続数などのコア機能の設定内容はMPMごとに設定可能な項目(値)が異なるからです。私は以前、MPMなどの概念を知らずに闇雲にWebで検索していたりしていたのですが、結局のところ似たような設定項目がたくさんあり、結局何を設定すれば良いのか分からずにいました・・・

同時接続数の設定とは?

それでは今回の記事の本題に入りたいと思います。同時接続数の定義は、あるタイミングで同時に処理できる最大数のことです。小中規模な環境ではあまり意識しなくても良いかもしれませんが、大規模な環境では設定の変更が必要になることがあります。

それでは、実際の設定項目について確認してみましょう。実はMPM「WinNT」で必要な同時接続数に関連する設定は以下の一つのみです。他のMPMでは、最低起動するスレッド数とか他にも同時接続数に関連しそうな設定項目がたくさんありますが、「WinNT」ではシンプルです。ですが、ここは少し自信がないので誤っていればご指摘いただけると幸いです。。

  • ThreadsPerChild

本設定を行うことで、Apache「winNT」での同時接続数(同時に処理できる最大スレッド数)の値を変更できます。「winNT」ではマルチスレッドで動作するようになっているため、マルチプロセスで動作するようなpreforkなどを使用しているときよりはこの項目を大きな値で設定する必要があるそうです。デフォルトでは64が定義されるため、とくに何もしていなければ64になっていると思います。

また、現在何の値が設定されているかはApacheのログファイルを見て確認することができます。ログファイルは、「${Apacheインストールディレクトリ}\logs\error.log」です。私の環境では以下のようなログメッセージが出力されていました。Apache起動時に、子プロセスが64個のスレッドを起動したことがわかります。

[Wed Oct 07 23:24:37.442910 2020] [mpm_winnt:notice] [pid 2324:tid 700] AH00354: Child: Starting 64 worker threads.

同時接続数の変更をしてみよう!

それでは同時接続数の設定項目や概要が分かったところで、実際に設定をしてみましょう。設定方法は簡単です。
以下の書式で「httpd.conf(Apacheのメイン設定ファイル)」に追記するだけです。

ThreadsPerChild <同時接続数>

たとえば、同時接続数を"100"に変更したい場合は以下のように記載します。設定内容を保存したら、設定内容を反映するためにApacheを再起動しましょう。
再度、Apacheのログファイルを確認すると変更した値で子プロセスがスレッドを起動したことが確認できるはずです。

ThreadsPerChild 100

おわりに

今回はWindowsでインストールしたApacheの同時接続数の設定について見ていきました。途中でも話をしましたが、Apacheではこの同時接続数に関連するような設定項目がいくつかあるのでどれを設定すればよいか悩んでしまうと思いますが、Windowsだととてもシンプルです。

因みに、ある設定項目がどのMPMで使用できるのかはApacheの公式ページの設定情報を確認すればわかります。たとえば以下キャプチャは、ThreadsPerChildですがModule欄に設定可能なMPMの種類が表示されています。このケースでは「worker」、「event」、「mpm_winnt」がThreadsPerChildを設定できるMPMです。ここに表示されていないMPMを使用している場合は、その設定を使用できないということです。

mpm_common - Apache HTTP Server Version 2.4

f:id:mr_star:20201008003835p:plain
Apache公式ページ1

参考

以下はApacheの公式サイトです。日本語でも閲覧可能ですが、可能であれば英語で閲覧したほうが良いです。なぜなら、設定項目によっては日本語だと翻訳が不十分ですべての情報が記載されていません。。。
Apache HTTP サーバ バージョン 2.4 ドキュメント - Apache HTTP サーバ バージョン 2.4