見た目バックnginxの - を越えて見ます
nginxのプロセスモデル
使用済みnginxの友人は、すべてのnginxのパフォーマンスが非常に高いことを知って、その理由はほとんど知られていてもよいです。まず、nginxのアーキテクチャは、その高いパフォーマンスのための基礎を築きました。このセクションの主な内容は、nginxのプロセスモデルについてですので、下に:(それは問題ではないすべてのコンテンツの完全に明確ではない根拠示すように)、nginxのインフラでそれを見てみましょう
このセクションでは、最初のインフラであることプロセスモデルnginxのです。
マスターデーモンプロセスを含む、いわゆるプロセス・モデル、すなわち、要求又は応答モードnginxのサービスルーチン(マシンが命令のセットを実行するために)、通常nginxのサービス開始後、UNIXシステムのデーモンのようにバックグラウンドで実行され、及び複数のワーカープロセス。
我々はデバッグ時や、手動でバックグラウンドモードをオフにして、単一の処理方法で実行するためのマスタープロセスをキャンセルnginxの設定、確かに本番環境では、この上のオンラインサービス、オペレーションの主流モードまたはデフォルトで複数のプロセスを使用することはできませんすることができます。
ここでは、プロセスと手順の違いで、チップへ:
実は二人は、それは、その役割を果たすことができるように本物の「ライブを形成するために、処理コードがCPUによって実行される追加されたメモリ内でのみ実行される概念、プログラムコードや部分を、処理されるのを待っているデータのちょうど束ではありません「動的なプロセス。プログラムの実行は、あなたが動的なプロセスに遭遇した場合にのみ、静的ではなく、プロセスは開始と終了(「誕生と死」プロセス)ときに両者の間の典型的な違いは、自明です。
クローサー家庭へ、または戻ってくるとnginxのマルチプロセスモードを言います。nginxの開始後、マスタープロセスと図ワーカープロセスとして複数存在します。
マスタープロセスは:ワーカー・プロセスは、労働者を監視し、受信した送信信号を、処理状態を管理し、nginxの動作制御のみマスター・プロセスと通信する必要があります。
ワーカープロセス:基本的なネットワークイベントを処理するための責任が、各ワーカー・プロセスは、(独立した2つの単語を覚えている)すべて等しいと独立しています。一般的に、ワーカー・プロセスの数はコアの数(後述する理由)CPUのマシン(サーバ)に設定されています。
nginxの応答作品が接続されています
私たちは、動作原理nginxのプロセスと接続プロセスを理解するために応答して開始した後ワークフローのnginxとする場合、外部の操作から始めます。
開始時間:
nginxのは、起動時に最初のIPアドレスとポート番号(ネットワークプログラミング、およびTCP / IP理論に関連した)モニターへの必要性を得るために、設定ファイルを解析し、マスタプロセスでは、最初のソケットの良い監視を初期化し、その後、その後、複数の子プロセスをfork競争するために子プロセスは、(例えば、ミューテックス・メカニズム)が新しい接続を受け入れます。この時点で、nginxのクライアントが自分自身を接続するのを待つ、うまくスタート。
システム・プログラミング・コンテンツに属するfork--、フォークを意図し、外国人がフォークを使用することができ、及びフォークの役割を説明するために、この言葉を使用することを決定し、フォーク機能(時々導出するために理解される)サブプロセスを複数作成する機能であります
起動した後:
クライアントは、nginxのでTCP 3ウェイハンドシェイクを介した接続を確立するための接続要求を送信し、ワーカープロセスで正常に対抗するには、この時間は、ソケット接続になる確立し、nginxのパッケージの接続を作成し始めている(実際には、それは構造パッケージを意味します) 。イベント(イベントは、本明細書に記載のネットワークイベントとして理解することができる)機能を読み書きし、クライアントとのイベントデータとの対話を読み取るために添加されます。最後に、当事者の一方が切断(4波)へのイニシアチブをとる、これに、接続が終了(ワーカープロセスが引退を宣言されている)に来ます。
nginxのリブートプロセス
私たちは、コマンドのkill -HUP pidのを実行すると、マスター・プロセスは、それに応答する方法ですか?
まず、マスターが殺害を受け、(単に殺害として理解されていない、多くの人々がこのような理解を維持しているが、これは正確ではない、Linuxシステムでは、キルがプロセスにシグナルを送るために示されている、あなたは、killを使用することができます - 閲覧には、信号を運ぶことができるリットル)は、最初のコンフィギュレーションファイルをリロードし、新しいワーカープロセスを開始し、彼らは現在のイベントを終えた後、栄光の退職になることを示唆し、古いワーカープロセスにシグナルを送ります。新しいワーカープロセスが開始された後、新しい要求の受信を開始します。この方法では、母校のプロセスに直接信号を送信することです。
新バージョンでは、次のような他の手段を使用することができます./ nginxの-sリロードをサービスを再起動することで、/ nginxの-s停止は、サービス外の./nginx -sリロード(のnginxを実行するときに、新しいプロセスを開始します。 )、リロードは、あなたがnginxのリロード設定ファイルを制御し解決するために、プロセスは、上記のプロセスの古いバージョンと同じように、マスター・プロセスにシグナルを送る、と。
これらは、(正確に生きて何をしたか内部)のnginxの内部の仕組みですが、問題を検討するために、この時間:ワーカープロセスをどのように扱うかは、それを要求しますか?
ワーカープロセスの作品
ワーカープロセスは、マスター・プロセスのフォークアウトであり、各ワーカー・プロセスので、ピアである要求が来たときに、その後、任意のワーカープロセスはそれをこの時間を行う方法、それを処理する可能性がありますか?
接続要求を処理するためにその一つだけのプロセスを確実にするためには、すべてのワーカープロセスが要求を処理する権利をつかむためのプロセスでロックされたトリガロック機構、一般的にmutexを、競合する(読んイベントは、接続を受け入れるように受け入れる呼び出す始めました) 、クライアントへの読み込み、パース、要求を処理し、結果(データ情報)、そして最終的に切断、要求はその完全な人生を完了しました。したがって、要求は、ワーカープロセスによって処理され、完全に形成されています。
なぜnginxのマルチプロセスモデルを選ぶのか?
この問題は、その「独立」機能の利点は、それを持って与えている、ここでの原則を理解していない可能性がプロセス・スレッドのための理論的根拠がない、非常に簡単に言って、実際にはありません。
もちろん、「独立性」、複数のワーカープロセス間のお金保存し、互いに独立のないロックは、特定のバグの後に発生しないことにより、リスクを低減、作業に新しいワーカープロセスが存在することを意味、それはしません割り込み他のサービスは、また、問題のプログラミングと確認を簡素化しながら。
だから、それは高い並行性を扱うことができるか、マルチプロセス・モデル、各ワーカー・プロセスだけで一つのメインスレッドを使用して再度質問、?
私たちは、次のセクションを見てみましょう。
nginxの処理要求非同期非ブロッキング方法を(簡単)
ブロックと非ブロック理解するためのシンプルな
- スレッドがIO操作は、データを取得するの実装でブロックされ、IOデータが返されるまで、あなたは、次のコマンドを実行する前に待機する時間がかかる場合があります。だから、この時、スレッドの待機状態は、(一般的にカーネル待機nginxの中に呼ばれ、ほとんどのタブーでnginxのは、システムコールをブロックする)我々はそれが、ブロッキングと呼ば置きます。CPU使用率の低いリソースから。
- あなたは、コードのコマンドを下に実行することができ、操作または非ブロックIO時には、データがこのスレッドを返すことを待たずに、それはあなたが他の事をするCPUリソースを使用することができ、あなたに結果を返します。
たとえば:学校のように遮断することは、あなたが食べに食堂に行くが、あなたは無邪気な場所で並んで待つしたときにあまりにも多くの人が行くことに。
あなたが食べに食堂に行くような非ブロッキングは、多くの人々はまだ、ですが、探している情報は、あなたがこれらの事を行うには影響しませんが、あなたは、トイレに行くことができます。時間を取って、この時間は、CPUの使用率のようなものです、CPUリソースの浪費を避けるために、非ブロッキングがあります。
なぜ私は、非同期方式が必要なのでしょうか?
上記nginxのアプリケーションは、しかしブロックされていないとき、非ブロック言ったが、あなたは、あなたがより多くのことを行うことができますイベントの状態を確認するために来たときにすることができませんでしたが、オーバーヘッドは小さくはありません。そこで、我々は非同期になります。
- 同期:同期手段スレッドIO操作要求データは、あなたが返されるデータの「ケア」へのイニシアチブをとるということです。
- 非同期:データは、データが返されたときに、あなたに通知するために関連するイベントがあるでしょうが返されるかどうかを気にするイニシアチブを取ることなく、現在のスレッド。
例:同期はあなたが質問が私の同僚に尋ね理解していないということです、彼はあなたのソリューションやプログラムに説明し始めた、あなたは彼のイニシアチブの内容を聞いてきた、非同期はあなたが同僚に尋ねた同じ質問があり、彼は、私はそれについて考えるだろうと言うかもしれません私はあなたを伝えるためのイニシアチブを思い付きました。
+応答速度、作業効率を向上させながら、無駄のCPUリソースを回避することができ、非同期処理の要求をノンブロッキング。実際には、それは、同時実行性の高い取引ループ非同期要求(イベント)、で実行して、ワーカープロセスの本質です。
したがって、理解しやすいCPUコアの数、労働者のより多くの数の労働者の数を設定し、プロセスは、リソースのみの不必要な浪費につながる、競争力のあるCPUリソースにつながります。
nginxのソース・カタログの導入は、それの終わりに与えられています。
コードnginxののディレクトリ構造
次のようにあなたがそのディレクトリ構造を見ることができますnginxの解凍ソフトウェア、そのカタログへのアクセスは以下のとおりです。
[root@localhost nginx-1.16.1]# tree -d
.
├── auto #自动编译安装相关目录
│ ├── cc #针对各种编译器进行相应的编译配置目录,包括gcc、ccc等
│ ├── lib #程序依赖的各种库,包括openssl、pcre 、perl等
│ │ ├── geoip
│ │ ├── google-perftools
│ │ ├── libatomic
│ │ ├── libgd
│ │ ├── libxslt
│ │ ├── openssl
│ │ ├── pcre
│ │ ├── perl
│ │ └── zlib
│ ├── os #针对不同的操作系统所做的编译配置目录
│ └── types #与数据类型相关的一些辅助脚本
├── conf #存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib #存放一些实用工具,如geo配置生成工具(geo2nginx.pl
│ ├── unicode2nginx #
│ └── vim #
│ ├── ftdetect #
│ ├── ftplugin #
│ ├── indent #
│ └── syntax #
├── html #存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man #手册
└── src #存放nginx的源代码
├── core #nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
├── event #对系统事件处理机制的封装,以及定时器的实现相关代码
│ └── modules #不同事件处理方式的模块化,如select、poll、epoll、kqueue等
├── http #nginx作为http服务器相关的代码
│ ├── modules #包含http的各种功能模块
│ │ └── perl #
│ └── v2 #
├── mail #nginx作为邮件代理服务器相关的代码
├── misc #一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
├── os #主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口
│ └── unix #
└── stream #实现四层协议的转发、代理或者负载均衡等第三方模块
機能に対応し、モジュールなどのnginxのコアに関し、srcのディレクトリを、:開発者は、そのソースコードファイルを見る必要があるかもしれませんため、ユーザのキーは、confディレクトリ、htmlディレクトリです。
参考リンク:tengine.taobao.org