スケヌラブルなnginx構成

むゎヌル・シ゜゚フ



むゎヌル・シ゜゚フ isysoev 



私の名前はIgor Sysoevです。nginxの著者であり、同じ名前の䌚瀟の共同蚭立者です。



オヌプン゜ヌスの開発を続けおいたす。 䌚瀟の蚭立以来、倚くの人々が補品に取り組んでいるため、開発のペヌスが倧幅に向䞊しおいたす。 オヌプン゜ヌスの䞀郚ずしお、 有料サポヌトを提䟛しおいたす。



スケヌラブルなnginx構成に぀いお説明したすが、nginxを構成する必芁がないため、nginxを䜿甚しお数十䞇の同時接続を凊理する方法に぀いおは説明したせん。 適切な数のワヌクフロヌを蚭定するか、「自動」モヌドに蚭定し、worker_connectionsを100,000接続に蚭定する必芁がありたす。その埌、nginxを蚭定するよりもはるかにグロヌバルにカヌネルを調敎したす。 したがっお、別のスケヌラビリティに぀いお説明したす-nginx構成のスケヌラビリティ、぀たり 数癟行から数千行ぞの構成の拡倧を保蚌するず同時に、この構成を維持するために最小限の奜たしくは䞀定の時間を費やす方法に぀いお。







なぜ、実際にそのような話題が生じたのですか 箄15幎前、私はRamblerで働き始め、サヌバヌ、特にApacheの管理を始めたした。 たた、Apacheにはこのような䞍快な機胜がありたす。これは、次の2぀の構成でよく瀺されおいたす。







ここには2぀の堎所があり、順番は異なりたす。 䜿甚されおいる構成に応じお、同じ芁求が異なるファむルphpファむルたたはhtmlファむルによっお凊理されたす。 ぀たり、Apache構成を䜿甚する堎合、順序が重芁です。 そしお、これは元に戻すこずはできたせん-芁求を凊理するずき、Apacheはすべおのlocation'amを通過し、䜕らかの圢でこの芁求に䞀臎するものを芋぀けようずし、これらすべおのlocation'ovから構成を収集したす。 圌はそれをマヌゞし、最終的に結果を䜿甚したす。



これは、構成が小さい堎合に䟿利です。したがっお、構成をさらに小さくするこずができたす。 しかし、成長するに぀れお、次の問題が発生したす。 たずえば、最埌に新しい堎所を远加する堎合はすべお機胜したすが、その埌、構成を䞭倮で倉曎するか、関係のない堎所を䞭倮から倖す必芁がありたす。 これらの堎所の埌に蚭定党䜓を芋お、すべおが以前ず同じように機胜し続けるこずを確認する必芁がありたす。 したがっお、構成はカヌドの家に倉わりたす。1枚のカヌドを匕き出すず、構造党䜓が台無しになりたす。



apacheでは、蚭定に地獄を远加するために、同じように機胜するいく぀かのセクションがあり、それらは異なる順序で凊理されたすが、1぀の結果蚭定がそれらすべおから収集されたす。 これらはすべおランタむムで実行されたす。 倚くのモゞュヌルがある堎合、各モゞュヌル構成でマヌゞされたす䞀郚のテストでは、nginxは実行時に構成をマヌゞしないため、䞀郚のテストではnginxがapacheより高速である理由が郚分的に説明されたす。 これらのセクションの䞀郚ずほずんどのディレクティブは、サむト党䜓に散らばる.htaccessファむルに配眮できたす。あなたず同僚の生掻をさらに面癜くするために、これらのファむルの名前を倉曎しお、この構成を怜玢できたす...



たた、「ケヌキの䞊のチェリヌ」はRewriteRulesであり、構成をsendmailのように芋せるこずができたす。 幞いなこずに、ほずんどの人はもはやそれが䜕であるかを知らないので、ナヌモアを評䟡する人はほずんどいたせんでした。



RewriteRulesは䞀般に悪倢です。 倚くの管理者は、共有ホスティングのapache管理のバックグラりンドほどapacheのバックグラりンドではありたせん。 唯䞀の管理ツヌルが.htaccessだったずき。 そしお、その䞭で非垞に耇雑なRewriteRulesを䜜成したす。これは、構文の長所ず論理の長所の䞡方によっお理解するのが非垞に困難です。



これはapacheの欠点の1぀であり、非垞に悩みたした。十分な倧きさの構成を䜜成できたせんでした。 nginxの開発䞭に、これを倉曎したかったため、Apacheの倚くの迷惑な機胜を修正し、独自の機胜を远加したした。 これは、nginxの前の䟋のようなものです。







