エンジニアの生き様をウォッチするメディア

まつもとりーのインフラ入門-第三回 「WebサーバとWebホスティングシステム(2)」

みなさん、こんにちは。まつもとりーのインフラ入門第三回です。 本連載では、主にインターネット基盤技術、または、インターネットのインフラ技術と呼ばれる領域に関して執筆していくと第一回で述べました。 そこで、第三回では第二回に続き、古くからあるWebホスティングサービス、または、レンタルサーバと呼ばれるサービスにおいて、Webサーバの観点からどのような技術的取り組みがなされてきたかについて、動的コンテンツの種類やリソース制御、代表的なWebサーバであるApache httpdのアーキテクチャの基礎概念を解説しながら紹介します。

WebサーバとWebホスティングシステムの基礎の続き

第二回では、Webサーバのマルチテナントアーキテクチャがどういうもので、どういう背景から設計されてきたのかについてや、マルチテナントアーキテクチャにおいて、収容率やセキュリティなどの観点からWebサーバとWebホスティングシステムの隔離・仮想化に関する分類を述べました。引き続き、WebサーバとWebホスティングシステムに関する基礎概念について解説します。

改めて、第二回で説明した、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サーバプロセスと同様のオーナで実行されます。 特に、第二回の隔離・仮想化の分類について述べた、「(4)単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法」を権限分離機能を利用せずに採用すると、全てのホストのコンテンツが同一のオーナで実行されるため、他のホストのパスワードが書かれたファイルの閲覧が可能になるなど、セキュリティ上の問題が生じます。 そのため、各動的コンテンツ実行方式に応じて、権限を分離するための手法が数多く提案されてきました。 セキュリティ上の課題については、連載のセキュリティのエントリで詳しく言及しますので、ここでは基礎概念にとどめます。

Webサーバのリソース分離手法の分類

高集積マルチテナントアーキテクチャのように単一のサーバで沢山のホストを管理する場合、セキュリティを担保するための権限分離を考慮しながら、複数のホストでサーバのハードウェアリソースを共有する構成が一般的です。 第二回のWebホスティングシステムの構成で述べた分類において、「(1)XenやVMware等の仮想マシンでホストを分ける手法」の、ホストそれぞれに対して、個別の仮想マシンを割り当てる構成では、仮想マシンレベルでのリソース分離機構により、特定のホストにアクセスが集中しても他のホストへの影響が及ばないような設定が可能です。 しかし、単一のサーバに複数の仮想マシンを収容するには、ホスト単位でのリソース使用量が多くなり、限られたリソースで、高集積にホストを収容するには不向きです。

「(2)FreeBSD jailやLXC、OpenVZ等のコンテナ型仮想化のようにファイルシステムや名前空間を操作するシステムコールによってOS上に複数の仮想的な隔離環境を用意しホストを分ける手法」や「(3)IPアドレスやポート単位でWebコンテンツが配置された複数のホストを分離し各ホストに個別のプロセスを用意して起動させる手法」の手法では、ホスト単位でchroot()システムコールによるファイルシステムの隔離やプロセスリソース管理技術を組み合わせたコンテナ環境を構築し、その環境毎にサーバプロセスを起動させます。 ホスト単位のリソース分離に、仮想ホスト方式では利用できない設定や、プロセス単位でのリソース制限や隔離機能を利用することができます。 しかし、プロセス数がホスト数に依存し、収容数が搭載メモリ容量により制約されるため、これらも高集積にはむいていません。

「(4)単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法」のように、単一のサーバプロセス群で複数のホストを管理するアーキテクチャの場合、サーバプロセスがホスト数に依存しないため、(1)から(4)の分類においては、最も高集積が可能です。 しかし、(4)の方式では、単一のサーバプロセス群で複数のホストを処理しているため、特定のホストやリクエスト処理がリソースを占有した場合に、他のホストやリクエスト処理が影響を受けやすいという問題があります。

Apache httpdのアーキテクチャ

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のアーキテクチャについて紹介しました。次回は、これらの基礎概念をもとにどのようにホスト間でリソース分離を行うかについて述べていきたいと思います。

(記事:松本 亮介)

京都大学博士(情報学)、さくらインターネット研究所上級研究員、ペパボ研究所客員研究員、Forkwell技術顧問、セキュリティ・キャンプ講師、情報処理学会各種委員、松本亮介事務所所長。

2008年に現場の技術を知るため修士に行かずにホスティング系企業に就職したのち、2012年に異例の修士飛ばしで京都大学大学院の博士課程に入学。インターネット基盤技術の研究に取り組み、mod_mrubyやngx_mrubyなどのOSSを始めとした多数のOSSへの貢献や学術的成果を修める。

2015年4月より2018年10月までGMOペパボ株式会社にてチーフエンジニアとしてプロダクトのアーキテクトやエンジニア組織のマネージメントに従事すると同時に、ペパボ研究所では主席研究員としてOS・Middleware・HTTPに関する研究、及び、事業で実践できるレベルまで作りこむことを目標に研究に従事。

2018年11月より現職のさくらインターネット研究所で上級研究員を務める。

第9回日本OSS奨励賞や2014年度情報処理学会山下記念研究賞など、その他受賞多数。2016年に情報処理学会IPSJ-ONEにおいて時流に乗る日本の若手トップ研究者19名に選出される。