■NGINX-エンジニアリング勉強会#2 https://nginx-eng.connpass.com/event/270365/
その他のイベント資料や動画などイベントページをご覧ください。
NGINX プロダクト詳細な構成・動作Hiroshi Matsumoto
View Slide
©2022 F52NGINXとは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系、MicrosoftWindows種別 Webサーバ、リバースプロキシライセンス BSDライク公式サイト nginx.org, Nginx Inc.https://ja.wikipedia.org/wiki/Nginx
©2022 F53NGINXとはHTTPS/gRPCAppTCP/UDPSMTPHTML FileWEBサーバ / Path Routing / キャッシュ /通信の細かな制御により、高速 安定 高機能高機能なReverse Proxy / キャッシュサーバLoad Balancing / API Gateway として利用可能このNGINXについて動作を分解します
©2022 F54NGINXが提供するソフトウェア
©2022 F55NGINXが提供するソフトウェアNGINX PlusNGINX OSSをベースに、さらなるエンタープライズユースに対応したソフトウェア(分散・冗長性・JWT制御・API制御 に加え、各種セキュリティモジュールの利用が可能)NGINX Management Suite NGINX統合管理ソフトウェア。NGINX PlusによるAPI管理NGINX Instance ManagerNGINX OSS、NGINX Plusの統合管理。ヒストリカルなAPM機能、コンフィグ・証明書管理、管理対象のNGINX OSS / NGINX Plusに対するAPI制御機能を提供NGINX App Protect WAF F5が提供する、ミッションクリティカル環境に最適な高速な高品質なWAFNGINX 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 SWOverviewNGINX OSS Dev/Opsに最適な、超軽量・高速・多機能なAll-In-One SoftwareNGINX Unit 動的かつ分散アプリケーション環境向けに設計されたアプリケーションサーバNJS (NGINX JavaScript) NGINXの機能を拡張するJavaScript言語のサブセットモジュールNJSOpen Source Security Container SaaS
©2022 F56主要NGINXソフトウェアの構成イメージAppProxyClientAppNJSオンプレミスクラウド・コンテナK8S(コンテナ・NIC)NGINX OSS環境AppHTTPgRPCetcTCP/UDPNGINX PlusAppオンプレミスクラウド・コンテナK8S(コンテナ・NIC)AppWAFDOSNJSHTTPgRPCetcTCP/UDPNGINX UnitAppオンプレミスクラウド・コンテナK8S(コンテナ)JS RubyGoJava PerlPHPPythonHTTPNGINX IngressControllerPodK8S(NIC)PodWAFDOSNJSHTTPSMTPetcTCP/UDPNGINX ServiceMeshK8S(NSM)CHTTPgRPCTCP/UDPContainerContainerCJWT/OIDC/ActiveHC/Cookie Persistence/より詳細なMetrics/メーカーSupportOSS
©2022 F57NGINXリリースサイクル参考情報
©2022 F58NGINX OSS – リリースサイクルNGINX OSSは、mainline(奇数)とstable(偶数)の二種類に分かれます毎年4月にmainlineからstableをforkします。以降のリリースVersionが新しい番号へ更新されますNGINX Plusは、NGINX OSSと別のレポジトリで管理されています。mainlineからforkされますNGINXはmainlineの利用を推奨しますが、更新頻度などの観点からstableの利用も可能です1year 1yearここが「mainline」頻繁な機能追加
©2022 F59R26 R27 R28NGINX 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
©2022 F510NGINX実績・パフォーマンス参考情報
©2022 F511コンテナプラットフォームに最適なNGINX TechnologySource: Datadog Container Report 2022Top Ingress ProvidersCNCF SurveySource: CNCF Survey 2020安定・高速動作がクラウドネイティブ環境に最適実績
©2022 F512柔軟に拡張できる最高のパフォーマンスHARDWARESPECSEXPECTEDPERFORMANCE2 CPU cores4 GB RAM2x10 GbE NIC74,000 RPS9,100 SSL TPS (ECC)4 Gbps throughput4 CPU cores8 GB RAM2x10 GbE NIC150,000 RPS17,600 SSL TPS (ECC)8 Gbps throughput8 CPU cores16 GB RAM2x10 GbE NIC300,000 RPS33,000 SSL TPS (ECC)8 Gbps throughputHARDWARESPECSEXPECTEDPERFORMANCE2 CPU cores4 GB RAM2x1 GbE NIC90,000 RPS4,500 SSL TPS (ECC)1 Gbps throughput4 CPU cores4 GB RAM2x40 GbE NIC175,000 RPS8,500 SSL TPS (ECC)5 Gbps throughput8 CPU cores4 GB RAM2x40 GbE NIC350,000 RPS16,000 SSL TPS (ECC)40 Gbps throughput020004000600080001000012000140001600018000系列1050000100000150000200000250000300000350000400000系列105000100001500020000250003000035000系列1050000100000150000200000250000300000350000系列12 Core4 GB4 Core4 GB8 Core4 GB2 Core4 GB4 Core8 GB8 Core16 GBhttps://www.nginx.com/resources/datasheets/nginx-plus-sizing-guide/https://www.nginx.com/resources/datasheets/nginx-ingress-controller-kubernetes/ベアメタル:CPU/メモリに応じて様々な規模に柔軟な対応Ingress Controller:アプライアンスに相当する高速・安定な処理安定・拡張性
©2022 F513NGINXのプロセス・動作
©2022 F514NGINXのプロセス・ファイルMaster ProcessWorker ProcessWorker ProcessCache ManagerConfig FileHTML FileOSCache LoaderCache File/etc/nginx/var/www/tmp/cache/conf.dfilesocketfileprocessOSWorker Processを含む全体のプロセス管理クライアントからの接続・リクエスト・転送など通信処理を実施プロセス起動時のキャッシュのロード・キャッシュファイル管理設定ファイルaccess.log/var/log/nginx/error.logHTMLファイルログファイルキャッシュファイル
©2022 F515NGINXのプロセス・ファイルMaster ProcessWorker ProcessWorker ProcessCache ManagerOSCache LoaderUID PID PPID CMDroot 8882 1 nginx: master process/usr/sbin/nginx -c /etc/nginx/nginx.confnginx 8883 8882 nginx: worker processnginx 8884 8882 nginx: worker processnginx 8885 8882 nginx: cache manager processnginx 8886 8882 nginx: cache loader processsocketfileprocessOSPSコマンド出力抜粋※ Cacheに関する設定をを行いNGINXを起動した際に、Cache関連のプロセスが動作します
©2022 F516NGINXの設定のロード・反映Master ProcessWorker ProcessWorker ProcessConfig FileHTML FileOS/etc/nginx/var/www/conf.dfileaccess.log/var/log/nginx/error.log#nginx –s reload設定ファイルの読み込み設定ファイルの構文チェックWorker Processへ設定の反映構文エラー、プロセス再起動 など、ログへ記録socketfileprocessOS
©2022 F517NGINXのキャッシュファイルのロードMaster ProcessWorker ProcessWorker ProcessCache ManagerCache FileOSCache LoaderCache FileCache FileCache File/data/nginx/cache設定の内容に応じてキャッシュファイルをロード(読み込む数など)socketfileprocessOS
©2022 F518NGINXのコネクション処理Master ProcessWorker ProcessWorker ProcessHTML FileOS OSApp/var/wwwTCP/80TCP/80通信の着信を検知設定に応じた処理(HTML File)HTMLファイルを読み込み応答通信の着信を検知設定に応じた処理(Proxy)応答アップストリームへ通信を転送TCP/3XXXXaccess.log/var/log/nginx/通信の結果をログへ記録socketfileprocessOS
©2022 F519NGINXのコネクション処理時の設定ロードMaster ProcessWorker ProcessWorker ProcessOSTCP/80TCP/80既存コネクションは旧プロセスで処理を継続新規コネクションから新しいプロセスで処理Worker ProcessTCP/80Worker Process設定ファイル読み込みの影響を最小限に抑えることができますsocketfileprocessOSOSAppConfig FileConfig File/etc/nginx /conf.d設定ファイルの読み込み#nginx –s reload
©2022 F520NGINXのコネクション処理時の設定ロード socketfileprocessOSMaster ProcessWorker ProcessWorker ProcessOSWorker ProcessWorker ProcessUID PID PPID CMDroot 7813 1 nginx: master process/usr/sbin/nginx -c /etc/nginx/nginx.confnginx 7858 7813 nginx: worker processnginx 7859 7813 nginx: worker processPSコマンド出力抜粋UID PID PPID CMDroot 7813 1 nginx: master process/usr/sbin/nginx -c /etc/nginx/nginx.confnginx 7897 7813 nginx: worker processnginx 7898 7813 nginx: worker process78587859789778987813
©2022 F521Config FileNGINXのコネクション処理時の設定ロード+NAPMaster ProcessWorker ProcessWorker ProcessOSTCP/80TCP/80既存コネクションは旧プロセスで処理を継続新規コネクションから新しいプロセスで処理Config File/etc/nginx /conf.d設定ファイルの読み込みWorker ProcessTCP/80Worker ProcesssocketfileprocessOSNAPProcessPolicy FileOSApp#nginx –s reload
©2022 F522NGINXのコネクション処理時のUpgradeMaster ProcessWorker ProcessWorker ProcessOSTCP/80TCP/80既存コネクションは旧プロセスで処理を継続Worker ProcessWorker Processアップグレードの影響を最小限に抑えることができますMaster Processコネクションの管理を新旧プロセスで連携しながら実施既存コネクションの処理完了後、新しいプロセスへ切り替えsocketfileprocessOS
©2022 F523NGINXの動作Non Blocking I/Oによる違い
©2022 F524NGINXの動作:Blocking I/OProcess・ThreadOSMaster ProcessconnconnconnconnconnTCP/80宛に接続OSAppOSAppconn• TCP/80に新規接続時、コネクションソケットを受け付け、処理を行うプロセスやスレッドを実行• 通信がエラー・終了となるまで処理を実行• 各プロセス・スレッドはコネクションの処理専用として動作する新規接続 既存コネクションの処理Process・ThreadProcess・ThreadsocketfileprocessOS
©2022 F525NGINXの動作:Non Blocking I/OWorker ProcessWorker ProcessOSMaster ProcessconnconnconnconnconnTCP/80宛に接続OSAppOSAppconn• TCP/80に新規接続時、コネクションソケットを作成• 新規のコネクションソケットをリストに追加• コネクションソケットで• リクエストの読み込み>処理• 対象ソケットへ書き込み可能>処理• エラー・タイムアウト>ソケット削除新規接続 既存コネクションの処理socketfileprocessOSCPU個数分のWorker Processが動作
©2022 F526NGINX / Apache の比較• 同時接続 150ユーザ• 最大約 1800rps• GETリクエストに対し静的HTMLを応答テストシナリオNGINX Apachenginx/1.21.6 (nginx-plus-r27-p1) Server version: Apache/2.4.41 (Ubuntu)・MPMはPrefork