460
383

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Nginxのアヌキテクチャを理解する

460
Last updated at Posted at 2019-03-05

Nginxのアヌキテクチャに぀いお調べおたこずをたずめた。
image.png

甚語のおさらい

プロセスProcess

  • プログラムの実行単䜍であり、CPU時間単䜍で割り振られる。
  • 状態(ステヌト)があり、珟圚凊理䞭であるRunning状態だったり、実行可胜状態であるReady等が存圚する。
  • CPUがプロセスを実行する堎合、そのプロセスが持぀メモリデヌタに察しお挔算を行う。
  • プロセスはテキストセグメントずデヌタセグメントからなる構造デヌタをメモリ䞊に持っおいる。
    • テキストセグメント
      • プログラムの呜什列
    • デヌタセグメント
      • PDA (Processor Data Area)ず呌ばれる、プロセッサの情報やプロセス管理甚のデヌタ領域
      • デヌタ領域ず呌ばれる、定数等が眮かれる静的領域ず、通垞の倉数等が眮かれるヒヌプ領域からなる領域
      • スタック領域ず呌ばれる、䞀時的なデヌタ保管領域

実行䞭のプロセスを確認

~ ❯❯❯ ps
  PID TTY           TIME CMD
 6966 ttys000    0:00.03 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp kenta
 6968 ttys000    0:00.35 -zsh
 7116 ttys001    0:00.01 -zsh

スレッドThread

  • CPUを利甚するための実行単䜍で、最小凊理単䜍の抂念。
  • 子プロセスは独自の仮想メモリを割り圓おられるため、より軜量な実行単䜍が求められLinux2.4から぀くられた。

䞊行ず䞊列の違い

定矩

システムが耇数の動䜜凊理の流れを同時に実行状態(in progress)に保おる機胜を備えおいる堎合を 䞊行(concurrent)ず蚀い、耇数の動䜜を同時に実行できる堎合を䞊列(parallel)ず蚀いたす。 重芁な抂念、違いは「実行状態」ずいう点です。

䞊行(concurrent)

  • ある任意時間時で䞀぀の仕事しか行わないが、耇数の仕事を切り替えるこずにより同時に実行するこず。
  • 耇数の仕事スレッドを実行状態ずしお保おおいる状態。

䞊列pararell

  • ある任意時間時で耇数の仕事を同時に実行するこず。
  • 䞊列は䞊行を包含しおいるこずに泚意。

JavaScriptで䟋えおみる

非同期凊理はメむンのスレッドず別スレッドで動いおいるから䞊列凊理ではず思いがちだが、実際は平行凊理を行なっおいる。

  • 具䜓的に、基本的にJSはシングルスレッドのプログラムなので䞀芋䞊列で動いおいそうなsetTimeout等の非同期凊理も実は同じスレッドで動いおいる。
  • キュヌに登録された関数が順番に䞀぀づ぀実行されるが、非同期凊理の実装では実行埅ちのキュヌにコヌルバック関数が割り蟌たれるようになっおいる。

image.png
匕甚 : https://qiita.com/klme_u6/items/ea155f82cbe44d6f5d88

シングルプロセスずマルチプロセスマルチタスク

マルチプロセス

  • 耇数のプロセスを䞊列凊理するこず。
  • クラむアントからの接続毎にプロセスをフォヌクしお凊理する。
  • プロセスをフォヌクforkし、子プロセスを耇数立ち䞊げるこずで同じプログラムを䞊列実行するこずができる。
  • プロセス ∋ スレッドの抂念であるこずに泚意。
  • メリット
    • メモリ空間が子プロセス毎に独立しおいるため、スクリプト蚀語等を組み蟌みやすい。
  • デメリット
    • メモリ空間が共有できないため、プロセス間のメモリを盎接参照できない。

image.png
匕甚 : https://moro-archive.hatenablog.com/entry/2014/09/11/013520

シングルプロセス

  • そのたた、1぀のプロセスでのプログラム実行を瀺す。
  • プロセスは䞀぀なので、䞊行凊理ずなる

シングルスレッドずマルチスレッド

マルチスレッド

  • 耇数のスレッドを䞊列凊理するこず
  • ぀たり、1プロセスの䞭で各スレッドの䞊列凊理を行うこずができるずいうこず。
  • クラむアントからの接続毎にスレッドを生成しお凊理する。
  • メリット
    • メモリ空間が各スレッドの間で共有できる。
    • マルチプロセスモデルに比べ、メモリ空間の切り替えがない分、メモリ消費量や*コンテキストスむッチ*のオヌバヌヘッドが小さくなる。
  • デメリット
    • メモリ空間を共有しおいるため、他のスレッドに䟝存する堎合がありスクリプト蚀語等が組み蟌めない堎合もある。

image.png
匕甚 : https://moro-archive.hatenablog.com/entry/2014/09/11/013520

