Slide 1

Slide 1 text

Nginx & Apache
 何が違うのか? hiroaki

Slide 2

Slide 2 text

Who am I ? 名前:hiroaki 技術:PHP/ Laravel, AWS 年齢:27歳 歴 :11ヶ月半

Slide 3

Slide 3 text

そもそもNginxとApacheって何?

Slide 4

Slide 4 text

Nginx Apache Webサーバー
 例えば、Webページを返してくれる


Slide 5

Slide 5 text

そもそもなんでNginxとApache?

Slide 6

Slide 6 text

2021年12月Webサーバシェア
 Nginx (32.9%) Apache (31.6%) https://news.mynavi.jp/techplus/article/20211203-2211535/ 引用『TECH+ マイナビニュースより』

Slide 7

Slide 7 text

Nginx & Apache
 何が違うのか?

Slide 8

Slide 8 text

Nginxの方が 同時大量接続に対応できる

Slide 9

Slide 9 text

ポイントは
 C10K(Client 10,000)問題 「 ハードウェアの性能上は問題がなくても,あまりにもク ライアントの数が多くなるとサーバがパンクする問題の こと」をC10K問題と定義しています。 https://gihyo.jp/dev/clip/01/orangenews/vol38/0006 『引用:技術評論者ブログより』

Slide 10

Slide 10 text

そもそものプログラム処理のお話
 スレッド1 プロセス1 コア CPU メモリ スレッド2 プロセス2 スレッド1 コア コア

Slide 11

Slide 11 text

処理が多くなると。。。
 コア CPU メモリ コア コア ・・・ 処理待ち

Slide 12

Slide 12 text

・そもそもプロセス数に上限がある ・コンテキストスイッチに負荷がかかる プロセスが多くなることは何が問題?
 https://knowledge.sakura.ad.jp/24148/ 『引用:さくらのナレッジより』 ・ファイルディスクリプタの上限に達する

Slide 13

Slide 13 text

Apacheの処理の種類は大きく2つ
 preforkモデル workerモデル ※event駆動モデルは一旦置いてます コントローラープ ロセス 子プロセス 子プロセス 子プロセス コントローラープ ロセス

Slide 14

Slide 14 text

accept() read() write() TCP接続をOSから受け取る クライアントから送信されるリクエストを読み込む プロセス2 スレッド1 クライアントにレスポンスを送信する ~~~ HTTPヘッダの解析やコンテンツ作成~~~ ~~~ ログを取る等様々な処理 ~~~ HTTPの場合のスレッドをざっくり


Slide 15

Slide 15 text

コントローラープ ロセス 子プロセス 子プロセス 子プロセス preforkモデル
 プロセス数 = 接続数(スレッドは1つ) アクセス

Slide 16

Slide 16 text

preforkモデル
 スクリプト言語が組み込める メモリの使用効率が悪い 処理速度がworkerに比べて速い CPU負荷が高い コンテキストスイッチのオーバーヘッドが増加

Slide 17

Slide 17 text

workerモデル
 コントローラープ ロセス アクセス 1つのスレッドにつき、1つの接続

Slide 18

Slide 18 text

workerモデル
 スクリプト言語が組み込めない
 メモリがpreforkより効率的 コンテキストスイッチのオーバーヘッドが増加

Slide 19

Slide 19 text

Apacheは接続の分だけ、
 スレッドやプロセスが増えてしまう
 ではNginxは?
 プロセスの数が限定されている
 ※大体CPUのコアの数です。


Slide 20

Slide 20 text

1つのプロセスが複数のアクセスを同時処理
 マスタープロセス ワーカープロセス ワーカープロセス ワーカープロセス

Slide 21

Slide 21 text

ポイントはイベント駆動&I/Oの仕組み
 accept() read() write() 終わったから次 終わったから次

Slide 22

Slide 22 text

処理中のブロックがない
 accept() read() write() 終わったから次 終わったから次 accept() read() 終わるまでこっち ① ② ① ②

Slide 23

Slide 23 text

Nginxの特徴
 処理が速い(軽量)
 大量のアクセスを処理することが可能 重たい処理が苦手
 (重たい処理の場合プロセスがブロックされてしまうみたいです)

Slide 24

Slide 24 text

Nginxはロードバランサーや
 リバースプロキシとしても利用できる

Slide 25

Slide 25 text

ApacheとNginxを比較
 ・軽い処理が得意 ・重たい処理も可能 Nginx Apache ・大量処理が得意 ・大量処理は苦手 ・開発元が営利企業 ・開発元がコミュニティ ・イベント駆動 ・マルチスレッド (orプロセス) どちらもオープンソース

Slide 26

Slide 26 text

References ・C10K問題 https://gihyo.jp/dev/clip/01/orangenews/vol38/0006 Books Web Sites ・Nginx 実践入門 ・HTTP Serverのプロセス構造 http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0950/03Y1830D/EY180028.HTM ・Apache/Nginx https://milestone-of-se.nesuke.com/sv-basic/linux-basic/apache-mpm-prefork-worker-event/ ・プロセス/スレッド https://shinpeim.github.io/process-book/002.md/ https://knowledge.sakura.ad.jp/24148/ https://openstandia.jp/pdf/140228_osc_seminar_ssof8.pdf etc.

Slide 27

Slide 27 text

ご清聴ありがとうございました。