440 likes | 551 Views
TechStyle Onsite Seminar. Apache2 新機能とその詳細. TechStyle.jp 早川 仁 hykw@techstyle.jp cz8cb01@linux.or.jp. 目次. APR MPM Filtering Multi-Protocol. APR. 多数の OS に対応している Apache. Apache が稼動する OS 各種 UNIX Windows Netware OS/2 UnixWare ...etc. OS ごとに異なる処理が必要. ファイルを開く. Unix. OS/2. Windows.
E N D
TechStyle Onsite Seminar Apache2新機能とその詳細 TechStyle.jp早川 仁hykw@techstyle.jpcz8cb01@linux.or.jp
目次 • APR • MPM • Filtering • Multi-Protocol
多数のOSに対応しているApache • Apacheが稼動するOS • 各種UNIX • Windows • Netware • OS/2 • UnixWare • ...etc... OSごとに異なる処理が必要 ファイルを開く Unix OS/2 Windows 多数のOS依存ルーチン
Apache1.3.xのOS依存部分 • ひとつの関数に依存部分が混在 関数名() { 共通処理 Windows? Windows依存処理 それ以外のOS その他OSの処理 共通処理 } →対応OSが増えていくと収拾がつかなくなる
APRとは • APR = Apache Portable Run-time • OSを仮想化してくれるライブラリ Apache ファイルを開く APR API Windows 共通 Unix APR
APR関数例 • apr_file_open()の場合 UNIX Windows apr_file_open() { ・ ・ ・ open() ・ ・ } apr_file_open() { ・ ・ Unicode系のOS?(CE/NT/2000/XP) ファイル名をUTF-8->UCS-2に変換 CreateFileW() それ以外 CreateFileA() ・ ・ }
APRの提供機能 • APR core ・・・・・・ OS依存部分 • ファイルの読み書き • 文字コード変換 • メモリ関係の処理 • ...など • APR util ・・・・・・共通処理 • URI関係 • DBMの操作 • XMLの操作 • hook関係 • BASE64の処理 • 暗号化(SHA1)
APRを利用する利点 • OS依存処理を考慮しなくてもよくなる • OSに実装されていない機能をAPRが吸収 • モジュールからOS依存部分を無くせる • 他のOSへの移植・対応が容易 • Apache2.0 • Subversion • mod_webapp(Tomcat connector) • Flood
bash free プロセスとは • 実行中のプログラムを抽象化したもの • コンテキストと言うこともある $ free freeをfork
プロセスABCD → 時間 プロセスのスケジューリング • 1CPUは同時に一つのプロセスしか実行できない 一定時間ごとに切り替えを行い、同時に実行されてるようにみせる
プロセスの状態遷移 • 「実行可能」なプロセス以外はスケジューリングの対象とならない 実行中 ブロッキング 実行可能 $ cat foo | grep hogehoge
プロセスABCD → 時間 プロセスのスケジューリング(改) • IO待ち(ブロッキング)プロセスはスケジューリングされない。 バランスよく動作できれば、CPU使用率が100%に近づく
プロセス 使用メモリアドレス tty カレントディレクトリ 親プロセス ルートディレクトリ ...など プロセスの中身 →動作によっては複数プロセス間で (不要にもかかわらず)同一の内容を持つことになる
使用メモリアドレス tty カレントディレクトリ 親プロセス ルートディレクトリ ...など スレッドとは プロセス 共有 スレッド スレッド スレッド 1つのスレッドがおかしくなった場合、他のスレッドもその影響をうける
Apache1.3.xのリクエスト処理 親プロセスは子プロセスの作成(fork)とリクエストの転送だけ 親プロセス 子 子 子 1リクエストを1プロセスが処理 →同時に100リクエストを処理するには100プロセスが必要となる →プロセスのfork時間も考慮する必要がある
MPMとは • MPM=Multi-Processing Modules • リクエスト処理のコア部分の総称 • リクエストのディスパッチ • リクエストの処理 • 特定プラットフォーム用に最適化
ApacheとMPM Apacheコア MPM NT用MPM スレッド対応MPM 従来型MPM →MPMはconfigure時に選択
MPMの種類 • winnt • prefork • perchild(2.0.36から公式にexperimentalに落ちた) • worker • threadedやpthreadと呼ばれていたこともある • leader(experimental) 2.0.36で新登場 • threadpool(experimental) 2.0.36で新登場
親プロセス 子プロセス スレッド スレッド スレッド mpm_winnt • NT専用MPM • リクエストはスレッドが処理 • 負荷に応じ、スレッドが増減 • At this time, support for Windows 95, 98 and ME is incomplete. Apache 2.0 is not expected to work on those platforms at this time
親プロセス 子プロセス 子プロセス 子プロセス mpm_prefork • 従来型MPM • リクエストはプロセスで処理 • 負荷に応じ、プロセスが増減 • プロセスが死んでも影響を受けるのはそのコネクションだけ
子プロセス 子プロセス スレッド スレッド スレッド スレッド スレッド スレッド mpm_perchild(experimental) • スレッド型MPM • リクエストはスレッドが処理 • 負荷に応じ、スレッドが増減(プロセス数固定) • 子プロセスごとに異なるUIDを設定可能Apache 2.0 is a production release, but the Perchild MPM isn't. It was decided a while ago that Perchild wouldn't hold up a production release. 親プロセス
子プロセス 子プロセス スレッド スレッド スレッド スレッド スレッド スレッド mpm_worker • ハイブリット型MPM • リクエストはスレッドが処理 • 負荷に応じ、プロセスが増減(スレッド数固定) 親プロセス
prefork(1.3.24も同様) StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 150MaxRequestsPerChild 0 perchild NumServers 5StartThreads 5MinSpareThreads 5MaxSpareThreads 10MaxThreadsPerChild 20MaxRequestsPerChild 0 worker StartServers 5MaxClients 150MinSpareThreads 25MaxSpareThreads 75ThreadsPerChild 25MaxRequestsPerChild 0 デフォルト設定値と測定方法 ■設定値 ■測定方法 $ ./apachectl stop; sleep 3; ./apachectl start$ ab –n 1000 –c 10(50/500/1000) http://localhost:10080/ ■マシンスペック CPU: PentiumIII 1.0GHzMemory: 512MBIDE: 17GB (IBM IC35L020AVER07-0) Debian woody(Kernel 2.2.19)
1.3.24 2.0.35 X=10, Y=3 50.07KB/s 370.0KB/s X=1000, Y=10 52.19KB/s 342.01KB/s WindowsNTの場合 • ab がないため、ネットワーク経由で測定 $ ab –n X –c Y http://IPアドレス/
prefork(1.3.24も同様) StartServers 5MinSpareServers 5MaxSpareServers 10MaxClients 100MaxRequestsPerChild 0 perchild NumServers 5StartThreads 1MinSpareThreads 1MaxSpareThreads 10MaxThreadsPerChild 20MaxRequestsPerChild 0 worker StartServers 5MaxClients 50MinSpareThreads 1MaxSpareThreads 10ThreadsPerChild 2MaxRequestsPerChild 0 変更後の設定値 ■設定値
Output Filter Output Filter reply フィルタとは • 入出力ストリームを変換するもの Input Filter Input Filter Apache core request →入力/出力データの変換が可能になる
フィルタ対応のモジュール(の一部) • mod_include • mod_cgi • mod_ext_filter(experimental) • mod_echo(サンプル)
Output Filter mod_include reply Output Filter mod_include/mod_cgi mod_cgiもほぼ同様 mod_cgi Output Filter
mod_ext_filter(experimental) Output Filter mod_ext_filter 外部プロセス reply Output Filter 外部プロセスとの通信はstdin/stdoutを利用 →cat/sort/gzip/シェルスクリプト/...etc.外部プロセスのforkによる時間やメモリなどのコストが問題にならない状況であれば非常に便利
フィルタの組み合わせ Output Filter mod_ext_filter mod_include Output Filter
mod_echo(サンプル) Input Filter mod_echo Output Filter ProtocolEcho On Input Filterからの入力をOutput Filterに出力するだけ →Multi-protocolの例にはならない
携帯 各Web サーバ フィルタによるWAP対応の実現 携帯 WAPG/W キャリアのネットワーク Input Filter mod_wap mod_proxy Output Filter → HTTP の延長のプロトコルはフィルタだけで実現可能
ブラウザ Web サーバ クライアント POP3サーバ Multi-ptorocol対応時の問題点 • HTTPはステートレス • POP3/FTPなどはステート情報の管理が必要 GET / HTTP/1.0 <!DOCTYPE HTML PUBLIC..... USER hoge +OK User name... PASS ****** +OK Mailbox open...
管理構造 server_rec ServerRootなど 1.3.x conn_rec リモートのIPやポート番号など request_rec メソッド、ステータス、ユーザ名など server_rec conn_rec 2.0.x state_rec 「認証前」「認証後」などの状態 request_rec 実際にはrequest_recが包含 → 実装例は httpd-pop3 を参照
アプリケーションの対応状況 • php4.2.0 • experimental(とりあえず動く) • sapi_apache2.c(php_input_filter/php_output_filter) • modperl-2.0_20020507103951.tar.gz • experimental(とりあえず動く) • modperl_filter.c(modperl_input_*/ modperl_output_*) • perchildやworkerだと動かない • cannot use threaded MPM without ithreads enabled Perl
Resources • Writing Filters for Apache 2.0 http://www.onlamp.com/lpt/a//apache/2001/08/23/apache_2.html • Writing Apache 2.0 Output Filters http://www.onlamp.com/lpt/a//apache/2001/09/13/apache_2.html • Writing Input Filters for Apache 2.0 http://www.onlamp.com/lpt/a//apache/2001/09/20/apache_2.html • Writing Filters for Apache 2.0 http://www.ntrnet.net/~rbb/presentation/preso/filters/index.htm • httpd_pop3 http://cvs.apache.org/viewcvs.cgi/httpd-pop3/