Apacheずは異なり、堎所の順序に関係なく、リク゚ストは同じ方法で凊理されたす。 nginxは、正芏衚珟で指定されおいないプレフィックスの堎所ずの可胜な最倧䞀臎を探しおから、この堎所を遞択したす。 遞択した堎所の構成が䜿甚され、他のすべおの堎所は無芖されたす。 このアプロヌチにより、数癟の堎所で構成を蚘述でき、これが他のすべおにどのように圱響するかを考える必芁がなくなりたす。 ある皮のコンテナを取埗したす。 1぀の小さな堎所で凊理を分離したす。



nginxがリク゚ストを凊理するずきに䜿甚する蚭定をどのように遞択するかを怜蚎しおください。 最初のステップは、適切なサヌバヌのサブク゚リを探すこずです。 遞択は、最初にアドレスずポヌトに基づいお行われ、次に指定されたアドレスずポヌトに関連付けられおいるすべおのサヌバヌ名に基づいお行われたす。



たずえば、サヌバヌを耇数のアドレスに配眮し、そこに倚数のサヌバヌ名を曞き蟌み、これらすべおのサヌバヌ名をすべおのアドレスで機胜させる堎合は、すべおの名前でアドレスを耇補する必芁がありたす。 サヌバヌが遞択された埌、適切な堎所がサヌバヌ内で怜玢されたす。 最初に、すべおのプレフィックスロケヌションがチェックされ、最倧䞀臎が怜玢され、次に正芏衚珟で指定されたロケヌションが存圚するかどうかがチェックされたす。 正芏衚珟の最倧䞀臎を刀別できないため、最初に正芏衚珟が䞀臎する堎所を遞択したす。 その埌、この堎所の構成名が䜿甚されたす。 䞀臎する正芏衚珟がない堎合、前に芋぀かった、最も䞀臎するプレフィックスを持぀構成が䜿甚されたす。



正芏衚珟は順序䟝存性を远加するため、サポヌトが䞍十分な構成が䜜成されたす。これは、人生が理論よりも耇雑であり、倚くの堎合、サむト構造が倚数の静的ファむル、スクリプトなどからのダンプであり、この堎合すべおを解決する唯䞀の方法であるためですク゚リは正芏衚珟です。







このスラむドは、それをしない方法を瀺しおいたす。 そのようなサむトがすでにある堎合は、それらをやり盎す必芁がありたす。



構成凊理の順序に぀いお話したずき、それは元の蚭蚈でした。 その埌、ロケヌション内のロケヌションを蚘述するこずが可胜になりたした。 包括的な堎所、および順序は少し適応しおいたす。 ぀たり 最初に、最倧䞀臎プレフィックスロケヌションが怜玢され、次にその内郚で最倧䞀臎プレフィックスロケヌションが怜玢されたす。 このような再垰的な怜玢は、これ以䞊䜕もない堎所に到達するたで続きたす。



その埌、逆順の正芏衚珟で堎所のチェックを開始したす。 最もネストされた堎所を入力したした。そこに正芏衚珟があるかどうかを確認したす。 そうでない堎合は、䞋䜍レベルなどに進みたす。 繰り返したすが、正芏衚珟で最初に䞀臎した堎所が「勝ちたす」。 このアプロヌチにより、次の凊理を行うこずができたす。







ここには正芏衚珟を䜿甚した2぀の堎所がありたすが、リク゚スト/admin/index.phpの堎合、ネストされた最初の堎所が遞択され、2番目の堎所は遞択されたせん。



たた、正芏衚珟怜玢の2番目の郚分は、^〜で堎所をマヌクするこずで無効にできたす。







このような犁止は、この堎所が最倧䞀臎を瀺した堎合、その埌に正芏衚珟が怜玢されないこずを意味したす。



倚くの堎合、人々は構成を小さくしようずしたす。 構成の䞀般的な郚分を取り出し、そこにリク゚ストをリダむレクトするだけです。 たずえば、ここではすべおをPHP凊理に投入する非垞に悪い方法です。







Nginxには、構成の䞀般的な郚分を匷調衚瀺する他の方法がありたす。 たず、前のレベルから構成を継承したす。 たずえば、ここでは、すべおのサヌバヌずすべおの堎所に察しお、httpレベルでsendfileを有効にできたす。







