目次
■クラウド&インフラストラクチャ
2019.06.27 2024.02.20 約3分
本連載では、主にインターネット基盤技術、または、インターネットのインフラ技術と呼ばれる領域に関して執筆していきます。 第3回では第2回に続いて古くからあるWebホスティングサービス、または、レンタルサーバと呼ばれるサービスにおいて、Webサーバの観点からどのような技術的取り組みがなされてきたかを動的コンテンツの種類やリソース制御、代表的なWebサーバであるApache httpdのアーキテクチャの基礎概念を解説しながら紹介します。
連載一覧:まつもとりーのインフラ入門
第2回では、Webサーバのマルチテナントアーキテクチャがどういうもので、どういう背景から設計されてきたのかや、マルチテナントアーキテクチャにおいて、収容率やセキュリティなどの観点からWebサーバとWebホスティングシステムの隔離・仮想化に関する分類を述べました。引き続き、WebサーバとWebホスティングシステムに関する基礎概念について解説します。
改めて、第2回で説明した、Webホスティングシステムを構築する場合の、Webサーバの隔離・仮想化の種類について再掲します。
1. XenやVMware等の仮想マシンでホストを分ける手法
2. FreeBSD jailやLXC、OpenVZ等のコンテナ型仮想化のようにファイルシステムや名前空間を操作するシステムコールによってOS上に複数の仮想的な隔離環境を用意しホストを分ける手法
3. IPアドレスやポート単位でWebコンテンツが配置された複数のホストを分離し各ホストに個別のプロセスを用意して起動させる手法
4. 単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法
Webホスティングサービスのように高集積マルチテナントアーキテクチャにおいて、Webサーバにおける動的コンテンツの実行方式には、Webサーバプロセスにインタプリタを組み込み、Webサーバプロセス内部で直接プログラムを実行するDynamic Shared Object(DSO)実行方式と、新たに別のプロセスをfork()システムコールにより生成して、そのプロセスでexecve()システムコールによりプログラムを実行するCommon Gateway Interface(CGI)実行方式があります。
基本的に、実行方式にかかわらず、権限分離機能を利用しない場合、動的コンテンツはWebサーバプロセスと同様のオーナで実行されます。
特に、第2回の隔離・仮想化の分類について述べた、「(4)単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法」を権限分離機能を利用せずに採用すると、全てのホストのコンテンツが同一のオーナで実行されるため、他のホストのパスワードが書かれたファイルの閲覧が可能になるなど、セキュリティ上の問題が生じます。
そのため、各動的コンテンツ実行方式に応じて、権限を分離するための手法が数多く提案されてきました。 セキュリティ上の課題については、連載のセキュリティのエントリで詳しく言及しますので、ここでは基礎概念にとどめます。
高集積マルチテナントアーキテクチャのように単一のサーバで沢山のホストを管理する場合、セキュリティを担保するための権限分離を考慮しながら、複数のホストでサーバのハードウェアリソースを共有する構成が一般的です。
第2回のWebホスティングシステムの構成で述べた分類において、「(1)XenやVMware等の仮想マシンでホストを分ける手法」の、ホストそれぞれに対して、個別の仮想マシンを割り当てる構成では、仮想マシンレベルでのリソース分離機構により、特定のホストにアクセスが集中しても他のホストへの影響が及ばないような設定が可能です。
しかし、単一のサーバに複数の仮想マシンを収容するには、ホスト単位でのリソース使用量が多くなり、限られたリソースで、高集積にホストを収容するには不向きです。
「(2)FreeBSD jailやLXC、OpenVZ等のコンテナ型仮想化のようにファイルシステムや名前空間を操作するシステムコールによってOS上に複数の仮想的な隔離環境を用意しホストを分ける手法」や「(3)IPアドレスやポート単位でWebコンテンツが配置された複数のホストを分離し各ホストに個別のプロセスを用意して起動させる手法」の手法では、ホスト単位でchroot()システムコールによるファイルシステムの隔離やプロセスリソース管理技術を組み合わせたコンテナ環境を構築し、その環境毎にサーバプロセスを起動させます。
ホスト単位のリソース分離に、仮想ホスト方式では利用できない設定や、プロセス単位でのリソース制限や隔離機能を利用することができます。 しかし、プロセス数がホスト数に依存し、収容数が搭載メモリ容量により制約されるため、これらも高集積にはむいていません。
「(4)単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法」のように、単一のサーバプロセス群で複数のホストを管理するアーキテクチャの場合、サーバプロセスがホスト数に依存しないため、(1)から(4)の分類においては、最も高集積が可能です。
しかし、(4)の方式では、単一のサーバプロセス群で複数のホストを処理しているため、特定のホストやリクエスト処理がリソースを占有した場合に、他のホストやリクエスト処理が影響を受けやすいという問題があります。
Apache httpdは、世界で最もシェアの高いWebサーバソフトウェアです(以下Apacheとする)。
高集積マルチテナントの運用では、Apacheはリクエストを処理するための子プロセスをサーバプロセス起動時に複数起動させておき、1リクエストに対して1つの子プロセスを専有してレスポンス生成を行うモデルを基本とします。 そのため、このモデルの場合、Webサーバに対する同時接続数の上限は子プロセスの起動数に依存することになります。
VirtualHostは、Apacheで仮想ホスト方式による高集積マルチテナントを実現する際、収容ホスト数にサーバプロセス数が依存しないようにするための機能です。 VirtualHostは、上述した(4)の手法により、単一のサーバプロセス群で複数のホストに対するリクエストを処理します。 そのため、ホストの収容数を増加させたとしても、子プロセスの数を増やす必要がないため、コンピュータリソースを効率よく利用することができます。
VirtualHostでは、Apacheのオーナとは別のオーナで動的コンテンツを実行する仕組みであるsuEXECを使って権限分離を行う場合、ホスト単位で一意の設定が必要になります。 suEXECについても、今後の連載のセキュリティの回で詳しく説明します。 そのため、VirtualHostで管理するホスト数が増えるにつれ設定数は増加し、Apache起動時のメモリ使用量も増加します。
Apacheのサーバ機能の拡張には、Apacheモジュールというプラグイン機構が用いられています。 以下の図は、Apacheのコアとモジュールの概要図を示しています。
ApacheのコアとApacheモジュールの連携は、Apache独自のAPIを介して実現されています。 モジュールは、コアに近い実装からWebアプリケーションに近い実装まで、様々な領域での拡張が可能となっています。 一般的なWebサーバソフトウェアと同様、Apacheモジュールによる機能拡張は高速性と省メモリを考慮してC言語で実装する仕様になっています。
今回は高集積マルチテナントアーキテクチャを採用したWebサーバにおいて、動的コンテンツの種類やリソース制御、代表的なWebサーバであるApache httpdのアーキテクチャについて紹介しました。次回は、これらの基礎概念をもとにどのようにホスト間でリソース分離を行うかについて述べていきたいと思います。
本連載は下記の私が執筆した論文を参考に、新しい読者へ広めるために平易な形へと再編集しています。
・ 松本 亮介, 栗林 健太郎, 岡部 寿男, Webサーバの高集積マルチテナントアーキテクチャと運用技術, 電子情報通信学会論文誌B, Vol.J101-B, No.1, pp.16-30, Jan 2018.
・ copyright©2018 IEICE
(記事:松本 亮介)