Apache とは
HTTPプロトコルを用いて、Webブラウザから「GET」や「POST」などのリクエストを受け取り、そのリクエストにしたがって処理するサーバー
Nginx とは
高い並行性と処理性能、メモリ使用量の小ささに重点を置いて開発されたオープンソースのWebサーバ
Webサーバの接続処理のアーキテクチャ
マルチプロセスモデル
・クライアントからの接続毎に、プロセスをフォークして処理する
・フォークのコストが高いため、通常はプレフォーク(事前にフォークしておく)モデルを採用
<利点>
・メモリ空間が子プロセス毎に独立しているため、スクリプト言語などを組み込みやすい
ex.) Apache HTTP Server mod_php
<欠点>
・メモリ空間が共有できないため、プロセス間の情報共有が難しい
・同時接続数が増えると、その分だけ子プロセスも増える
→ メモリを大量消費
→ コンテキストスイッチのオーバーヘッドが大きくなる
※ コンテキストスイッチ・・・複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト (情報工学))を保存したり復元したりする過程のこと
マルチスレッドモデル
・クライアントからの接続毎にスレッドを生成して処理する
・バリエーションとしてマルチプロセスとマルチスレッドのハイブリッドモデルもある
ex.) Apache HTTP Server - MPM worker
<利点>
・メモリ空間が各スレッドの間を共有できる
・マルチプロセスモデルに比べると、メモリ消費量やコンテキストスイッチのオーバーヘッドが小さい
<欠点>
・メモリ空間を共有しているため、スクリプト言語を組み込めないことがある
→ なぜ?
・同時接続数が増えると、その分だけスレッド数も増える
→ コンテキストスイッチのオーバーヘッドが大きくなる。(メモリ空間の切り替えがない分、マルチプロセスモデルよりは小さい)
イベント駆動モデル
・クライアントからの接続毎にイベント処理を行う
・1プロセスは1CPUしか使えないので、CPUの数だけプロセスを用意するワーカーモデルが使われる
ex.) Apache HTTP Server -MPM event , Nginx
<利点>
・メモリ空間が共有できるというか1つ
・同時接続数が増えてもプロセス数やスレッド数が増えることはない
→ メモリ消費帳やコンテキストスイッチのオーバーヘッドが小さい
<欠点>
・メモリ空間を一つであるため、スクリプト言語を組み込めないことがある
→ なぜ?
▼Nginx
・「C10K問題」クライアント1万台問題
→
・マルチプロセスモデルやマルチスレッドモデルのWebサーバ
同時接続が増える
→ プロセス数やスレッド数が増える
→ コンテキストスイッチのオーバーヘッドが大きくなる
→ 本来の処理に時間が割けなくなる
なぜ、「Nginx」を利用するのか?
・イベント駆動型モデル
コンテキストスイッチのオーバーヘッドが小さい
→ 「C10K問題」の解決策
・メモリ空間は、一つであるため同時接続数が増えてもメモリの使用量は小さい
→ 仮想マシンのインスタンスを小さくできる
→ リソースの効率的な利用
NginxとApacheで何が違うのか
①メモリの消費量
フットプリントの小ささ
→ フットプリントとはなに??
apache2.4からは、MPMがあるが
→ MPMとは?
②同時アクセス数
C10K問題を意識した設計
③速度
静的ファイルは早い
動的コンテンツは、mod_* で組み込んだapacheのprefork MPMの方がオーバーヘッドがない分速い