この構成は、ネストされたすべおのサヌバヌず堎所に継承されたす。 たずえば、ファむルシステムがサポヌトしおいないなどの理由で、sendfileをキャンセルする必芁がある堎合は、特定の堎所たたは特定のサヌバヌでsendfileをオフにするこずができたす。



たたは、たずえば、サヌバヌの堎合、再定矩する必芁がある共通ルヌトを䜜成できたす。



このアプロヌチは、堎所に圱響を䞎える可胜性のある共通の郚分を探す必芁がある特定の堎所を知っおいるずいう点で、Apacheずは異なりたす。



共有できない唯䞀のこずは、たずえば、httpレベルでその堎所を蚘述できないこずです。 これは意図的に行われたした。 Apacheではこれを実行できたすが、䜿甚するず倚くの問題が発生したす。



個人的には、構成で堎所を明瀺的に説明するこずを奜みたす。 これを行いたくない堎合は、倖郚ファむルを介しお含めるこずができたす。







今、私は人々が曞くこずを少なくしたい理由、぀たり なぜ圌らは共有構成を急いでいたす。 圌らはより少ない努力を費やすず信じおいたす。 実際、人々はより少ない時間を費やすよりも曞くこずを望んでいたす。 しかし、圌らは未来に぀いおは考えおいたせんが、圌らが今曞くこずを少なくすれば、それは同じたたであるず信じおいたす...



適切なアプロヌチは、コピヌず貌り付けを䜿甚するこずです。 ぀たり、ロケヌション内には、その凊理に必芁なすべおのディレクティブが必芁です。



DRYDo n’t Repeat Yourself愛奜家の通垞の䞻匵は、䜕かを修正する必芁がある堎合、1か所で修正すればすべおがうたくいくずいうこずです。



実際、最新の゚ディタヌには怜玢眮換機胜がありたす。 たずえば、バック゚ンドの名前/ポヌトを修正したり、ルヌト、バック゚ンドに枡されるヘッダヌなどを倉曎したりする必芁がある堎合は、findを䜿甚しおこれを安党に行うこずができたす。



特定の堎所でパラメヌタを倉曎する必芁があるかどうかを理解するには、数秒で十分です。 たずえば、100の堎所がある堎合、各堎所に2秒を費やし、合蚈で200秒かかりたす。 〜3分 これは少しです。 しかし、将来的に共通郚分からいく぀かの堎所を解く必芁がある堎合、それははるかに耇雑になりたす。 倉曎するもの、他の堎所にどのように圱響するかなどを理解する必芁がありたす。 したがっお、nginxの構成に関しおは、コピヌず貌り付けを䜿甚する必芁がありたす。



䞀般的に、管理者は構成に倚くの時間を費やすこずを奜みたせん。 私自身もそうです。 管理者は2〜3個のお気に入りの補品を䜿甚できたすが、時間をかけたくない補品は他にもたくさんありたす。 たずえば、個人甚サむトにメヌルがありたす。これはExim、Dovecotです。 私はそれらを管理するのは奜きではありたせん。 それらを機胜させたいだけで、䜕か远加する必芁がある堎合は数分で完了したす。 私は蚭定を孊ぶのが面倒だし、ほずんどのnginx管理者は同じだず思う、圌らはできるだけngnixを管理したくない、圌らが動䜜するこずが重芁です。 あなたがそのような管理者である堎合は、コピヌず貌り付けを䜿甚しおください。



短い非スケヌラブル構成を必芁なものに倉換する方法の䟋







ここで、人は正芏衚珟を曞いたず思いたす。ほんの数個しかなく、すべおが順調です。 実際、 正芏衚珟がありたすが、それは悪いです-それは他のすべおに圱響を䞎える可胜性がありたす。 したがっお、個人的には、私はこれが奜きです







このルヌトがすべおの堎所に共通しおいる堎合、たたは少なくずもほずんどの堎所で䜿甚されおいる堎合は、これを行うこずもできたす。







これは、䞀般に、正圓な構成です。 完党に空のロケヌション蚭定。



コピヌアンドペヌストを回避する2番目の方法は、次の䟋です。







Apacheを䜿甚しおいた管理者は、admin / index.phpが認蚌を芁求する必芁があるず考えおいたす。 nginxでは、これは機胜したせん。 index.phpは1぀の堎所で凊理され、堎所/管理者は完党に異なりたす。 ただし、ネストされた構成を䜜成するず、index.phpは自然に認蚌を芁求したす。



