イベント処理のnginxの原則に

   nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,作为HTTP服务器的后起之秀,相比较于web服务器软件老大哥Apache有着很大的改进地方,主要在性能方面NGINX占用的系统资源更少,支持更多的并发连接数(特别是在静态小文件场景下),达到更高的访问效率。在功能上NGINX不但是个优秀的web服务器软件,还具有反向代理负载均衡,相当于LVS,Haproxy。缓存服务器相当于Squid等专业的缓存服务器软件
   Nginx的负载均衡模块采用两种方法:
   轮转法,它处理请求就像纸牌游戏一样从头到尾分发;
   IP哈希法,在众多请求的情况下,它确保来自同一个IP的请求会分发到相同的后端服务器。

   主要介绍nginx提供Web服务是处理事件的原理
   Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。多进程模型包括一个master进程,多个worker进程,一个worker进程只有一个主线程(避免线程切换),一般worker进程个数是根据服务器CPU核数来决定的,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。也可以在配置文件中指定worker进程的数量。master进程负责管理Nginx本身和其他worker进程。如图所示
         ![](https://s1.51cto.com/images/blog/201907/03/64d747a08374bf1b015c2a00e1148244.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
         那么几个worker进程是如何高效的处理上万个事件请求的呢?
   这是因为nginx事件处理机制决定的,多进程模型+异步非阻塞模型才是高效处理的关键。单纯的多进程模型会导致连接并发数量的降低,而采用异步非阻塞IO模型很好的解决了这个问题;并且还因此避免的多线程的上下文切换导致的性能损失。
   master进程
         主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

後見プロセスにいる間、全体のプロセスは、ユーザインタフェースと処理群との相互作用として働くマスター。それだけ、サービス、スムーズなアップグレードを再開即効でログファイル、設定ファイルや他の機能を置き換えるために、ワーカー・プロセスを管理することによって達成されるであろう、事業の実施について責任を負いません、ネットワークイベントを処理しません。
私たちはライン上のマスター・プロセスに信号を送信するために殺すために必要な、nginxのを制御する必要があります。このようなキル-HUP pidのように、それは冷静に再起動されているので、冷静に我々は一般的にnginxのを再起動する、または設定を再ロードするために、この信号を使用し、nginxのを再起動し、nginxの言うことなので、サービスが中断されていません。HUP信号を受信した後、マスター・プロセスは、それを行う方法です?
まず、マスター・プロセス信号を受信した後、最初のコンフィギュレーションファイルをリロードし、新しいワーカープロセスを開始し、すべての古いワーカープロセスに信号を送り、それらを言ってます名誉退職。
新しいワーカーを開始した後、彼はマスターからの信号を受信した後、古い労働者は、それはもはや新しい要求を受信し、治療終了後の現在のプロセス内の要求が保留中の完了している間、新しい要求を受けていない始めました、終了します。
もちろん、信号はnginxのバージョン0.8の後、操作の比較的古いモードであるマスター・プロセスに直接送信され、私たちの管理を容易にするためのコマンドラインパラメータのシリーズをご紹介します。たとえば、。/ nginxの-sリロード、nginxの,. / nginxの-s停止を再起動することで、nginxのは、実行を停止することです。それを行うにはどのように?我々はまだリロードを取る、我々は注文を実行する際に、新たな決意がパラメータをリロードした後、我々は新しいプロセスnginxのを開始し、nginxのプロセスされている、ことがわかり、私たちは知っている私たちの目的は、nginxのを制御することですコンフィギュレーションファイルをリロードするには、マスター・プロセスに信号を送り、その後、次のアクション、そして私たちは、同じプロセスを習得するために直接信号を送信します。
ワーカープロセス:
基本的なネットワークイベントは、それがに対処するためのワーカープロセスです。複数のワーカープロセス間で同じである、彼らはクライアントの要求から、同じ競争している、プロセスが間に互いに独立しています。リクエストが唯一のプロセスワーカー、ワーカープロセスで処理することができ、他のプロセスが要求を処理することはできません。設定可能なワーカー・プロセスの数は、通常、我々は、CPUコアの数が同じマシンを設定し、プロセスモデルとイベント処理モデルnginxのであった理由は不可分です。
ワーカープロセス間の平等は、各プロセスは、要求を処理する機会は同じです。私たちは80 HTTPサービスのポートを提供する場合、各プロセスに対する接続要求がそれを行う方法を、この接続に対処する可能性がある?
すべてのマスターの最初には、に応じて生成されたリスニングソケットのポートに対応するコンフィギュレーション・ファイルになります、その後、より速く、よりワーカープロセスは、各ワーカーがソケットからのメッセージを受け付けることができるように、(実際には、これは労働者がソケットを持つたびにする必要がありますが、ソケットがアドレスを聴取していることは同じです)。一般的に、各ワーカー、上接続が通知を受け取ることができる1つだけのプロセスがこの接続を受け入れることができる場合、他の人がこの現象に対処するために、いわゆるショック基現象である障害を受け入れます。nginxのは名前から、私たちは、これが受け入れ共有ロックのプラスで見ることができ、この事accept_mutexを提供します。あなたはロック、同じ時間を持っていたら、それが唯一のプロセス接続私達accpetを持つことになりますので、雷群れに問題があるでしょう。accept_mutexが制御可能な選択肢である、我々はディスプレイをオフにすることができ、デフォルトで有効になっています。
ワーカープロセスが後にこの接続を受け入れるとき、彼らは要求を読み始める、要求を解析し、データを生成した後、要求を処理し、その後、クライアントに返され、最終的には切断、こうした完全な要求は、このようなものです。
私たちは、ワーカープロセスによって完全に処理要求を見て、ワーカープロセスでのみ扱うことができます。

おすすめ

転載: blog.51cto.com/14101466/2416689