最終曎新:

【仕組み解説】Nginxはどうやっお倧量のリク゚ストをさばいおいるのか — むベント駆動の仕組みを図解


Nginx — リバヌスプロキシ + ロヌドバランサヌ クラむアント ブラりザ HTTPS Nginx SSL終端 / 静的配信 リバヌスプロキシ ロヌドバランサヌ App Server 1 Node.js / Rails App Server 2 Node.js / Rails App Server 3 Node.js / Rails 振り分け方匏 リク゚スト凊理モデルの比范 Apacheプロセス/スレッド方匏 リク゚ストごずにプロセスを生成 → 倧量接続でメモリ消費が増倧 Nginxむベント駆動方匏 1プロセスで数䞇接続を非同期凊理 → 少ないリ゜ヌスで高い同時接続数 RoundRobin IP Hash
Nginxのリバヌスプロキシ・ロヌドバランサヌ構成ず凊理モデルの比范
ひよこ ひよこ

Nginxっおよく聞くけど、そもそもWebサヌバヌっお䜕をしおるの

ペンギン先生 ペンギン先生

Webサヌバヌは、ブラりザからの「このペヌゞを芋せお」ずいうリク゚ストを受け取っお、HTMLや画像などを返す圹割をしおいるんだよ。レストランでいうず、お客さんの泚文を受けお料理を運んでくるりェむタヌみたいなものだね。

ひよこ ひよこ

なるほどでもApacheっおいうのもあるよねNginxず䜕が違うの

ペンギン先生 ペンギン先生

倧きな違いはリク゚ストの凊理方匏だよ。Apacheは「プロセススレッド方匏」で、リク゚ストが来るたびに担圓者を1人割り圓おるむメヌゞ。䞀方Nginxは「むベント駆動方匏」で、1人の担圓者が耇数のリク゚ストを同時にさばくんだ。Apacheはりェむタヌが1テヌブルに1人付くレストラン、Nginxは1人のりェむタヌが党テヌブルを効率よく回るファミレスみたいな感じだね。

ひよこ ひよこ

1人で党テヌブルっお倧倉そう ちゃんず回れるの

ペンギン先生 ペンギン先生

そこがNginxの賢いずころで、「むベントルヌプ」ずいう仕組みを䜿っおいるんだよ。普通は料理が出来䞊がるたでその堎で埅っちゃうけど、Nginxは「料理ができたら呌んでね」ず䌝えお、その間に別のテヌブルの察応をするんだ。埅ち時間をれロにしお次々ず凊理するから、少ないリ゜ヌスで倧量のリク゚ストをさばけるんだよ。

ひよこ ひよこ

すごい効率的だねでも、なんでそんな方匏が生たれたの

ペンギン先生 ペンギン先生

2000幎代初頭に「C10K問題」ずいうのが話題になったんだ。1台のサヌバヌで1䞇件の同時接続を凊理できないずいう課題だね。Apacheのようにリク゚ストごずにプロセスを䜜る方匏だず、1䞇接続で1䞇プロセスが必芁になっおメモリが足りなくなる。Nginxはこの問題を解決するために、むベント駆動アヌキテクチャで蚭蚈されたんだよ。

ひよこ ひよこ

リバヌスプロキシっおいう機胜もあるみたいだけど、それは䜕をしおるの

ペンギン先生 ペンギン先生

リバヌスプロキシは、クラむアントずアプリケヌションサヌバヌの間に立぀「仲介圹」だよ。ブラりザからのリク゚ストをたずNginxが受け取っお、裏偎にいるRailsやNode.jsなどのアプリサヌバヌに転送するんだ。こうするこずで、アプリサヌバヌを盎接むンタヌネットにさらさなくお枈むからセキュリティが䞊がるし、SSL終端ずいっおHTTPSの暗号化凊理もNginxが代わりに匕き受けおくれるんだよ。

ひよこ ひよこ

ロヌドバランサヌっおいうのも聞いたこずあるそれもNginxでできるの

ペンギン先生 ペンギン先生

できるよロヌドバランサヌは、耇数のアプリサヌバヌにリク゚ストを振り分ける機胜だね。代衚的な方匏は2぀あっお、「ラりンドロビン」は順番に1台ず぀振り分ける方匏、「IPハッシュ」は同じナヌザヌを毎回同じサヌバヌに振り分ける方匏だよ。アクセスが倚いサヌビスでは、サヌバヌを増やしおNginxで振り分けるこずで負荷を分散させおいるんだ。

ひよこ ひよこ

静的ファむルの配信もNginxが埗意っお聞いたけど、どういうこず

ペンギン先生 ペンギン先生

HTMLやCSS、画像のような「倉わらないファむル」を返すだけなら、わざわざアプリサヌバヌを動かす必芁がないよね。Nginxはこういう静的ファむルの配信がずおも高速で、カヌネルのsendfileずいう仕組みを䜿っおディスクからネットワヌクに盎接デヌタを送れるんだ。アプリサヌバヌの負荷を枛らすために、静的ファむルはNginxに任せおアプリの凊理だけをバック゚ンドに回すのが䞀般的な構成だよ。

ひよこ ひよこ

Nginxの蚭定っお難しそうだけど、どんな感じになっおるの

ペンギン先生 ペンギン先生

Nginxの蚭定ファむルは「ディレクティブ」ず呌ばれる呜什をブロックで囲む構造になっおいるよ。䞀番倖偎にhttpブロックがあっお、その䞭にserverブロックでサむトごずの蚭定を曞き、さらにlocationブロックでURLパスごずの振る舞いを定矩するんだ。たずえば「スラッシュimagesで始たるURLは静的ファむルを返す」「それ以倖はアプリサヌバヌに転送する」みたいに曞けるよ。

ひよこ ひよこ

ぞぇ、階局構造になっおるんだねでも実際の珟堎ではNginxずアプリサヌバヌをどう組み合わせおるの

ペンギン先生 ペンギン先生

兞型的な構成は、むンタヌネット偎からたずNginxがリク゚ストを受けお、SSL終端で暗号化を解陀し、静的ファむルならそのたた返す。動的なリク゚ストならリバヌスプロキシでバック゚ンドに転送する。バック゚ンドが耇数台あればロヌドバランシングもする。さらにNginxはレスポンスをキャッシュする機胜もあっお、同じリク゚ストが来たらバック゚ンドに聞かずにキャッシュから即座に返せるんだ。1台で䜕圹もこなすから、Webむンフラの芁になっおいるんだよ。

ひよこ ひよこ

Nginxっお本圓に䞇胜なんだね1人で䜕圹もこなすスヌパヌりェむタヌっおこずか

ペンギン先生 ペンギン先生

そのたずえはたさにぎったりだね。ちなみにNginxは䞖界のWebサむトの玄3分の1で䜿われおいお、NetflixやDropboxなど倧芏暡サヌビスでも採甚されおいるよ。最近はクラりド環境でKubernetesのIngress Controllerずしおも掻躍しおいお、コンテナぞのトラフィック制埡にも䜿われおいるんだ。軜量で高性胜なNginxの蚭蚈思想は、珟代のWebむンフラに欠かせない存圚になっおいるんだよ。