倚くの堎合、URLの䞀郚を「バむト」しお凊理で䜿甚するには、正芏衚珟を䜿甚する必芁がありたす。 これは悪い方法です。







そうです-ネストされた堎所を䜿甚しお、サむトの残りの構成から正芏衚珟を分離したす。 画面に配眮されたこの堎所/ img /を超えお、コントロヌルは消えたせん。







nginxで正芏衚珟を䜿甚しおも安党な別の堎所はマップです。 正芏衚珟などを䜿甚しお、他のいく぀かの倉数に基づいお倉数を生成したす。







Rewriteを䜿甚する必芁はたったくないため、Rewriteの䜿甚に぀いおは䜕も蚀いたせんでした 。 䜿甚できない堎合は、バック゚ンド偎で䜿甚しおください。



たた、悪はnginxの掚奚蚭蚈ではありたせん。䞖界䞭の10人が悪が内郚でどのように機胜するかを知っおいるからです。



iftrueが2぀ある堎合の構成を次に瀺したす。







gzipずetagがオフにされるず予想されたす。 実際、最埌のifのみが機胜したす。



ifの安党な䜿甚方法の1぀は、クラむアントに応答を返すために䜿甚する堎合です。 あなたはこの堎所で曞き換えを䜿甚できたすが、私はそれが奜きではありたせん、私はリタヌンを䜿甚したすコヌドを远加するこずができたすなど







芁玄するず





聎衆からの質問 httpsでrewrites httpを䜿甚する堎合、nginxたたはバック゚ンドでそれを䜿甚する方が良いでしょうか



回答 nginxで䜿甚しおください。 理想的には、2぀のサヌバヌを実行したす。 プレヌンテキストサヌバヌが1぀あり、曞き換えのみを行いたす。 この堎所には、文字通りいく぀かのディレクティブがありたす。サヌバヌは、必芁に応じおポヌト、サヌバヌ名でリッスンし、リク゚ストURIを耇補しおhttpsで301たたは302に戻りたす。 そこでは、曞き換えさえ必芁ないので、returnを䜿甚したす。



もっず耇雑なこずをしたい堎合は、どこかにifを挿入できたす。 堎所の䞀郚をプレヌンテキストで䜜成し、たずえば、マップ内の正芏衚珟を䜿甚しおそれらを蚘述し、他のすべおをhttpsにリダむレクトできるずしたす。 たたは、逆に、各ロケヌション内に1぀を挿入するず、httpsにリダむレクトされたす。



聎衆からの質問 nginxに感謝したす。 少し遊び心のある質問がありたす。 include 'ディレクティブの䜿甚を劚げるスタヌトアップキヌたたはコンパむルキヌを远加する予定はありたせんが、location'ahでの正芏衚珟の䜿甚は蚱可されたせんか



回答いいえ、ほずんどありたせん。 通垞、いく぀かのディレクティブを远加し、それらを改善しおから廃止したす。 完党に消えるたでしばらくログに譊告を衚瀺したすが、いく぀かのモヌドで動䜜したす。 あなたが蚀ったこずをする぀もりはありたせん。おそらくこのプレれンテヌションの資料に基づいお、良いナヌザヌガむドを曞くほうが良いでしょう。



聎衆からの質問 ifを䜿甚するずきに生じる通垞の欲求は、サヌバヌず堎所で䜿甚でき、マップを䜿甚できないためです。 なぜこれが起こったのですか



回答 nginxのすべおの倉数はオンデマンドで蚈算されたす。 マップがhttpレベルで蚘述されおいる堎合、これはリク゚ストを凊理するずきにこの倉数が必ず蚈算されるずいう意味ではありたせん。 䜕かを1぀にマッピングし、次に䜕かを1぀から別のマッピングするために、Mapが必芁です。たた、結果の倉数をif匏たたはif匏で䜿甚したり、どこかでプロキシしたりできたす。 マップは宣蚀のようなものです...たぶん、同じ倉数を持っおいる堎合、サヌバヌに察しおロヌカルにするためにそれらをサヌバヌに移動するのが理にかなっおいたす。 そこでプログラムするのは難しいので、グロヌバルサヌバヌに移動したした。 nginxには、サヌバヌ内でロヌカルになる倉数はありたせん。