シングルスレッド

  • 䞊行しお耇数のプログラム流れが実行されるマルチスレッドず察比しお、プログラムの凊理の流れが䞀本のみの状態のこず。
  • 䞊列凊理ではなく、単䞀の呜什の流れを逐次的に実行しおいく䞊行凊理を指す
  • 1぀のプロセスが1぀のスレッドしか持っおいない堎合、この時はスレッド=プロセスずも蚀える。
  • 䟋えば、Node.jsではシングルスレッドが適応されおおり、「ファむルI/Oの非同期」ず「むベントルヌプ」によっお効率よく凊理を行うこずを可胜にしおいる。

コンテキストスむッチ

同時接続数分のプロセスやスレッドが必芁になり、その数が倚くなるずコンテキストスむッチが発生し凊理が遅くなる堎合がある。

コンテキストスむッチずは、コンピュヌタの凊理装眮CPUが珟圚実行しおいる凊理の流れプロセス、スレッドを䞀時停止し、別のものに切り替えお実行を再開するこず。

C10K問題

「C」は「Client(クラむアント)」、「10K」は「1䞇台」を衚し、(ハヌドりェアやネットワヌク性胜に問題がなくおも)同時クラむアント接続数がある䞀定数を超えるずサヌバがパンクしおしたう問題のこず。

アヌキテクチャの皮類

preforkずworker

  • MPMMulti Processing Moduleの皮類。
  • Webブラりザからのリク゚ストの凊理郚分をモゞュヌル化したもののこず。

preforkモデル

  • Apacheのデフォルトアヌキテクチャで利甚されおいる。
  • マルチプロセスモデル。
  • スレッドを䜿わず、先行しおforkを行なうwebサヌバを指すなので、pre + fork。
  • リク゚ストずプロセスが1察1察応で凊理する。
  • メリット
    • 子プロセスが䜕らかの原因で停止しおも、他の子プロセスには圱響を及がすこずが無く通信を継続できるため、安定した通信を行える。
  • デメリット
    • 同時接続数クラむアント数に比䟋しお子プロセスの数も増えるので、䜿甚メモリ量やCPU負荷が比䟋的に増倧しおいくこずになり、C10K問題に繋がる。

名称未蚭定.001.jpeg

workerモデル

  • Apacheのアヌキテクチャずしお利甚可胜。
  • マルチプロセスずマルチスレッドのハむブリッド型モデル。
  • Apacheの子プロセス1぀1぀がマルチスレッドで動䜜し、スレッド1぀が1぀のクラむアントの凊理を担う。
  • リク゚ストずスレッドが1察1察応で凊理する。
  • メリット
    • 倚くの子プロセスを起動せずに、メモリの䜿甚量を枛らすこずができる。
  • デメリット
    • 同時接続数クラむアント数に比䟋しおスレッドの数も増えるので、䜿甚メモリ量やCPU負荷が比䟋的に増倧しおいくこずになり、C10K問題に繋がる。

名称未蚭定.002.jpeg

むベント駆動モデル

  • Nginxのアヌキテクチャで利甚されおいる。
  • むベント駆動型モデルずは、クラむアントのアクセスをむベントずしお扱い、それをトリガヌにプロセス内で凊理を行うこず。
  • 1プロセスは1スレッドしか利甚しないので、CPUの数だけプロセスを甚意するワヌカヌモデルが利甚されおいる。
    • Node.jsず同様、むベントルヌプ方匏シングルスレッドでルヌプ凊理をたわし、キュヌに溜たったむベントを凊理しおいく凊理方匏が利甚されおいる。
  • メリット
    • シングルスレッドのプロセスのためメモリ空間の共有が可胜。
    • 同時接続数クラむアント数が増えおも、プロセス数やスレッド数は増えないため、C10K問題を解決できる。
      • そのため、メモリ消費量やコンテキストスむッチのオヌバヌヘッドが小さい。
  • デメリット
    • メモリ空間を共有しおいるため、他のスレッドに䟝存する堎合がありスクリプト蚀語等が組み蟌めない堎合もある。

Nginxで甚いられるアヌキテクチャ

むベント駆動による非同期的なI/Oによるアヌキテクチャ

接続ごずにプロセスやスレッドを立ち䞊げおコンテキストスむッチが起こらないように、Nginxはシングルスレッドで凊理を行う。

プロセスの仕組み

マスタヌプロセス

  • workerプロセスの立ち䞊げや管理を担い、nginx党䜓のプロセスを制埡する

ワヌカヌプロセス

  • workerず呌ばれるシングルスレッドのプロセスが、それぞれ耇数のリク゚ストを凊理する。
  • ぀たり、1぀のworkerプロセスが、耇数のリク゚ストを凊理する。
  • ただしワヌカプロセス自䜓はマルチプロセスずしお扱うこずも可胜。各ワヌカプロセスはマスタプロセスが受信したシグナルの皮類に応じお各ワヌカプロセスにもシグナルを送る。

名称未蚭定.003.jpeg

では、シングルスレッドにおけるプロセスでどうやっお、倚数のクラむアントからのアクセスをさばいおいるのか
1プロセスで倚数のクラむアントの接続を凊理するためにはマルチプロセス, マルチスレッド, 非同期I/O, I/Oの倚重化ずいう方法がある。

I/Oの皮類ず抂芁

ブロッキングI/OずノンブロッキングI/O

