Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NGINXENG JP#2 - 2-NGINXの動作の詳細

hiropo20
January 26, 2023

NGINXENG JP#2 - 2-NGINXの動作の詳細

■NGINX-エンジニアリング勉強会#2
https://nginx-eng.connpass.com/event/270365/

その他のイベント資料や動画などイベントページをご覧ください。

hiropo20

January 26, 2023
Tweet

More Decks by hiropo20

Other Decks in Technology

Transcript

  1. NGINX プロダクト
    詳細な構成・動作
    Hiroshi Matsumoto

    View Slide

  2. ©2022 F5
    2
    NGINXとは
    nginx(「エンジンエックス」のように発音[1][2])
    は、フリーかつオープンソースなWebサーバであ
    る。処理性能・高い並行性・メモリ使用量の小さ
    さに焦点を当てて開発されており、
    HTTP, HTTPS, SMTP, POP3, IMAPのリバースプ
    ロキシの機能や、ロードバランサ、HTTPキャッ
    シュなどの機能も持つ。
    出典: フリー百科事典『ウィキペディア(Wikipedia)』
    作者 Igor Sysoev
    開発元 Nginx Inc.
    初版 2004年10月4日 (18年前)
    最新版 1.22.1
    最新評価版 1.23.0
    リポジトリ •hg.nginx.org/nginx
    プログラミング
    言語
    C言語
    対応OS Unix系、Microsoft
    Windows
    種別 Webサーバ、
    リバースプロキシ
    ライセンス BSDライク
    公式サイト nginx.org, Nginx Inc.
    https://ja.wikipedia.org/wiki/Nginx

    View Slide

  3. ©2022 F5
    3
    NGINXとは
    HTTPS/gRPC
    App
    TCP/UDP
    SMTP
    HTML File
    WEBサーバ / Path Routing / キャッシュ /
    通信の細かな制御により、
    高速 安定 高機能
    高機能なReverse Proxy / キャッシュサーバ
    Load Balancing / API Gateway として利用可能
    このNGINXについて
    動作を分解します

    View Slide

  4. ©2022 F5
    4
    NGINXが提供する
    ソフトウェア

    View Slide

  5. ©2022 F5
    5
    NGINXが提供するソフトウェア
    NGINX Plus
    NGINX OSSをベースに、さらなるエンタープライズユースに対応したソフトウェア
    (分散・冗長性・JWT制御・API制御 に加え、各種セキュリティモジュールの利用が可能)
    NGINX Management Suite NGINX統合管理ソフトウェア。NGINX PlusによるAPI管理
    NGINX Instance Manager
    NGINX OSS、NGINX Plusの統合管理。ヒストリカルなAPM機能、コンフィグ・証明書管理、
    管理対象のNGINX OSS / NGINX Plusに対するAPI制御機能を提供
    NGINX App Protect WAF F5が提供する、ミッションクリティカル環境に最適な高速な高品質なWAF
    NGINX App Protect DoS 従来のツールでは検知できないレイヤー7のDoS脅威から高度な保護を提供
    NGINX Ingress Controller Kubernetes環境での高度な通信制御を提供。NGINX機能をIngressリソースを通じて管理可能。
    NGINX Service Mesh NGINX Plusによるコンテナ間の制御を提供するシンプルなサービスメッシュソリューション
    NGINX for Azure NGINX PlusをAzureからSaaS環境として提供、コンフィグを貼り付けるだけで活用が可能
    All-In-One SW
    Overview
    NGINX OSS Dev/Opsに最適な、超軽量・高速・多機能なAll-In-One Software
    NGINX Unit 動的かつ分散アプリケーション環境向けに設計されたアプリケーションサーバ
    NJS (NGINX JavaScript) NGINXの機能を拡張するJavaScript言語のサブセットモジュール
    NJS
    Open Source Security Container SaaS

    View Slide

  6. ©2022 F5
    6
    主要NGINXソフトウェアの構成イメージ
    App
    Proxy
    Client
    App
    NJS
    オンプレミス
    クラウド・コンテナ
    K8S(コンテナ・NIC)
    NGINX OSS
    環境
    App
    HTTP
    gRPC
    etc
    TCP/
    UDP
    NGINX Plus
    App
    オンプレミス
    クラウド・コンテナ
    K8S(コンテナ・NIC)
    App
    WAF
    DOS
    NJS
    HTTP
    gRPC
    etc
    TCP/
    UDP
    NGINX Unit
    App
    オンプレミス
    クラウド・コンテナ
    K8S(コンテナ)
    JS Ruby
    Go
    Java Perl
    PHP
    Python
    HTTP
    NGINX Ingress
    Controller
    Pod
    K8S(NIC)
    Pod
    WAF
    DOS
    NJS
    HTTP
    SMTP
    etc
    TCP/
    UDP
    NGINX Service
    Mesh
    K8S(NSM)
    C
    HTTP
    gRPC
    TCP/
    UDP
    Container
    Container
    C
    JWT/OIDC/ActiveHC/
    Cookie Persistence/
    より詳細なMetrics/
    メーカーSupport
    OSS

    View Slide

  7. ©2022 F5
    7
    NGINX
    リリースサイクル
    参考情報

    View Slide

  8. ©2022 F5
    8
    NGINX OSS – リリースサイクル
    NGINX OSSは、mainline(奇数)とstable(偶数)の二種類に分かれます
    毎年4月にmainlineからstableをforkします。以降のリリースVersionが新しい番号へ更新されます
    NGINX Plusは、NGINX OSSと別のレポジトリで管理されています。mainlineからforkされます
    NGINXはmainlineの利用を推奨しますが、更新頻度などの観点からstableの利用も可能です
    1year 1year
    ここが「mainline」
    頻繁な機能追加

    View Slide

  9. ©2022 F5
    9
    R26 R27 R28
    NGINX Plusは、NGINXメインラインでテスト・実証された、すべてのOSS新機能を取り入れます。
    NGINX Plusは、年3回バイナリパッケージがリリースされます。
    NGINX Plusは、エンタープライズ向けの追加機能と商用サポート(英語、日本語)が含まれています。
    NGINX Plusは、リリースから2年間サポートされます。
    NGINX Plus – リリースサイクル
    https://docs.nginx.com/nginx/releases/
    N+は「mainline」を
    Mergeしている
    1.21.5 1.21.6 1.23.2

    View Slide

  10. ©2022 F5
    10
    NGINX
    実績・パフォーマンス
    参考情報

    View Slide

  11. ©2022 F5
    11
    コンテナプラットフォームに最適なNGINX Technology
    Source: Datadog Container Report 2022
    Top Ingress Providers
    CNCF Survey
    Source: CNCF Survey 2020
    安定・高速動作がクラウドネイティブ環境に最適
    実績

    View Slide

  12. ©2022 F5
    12
    柔軟に拡張できる最高のパフォーマンス
    HARDWARE
    SPECS
    EXPECTED
    PERFORMANCE
    2 CPU cores
    4 GB RAM
    2x10 GbE NIC
    74,000 RPS
    9,100 SSL TPS (ECC)
    4 Gbps throughput
    4 CPU cores
    8 GB RAM
    2x10 GbE NIC
    150,000 RPS
    17,600 SSL TPS (ECC)
    8 Gbps throughput
    8 CPU cores
    16 GB RAM
    2x10 GbE NIC
    300,000 RPS
    33,000 SSL TPS (ECC)
    8 Gbps throughput
    HARDWARE
    SPECS
    EXPECTED
    PERFORMANCE
    2 CPU cores
    4 GB RAM
    2x1 GbE NIC
    90,000 RPS
    4,500 SSL TPS (ECC)
    1 Gbps throughput
    4 CPU cores
    4 GB RAM
    2x40 GbE NIC
    175,000 RPS
    8,500 SSL TPS (ECC)
    5 Gbps throughput
    8 CPU cores
    4 GB RAM
    2x40 GbE NIC
    350,000 RPS
    16,000 SSL TPS (ECC)
    40 Gbps throughput
    0
    2000
    4000
    6000
    8000
    10000
    12000
    14000
    16000
    18000
    系列1
    0
    50000
    100000
    150000
    200000
    250000
    300000
    350000
    400000
    系列1
    0
    5000
    10000
    15000
    20000
    25000
    30000
    35000
    系列1
    0
    50000
    100000
    150000
    200000
    250000
    300000
    350000
    系列1
    2 Core
    4 GB
    4 Core
    4 GB
    8 Core
    4 GB
    2 Core
    4 GB
    4 Core
    8 GB
    8 Core
    16 GB
    https://www.nginx.com/resources/datasheets/nginx-plus-sizing-guide/
    https://www.nginx.com/resources/datasheets/nginx-ingress-controller-kubernetes/
    ベアメタル:CPU/メモリに応じて様々な規模に柔軟な対応
    Ingress Controller:アプライアンスに相当する高速・安定な処理
    安定・拡張性

    View Slide

  13. ©2022 F5
    13
    NGINXのプロセス・動作

    View Slide

  14. ©2022 F5
    14
    NGINXのプロセス・ファイル
    Master Process
    Worker Process
    Worker Process
    Cache Manager
    Config File
    HTML File
    OS
    Cache Loader
    Cache File
    /etc/nginx
    /var/www
    /tmp/cache
    /conf.d
    file
    socket
    file
    process
    OS
    Worker Processを含む
    全体のプロセス管理
    クライアントからの
    接続・リクエスト・転送
    など通信処理を実施
    プロセス起動時の
    キャッシュのロード・
    キャッシュファイル管理
    設定ファイル
    access.log
    /var/log/nginx/
    error.log
    HTMLファイル
    ログファイル
    キャッシュ
    ファイル

    View Slide

  15. ©2022 F5
    15
    NGINXのプロセス・ファイル
    Master Process
    Worker Process
    Worker Process
    Cache Manager
    OS
    Cache Loader
    UID PID PPID CMD
    root 8882 1 nginx: master process
    /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx 8883 8882 nginx: worker process
    nginx 8884 8882 nginx: worker process
    nginx 8885 8882 nginx: cache manager process
    nginx 8886 8882 nginx: cache loader process
    socket
    file
    process
    OS
    PSコマンド出力抜粋
    ※ Cacheに関する設定をを行いNGINXを起動した際に、
    Cache関連のプロセスが動作します

    View Slide

  16. ©2022 F5
    16
    NGINXの設定のロード・反映
    Master Process
    Worker Process
    Worker Process
    Config File
    HTML File
    OS
    /etc/nginx
    /var/www
    /conf.d
    file
    access.log
    /var/log/nginx/
    error.log
    #nginx –s reload
    設定ファイルの読み込み
    設定ファイルの
    構文チェック
    Worker Processへ
    設定の反映
    構文エラー、
    プロセス再起動 など、
    ログへ記録
    socket
    file
    process
    OS

    View Slide

  17. ©2022 F5
    17
    NGINXのキャッシュファイルのロード
    Master Process
    Worker Process
    Worker Process
    Cache Manager
    Cache File
    OS
    Cache Loader
    Cache File
    Cache File
    Cache File
    /data/nginx/cache
    設定の内容に応じて
    キャッシュファイルをロード
    (読み込む数など)
    socket
    file
    process
    OS

    View Slide

  18. ©2022 F5
    18
    NGINXのコネクション処理
    Master Process
    Worker Process
    Worker Process
    HTML File
    OS OS
    App
    /var/www
    TCP/80
    TCP/80
    通信の着信を検知
    設定に応じた処理
    (HTML File)
    HTMLファイルを
    読み込み
    応答
    通信の着信を検知
    設定に応じた処理
    (Proxy)
    応答
    アップストリームへ
    通信を転送
    TCP/3XXXX
    access.log
    /var/log/nginx/
    通信の結果を
    ログへ記録
    socket
    file
    process
    OS

    View Slide

  19. ©2022 F5
    19
    NGINXのコネクション処理時の設定ロード
    Master Process
    Worker Process
    Worker Process
    OS
    TCP/80
    TCP/80
    既存コネクションは
    旧プロセスで処理を
    継続
    新規コネクションから
    新しいプロセスで処理
    Worker Process
    TCP/80
    Worker Process
    設定ファイル読み込みの
    影響を最小限に
    抑えることができます
    socket
    file
    process
    OS
    OS
    App
    Config File
    Config File
    /etc/nginx /conf.d
    設定ファイルの読み込み
    #nginx –s reload

    View Slide

  20. ©2022 F5
    20
    NGINXのコネクション処理時の設定ロード socket
    file
    process
    OS
    Master Process
    Worker Process
    Worker Process
    OS
    Worker Process
    Worker Process
    UID PID PPID CMD
    root 7813 1 nginx: master process
    /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx 7858 7813 nginx: worker process
    nginx 7859 7813 nginx: worker process
    PSコマンド出力抜粋
    UID PID PPID CMD
    root 7813 1 nginx: master process
    /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx 7897 7813 nginx: worker process
    nginx 7898 7813 nginx: worker process
    7858
    7859
    7897
    7898
    7813

    View Slide

  21. ©2022 F5
    21
    Config File
    NGINXのコネクション処理時の設定ロード+NAP
    Master Process
    Worker Process
    Worker Process
    OS
    TCP/80
    TCP/80
    既存コネクションは
    旧プロセスで処理を
    継続
    新規コネクションから
    新しいプロセスで処理
    Config File
    /etc/nginx /conf.d
    設定ファイルの読み込み
    Worker Process
    TCP/80
    Worker Process
    socket
    file
    process
    OS
    NAP
    Process
    Policy File
    OS
    App
    #nginx –s reload

    View Slide

  22. ©2022 F5
    22
    NGINXのコネクション処理時のUpgrade
    Master Process
    Worker Process
    Worker Process
    OS
    TCP/80
    TCP/80
    既存コネクションは
    旧プロセスで処理を継続
    Worker Process
    Worker Process
    アップグレードの
    影響を最小限に
    抑えることができます
    Master Process
    コネクションの管理を
    新旧プロセスで連携しながら実施
    既存コネクションの処理完了後、
    新しいプロセスへ切り替え
    socket
    file
    process
    OS

    View Slide

  23. ©2022 F5
    23
    NGINXの動作
    Non Blocking I/Oによる違い

    View Slide

  24. ©2022 F5
    24
    NGINXの動作:Blocking I/O
    Process・Thread
    OS
    Master Process
    conn
    conn
    conn
    conn
    conn
    TCP/80宛に接続
    OS
    App
    OS
    App
    conn
    • TCP/80に新規接続時、コネクション
    ソケットを受け付け、処理を行う
    プロセスやスレッドを実行
    • 通信がエラー・終了となるまで処理を実行
    • 各プロセス・スレッドはコネクションの
    処理専用として動作する
    新規接続 既存コネクションの処理
    Process・Thread
    Process・Thread
    socket
    file
    process
    OS

    View Slide

  25. ©2022 F5
    25
    NGINXの動作:Non Blocking I/O
    Worker Process
    Worker Process
    OS
    Master Process
    conn
    conn
    conn
    conn
    conn
    TCP/80宛に接続
    OS
    App
    OS
    App
    conn
    • TCP/80に新規接続時、
    コネクションソケットを作成
    • 新規のコネクションソケットを
    リストに追加
    • コネクションソケットで
    • リクエストの読み込み>処理
    • 対象ソケットへ書き込み可能>処理
    • エラー・タイムアウト>ソケット削除
    新規接続 既存コネクションの処理
    socket
    file
    process
    OS
    CPU個数分のWorker Processが動作

    View Slide

  26. ©2022 F5
    26
    NGINX / Apache の比較
    • 同時接続 150ユーザ
    • 最大約 1800rps
    • GETリクエストに対し静的HTMLを応答
    テストシナリオ
    NGINX Apache
    nginx/1.21.6 (nginx-plus-r27-p1) Server version: Apache/2.4.41 (Ubuntu)
    ・MPMはPrefork

    View Slide

  27. View Slide