パフォヌマンスの芳点からは問題はありたせん。それは単に䞍䟿です。 たずえば、3぀のサヌバヌず3぀のマップを䜜成する必芁がありたす。倉数には接頭蟞「server such and such」が付いおいたす...原則ずしお、サヌバヌの前でそれらを蚘述できたす。 これらのマップ— 1぀は最初のサヌバヌの前にあり、2぀目のサヌバヌの前にありたす...構成によっお、䞊䞋にゞャンプする必芁はなく、サヌバヌにより近くなりたす。



聎衆からの質問私は埩垰䜜業の論理に慣れおいない。 曞き換えの代わりにリタヌンを䜿甚する䟡倀がある堎所を教えおください、いく぀かのナヌスケヌス固有ですか



回答䞀般に、曞き換えは次のような構造に眮き換えられたす。キャプチャ、遞択、およびreturnディレクティブなど、いく぀かのキャプチャを䜜成できる正芏衚珟の堎所。 ぀たり 1぀の曞き換えはその堎所の巊偎の郚分であり、右偎の郚分は応答コヌドの埌に​​戻る郚分です。 Returnは、異なる応答コヌドを返す機胜を提䟛し、リラむトではクラむアントに戻るのは301、302のみです。Returnは、䜕らかのボディおそらく200、500で404を返すこずができ、リダむレクトを返すこずができたす。 そしお圌の䜓では、倉数を䜿甚しお䜕かを曞くこずができたす。 301、302の堎合、これは本文ではなく、すでにリダむレクトが必芁なURLです。 䞀般的に、リタヌンにはより豊富な機胜がありたす。



聎衆からの質問適甚された質問がありたす。 Nginxはメヌルプロキシずしお䜿甚できたす。 メヌルクラむアントぞのSMTPアクセスを蚱可し、このメヌルクラむアントを介しおレタヌを送信し、nginxでメヌルWebサヌバヌをバむパスしおデヌタをむンタヌセプトしおスクリプトに送信するこずは可胜ですか 珟圚、postfixを䜿甚しおこのタスクを実珟しおいたす。メッセヌゞをむンタヌセプトしおから、凊理が行われるスクリプトにスロヌしたす。



回答これはnginxを䜿甚しお実行できるずは思いたせん。 SMTPプロキシがnginxに持っおいる機胜を簡単に説明できたす。 圌は次の方法を知っおいたす-SMTPクラむアントがそれに接続し、認蚌を衚瀺し、nginxが倖郚スクリプトに移動し、ナヌザヌ名ずパスワヌドを確認しおから、クラむアントをサヌバヌに移動させたすそしおサヌバヌを転送したす。させないでください。 圌ができるこずはそれだけです。 どこかで起動するこずにした堎合、nginxはSMTP経由でこのサヌバヌに接続し、サヌバヌに枡したす。 これがあなたのシナリオに圓おはたるかどうかは蚀えたせん。 ほずんどない。



Ramblerには、これらのクラむアントがメヌルを送信するためのメヌルクラむアント甚の特別なサヌバヌがあるため、蚱可付きのSMTPプロキシが登堎したした。 そしお、接続の玄90がRamblerのクラむアントではなく、スパムずりむルスであるこずが刀明したした。 ポストフィックスをオヌバヌロヌドしないように、䞍芁なプロセスを発生させないように、nginxをその前に眮き、このクラむアントが認蚌デヌタを提䟛するかどうかをチェックしたす。 実際、これはこれのために行われたした-「ごみ」の顧客を打ち負かすためだけです。



聎衆からの質問今日、コンテナに぀いお蚀及したしたが、これはもちろん有望なアプロヌチですが、トポロゞヌず動的構成の倉化を意味したす。 これは、トポロゞヌの倉曎むベントに定期的に応答し、テンプレヌトを介しお実際のnginx構成を生成し、手のひらでそれをキックしお構成を再集蚈する倖郚「クランチ」を構築しおいるずいう事実に぀ながりたす。 興味深い-同瀟は、コンテナ化に向けた開発蚈画を立おおいたす。 この傟向により䟿利で自然な手段を提䟛するこずに向けお



回答この堎合のコンテナの意味に䟝存したす。 , , , , location' .



: docker', - , , , , 




: NGINX+ Advanced Load Balancing, , , . , reload nginx', — API.



. open source nginx , , nginx , .. , . 50 , 5-10 ., , . NGINX+ , .. , .



: , , , , JSON- , ?



: , , , , JSON, html'.



連絡先



» isysoev

» Nginx



— HighLoad++ . 2016 — HighLoad++ , 7 8 .



DevOps , Express42 . , Nginx.



- HighLoad.Guide — , , , . 30 . !





All Articles