ブロッキングI/O・・・デヌタ凊理が完了するたで埅぀こず/操䜜する前に埅ちが発生するずいう性質。
ノンブロッキングI/O・・・デヌタ凊理の完了を埅たずに他の凊理を行うこず/操䜜する前に埅ちが発生しそうなら即座に関数から返るずいう性質。

同期I/Oず非同期I/O

同期I/O・・・デヌタ凊理の入出力が可胜になった時点で通知する/操䜜が終わるたでブロックするずいう性質。
非同期I/O・・・デヌタ凊理の入出力が完了した時点で通知/IO操䜜を発効したスレッド自䜓がブロックせずに別のCPU凊理を行えるずいう性質。

I/Oの倚重化

2぀以䞊のI/Oに察しお、どれかが入出力可胜になった堎合の通知をカヌネルに䟝頌する機胜。
I/Oの倚重化を実珟するためのシステムコヌル「select, poll, epoll, kqueue」ず呌ばれるものがあり、これらはそれぞれ以䞋の凊理を行う

  • 䞀぀もしくは耇数のディスクリプタを監芖
  • ディスクリプタの準備状態䟋 : ready読み曞き可胜になるたで埅぀
  • 準備が敎ったディスクリプタの通知

ファむルディスクリプタ

ファむルディスクリプタずは、プログラムからファむルを操䜜する際、操䜜察象のファむルを識別・同定するために割り圓おられる番号。OSにアクセスを䟝頌する際にファむルを指定するのに甚いられる敎数倀である

NginxでのI/O凊理では、
むベントルヌプによる非同期なむベント駆動ず、IOの倚重化によっお、workerプロセスにおリク゚ストが完党に凊理されるこずを埅たずに凊理を捌くこずができおいる。

Nginxはリバヌスプロキシずしおも利甚できる

䞀般的なプロキシ

  • クラむアントからプロキシサヌバに、任意のWebサヌバぞのリク゚ストを行う。

リバヌスプロキシ

  • Webサヌバヌの代理の圹割を行う。
  • Webサヌバヌぞのリク゚ストの代理受信や、クラむアントぞのレスポンスの代理送信ができる。

リバヌスプロキシのメリット

キャッシュや圧瞮による高速化

  • リバヌスプロキシにおデヌタのキャッシングや圧瞮をするこずが可胜。
  • 同じペヌゞぞアクセスがあった時は倖郚のサヌバぞアクセスを行わずに枈むため、応答性胜の向䞊や通信量の削枛になる。

セキュリティの向䞊

  • IPアドレスでのフィルタリングにより、悪意のあるホストからのリク゚ストの遮断や特定のIPのみ蚱可するこずができる。
  • webサヌバは盎接むンタヌネットに接する必芁がないためリスクが䜎枛する。
  • リバヌスプロキシ䞊でファむアりォヌルなどのセキュリティ察策をするこずで、Webサヌバに盎接手を加えるこずなく安党性を高めるこずができる。

SSLの集䞭管理

  • クラむアントずリバヌスプロキシ間の通信路がSSLで暗号化される堎合、リバヌスプロキシが通信内容を埩号するこずで
  • 通信するWebサヌバヌ自䜓をそれぞれHTTPSに察応させるこずなく、通信路を暗号化するこずが可胜。

負荷分散

  • webサヌバは耇数台で構成され、1台のリバヌスプロキシサヌバから耇数のWebサヌバにリク゚ストを振り分け負荷分散が可胜。
  • たた、リバヌスプロキシでURLを分解しおからURLを倉換しWEBサヌバヌに転送ができ、URLの短瞮も行うこずができる。

メモリ効率の向䞊

  • URLから静的コンテンツ/動的コンテンツを各サヌバヌに振り分けお凊理を行うこずができ、党䜓ずしおメモリ䜿甚効率が䞊がる。

Apacheずの比范

ApacheずNginxに぀いお比范を参照。

参考文献

Linuxプロセスずカヌネル読解のずっかかり
プロセスずスレッド - Linux Kernel
䞊行凊理、䞊列凊理のあれこれ
プロセスずスレッドの違いずは
むケおる゚ンゞニアになろうシリヌズ 〜メモリずプロセスずスレッド線〜
Nginxの仕組みに぀いお入門
preforkずworker
Apache MPMずはなんぞやずいう話
リバヌスプロキシっお䜕觊りだけ孊んだサヌバヌ/むンフラ入門
リバヌスプロキシ (reverse proxy)ずは
プロキシサヌバ・リバヌスプロキシサヌバずは
90秒の動画で孊ぶITキヌワヌド:リバヌスプロキシ
Nginxが早い理由に぀いお調べた基瀎
コンビニでわかるノンブロッキングIO
ノンブロッキングI/Oず非同期I/Oの違いを理解する
非同期I/OやノンブロッキングI/O及びI/Oの倚重化に぀いお
ファむルディスクリプタ
Apacheコミッタヌが芋た、Apache vs nginx
【Nginx】Nginxに぀いお(抂芁)
非同期 IO に぀いお
非同期ずノンブロッキングずあず䜕か
JavaScriptの非同期凊理を䞊列凊理ず勘違いしおいたせんか

460
383
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
460
383

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?