Nginxを入門しその仕組などについて調べてみた。勉強不足もあって、間違ってることもあるかもしれないがその際は教えて下さい。C10K問題まず、Nginxを理解する上でC10K問題について知る必要がある。C10K問題とは下記の問題のことだ。ハードウェアの性能上は問題がなくても、クライアント数があまりにも多くなるとサーバがパンクする問題のこと。万台問題」ともいわれる。従来のWebサーバのアーキテクチャpreforkApacheのデフォルトのアーキテクチャなどで採用されている。特徴としては、1リクエストに対して1プロセスが処理する。1000個のプロセスが必要となる。workerリクエストはスレッドが処理する。スレッドは1プロセスのなかで複数立ち上げることができる。プロセス数は少なくて済むが、同時接続が1000であれば1000個のスレッドが必要となる。Apacheで指定可能なアーキテクチャの1つ。いずれにしても、1000の同時接続があれば、1000のプロセスやスレッドが必要ということだ。プロセス/スレッド数が多くなってくると「コンテキストスイッチ」が多く発生し、処理が遅くなってしまう。コンテキストスイッチとはコンテキストスイッチとは、コンピュータの処理装置(CPU)が現在実行している処理の流れ(プロセス、スレッド)を一時停止し、別のものに切り替えて実行を再開すること。問題を解決するために開発されたともいわれている。上記のような課題を解決するようなアーキテクチャを採用している。ワーカプロセスがリクエストを処理する。前述のpreforkやworkerと決定的に違うところは、1つのワーカプロセスが複数のリクエストを処理するということだ。マスタープロセスはワーカプロセスの立ち上げや、制御、管理などが主な仕事。Nginxを終了あるいは再起動、設定ファイルを再読み込みして変更を反映するなど。下記のような仕組みがNginxの高速化(C10K問題対応)を可能としている。シングルスレッド接続ごとにプロセスやスレッドを立ち上げていては、C10K問題に対応できない。そこで、Nginxは1つのスレッドで処理を行うようにしている。それにより、コンテキストスイッチと呼ばれるCPUの切り替え処理が発生しない。正確に言うと、完全に1スレッドで処理するわけではなく図にあるようにワーカプロセス自体はマルチプロセス化できる。通常のプログラムは上から書かれた順に実行されますよね。ント駆動で動作するプログラムは何かしらのイベントが発生するまで待機し、発生したイベントの種類に応じて実行される。webサーバでは同期処理を行う。複数のリクエストがあったときに順番に処理していく。そのため、1つのリクエストが遅いとそれに引きづられてあとのリクエストも遅くなる。向いていないことNginxではイベント駆動で非同期的なIO処理によって、リクエストを完全に処理することを待たずに次から次へと処理を受け付けていきます。そのため、1処理に時間のかかるものをNginx自身で行おうとするとキューがどんどん溜まってしまいます。そのため、一般にアプリケーションの実行やデータベース処理などは向いていません。一方で、軽量な静的データの配信やリバースプロキシなどに向いています。Nginxは、静的データの配信や、プロキシなどに特化させ、アプリケーションの実行などは別途アプリケーションサーバ等で行わせることで有効活用できます。最後にNginxやWebサーバについてより理解を深めるためには、UNIXのプロセスやネットワークAPIについての知識が足りないと感じた。見るまずはこれからはじめようと思う。Shopを使ったマイクロサービス体験のハンズオン「捉」2019年振り返りDevOpsの本質を科学的に理解する。LeanとDevOpsの科学を読んで。