テストサヌバヌぞのWebアプリケヌションの展開に関する考察

たえがき



以䞋のテキストは、圌぀たり、私が理にかなっおいる分野のいずれにおいおも䜓系的な教育を受けおいない人の実際の経隓ず独孊の衝動の結果です。 したがっお、ここでの難解な掚論には、プラティティスが散りばめられたす。 最初は私を打ち負かし、2番目は無芖したす。 䞀郚の人にずっおは、圌らは啓瀺になる可胜性がありたす。



テストWebを北にセットアップするための理想的なオプションに぀いお説明しようずしたすが、テストWebが通垞行う混乱を理解しおいたす。 頻繁にデプロむする必芁がある堎合、぀たり、プロゞェクトがアクティブな開発の段階でサヌバヌ䞊に存圚しおいる堎合、たたは異なる段階の耇数のプロゞェクトが存圚する堎合の状況に぀いお説明したす。 さたざたな開発者たたはチヌムがプロゞェクトに関䞎しおいるため、プロゞェクトを互いに分離する必芁がありたす。 ただし、サヌバヌは内郚にあるため、リヌス甚のサヌバヌのように管理プロセスをある皋床分離および自動化する必芁はありたせん。



サポヌトされおいるWebアプリケヌションの蚀語ずしお、さたざたなバヌゞョンのPythonの䜿甚に焊点を圓おたす。 RubyやPerlなど、他の蚀語にも倚くのこずが圓おはたりたすが。



Pythonプログラムは、 PEP 3333およびその以前のドキュメントであるPEP 333で説明されおいるWSGIプロトコル「wiskey」ず呌ばれるを䜿甚しおWebサヌバヌず察話したす。



シングルリンクアヌキテクチャ



1局アプロヌチの利点は、構成が簡単であり、メモリ消費量が少ないため、柔軟性が損なわれ、堎合によっおはパフォヌマンスが䜎䞋するこずです。



このような条件䞋で動䜜する最も人気のあるWebサヌバヌである珟代のWebの本圓の「スむスアヌミヌナむフ」は、Apache HTTPdですこの名前は「Apache」ず略されたす。 Apacheの珟圚のバヌゞョンである2.2および2.4に留意しおください。



第2局サヌバヌを䜿甚せずに、WSGIアプリケヌションをApacheに盎接接続するには、プラグむンApache甚語ではモゞュヌル mod_wsgiが䜿甚されたす。 WSGIは、 CGIプロトコルの高床なPython固有バヌゞョンです。 技術的には、Pythonむンタヌプリタヌより正確にはCPythonは、倖郚ラむブラリずしおmod_wsgiに組み蟌たれおいたす静的たたは動的-これはモゞュヌルの構築時に決定されたす。 Apacheが1぀のむンストヌルで1぀のmod_wsgiモゞュヌルのみに察応できるように、CPythonの1぀のバヌゞョンのみが同時にmod_pythonに統合できるこずは明らかです。 これは制限に぀ながりたす。mod_wsgiを䜿甚したシングルリンクアヌキテクチャでは、サヌバヌでPython2ずPython3の䞡方を䜿甚するこずはできたせん 。



マルチプロセッシングモゞュヌルの遞択は私たちにずっお䞍可欠です。 マルチコアマルチプロセッサコンピュヌタヌ構成の異なるコンピュヌティングコア間で効率的に負荷を分散するには、Webサヌバヌが耇数のリク゚ストを同時に凊理し、Webアプリケヌションの耇数のむンスタンスの起動を開始できる必芁がありたす。 䞊蚘の機胜を異なる方法で実行する2皮類のマルチプロセッシングモゞュヌルがありたす。



プリフォヌク



UNIXラむクな環境のWebサヌバヌによるCGIリク゚ストの簡略化された実行は次のようになりたすリク゚ストが受信されるず、サヌバヌはCGIアプリケヌションプロセスを生成し、環境倉数のリク゚ストパラメヌタヌず暙準入力ストリヌムのボディを枡したす。 最初の最適化は、生成プロセスに時間がかかり、リク゚ストぞの応答時間が長くなるずいう事実によっお匕き起こされたした。 CGIプログラムこの堎合、mod_wsgiに組み蟌たれおいるPythonむンタヌプリタヌの起動に時間を無駄にしないために、リク゚ストがサヌバヌに到着するたで、事前に起動し、入力ストリヌムを閉じずに䞀時停止状態に保぀だけで十分です。 サヌバヌが耇数のコヌドストリヌムを同時に実行できる堎合は、耇数のCGIハンドラヌを実行し、新しいハンドラヌが完了したずきに起動されるようにするこずは理にかなっおいたす。 䜜業䞭および埅機䞭のハンドラヌの数プヌルサむズを構成できたす。 1぀の芁求を凊理するず、プロセッサプロセスは次を受け入れるこずができたす。 リク゚ストが少なすぎる堎合、サヌバヌは䞍芁なアむドルプロセスを匷制終了したす。 たた、サヌバヌは、凊理するリク゚ストの数が特定のカスタマむズ可胜な制限に達するず、予防目的でプロセスを匷制終了したす。



これは、 mod_preforkおよびmod_itkモゞュヌルの動䜜方法ずたったく同じです。 埌者は、この仮想ホストの蚭定で蚭定されたナヌザヌに代わっお各仮想ホストにサヌビスを提䟛できるため、私たちにずっお最も興味深いものです。 しかし、それに぀いおは埌で。



劎働者



CGIプロセスの生成コストを「償华」するず同時にサヌバヌの党䜓的な負荷を軜枛する2番目の方法は、1぀のプロセスを䜿甚しお耇数のリク゚ストを同時に凊理するこずです。



説明されおいる戊略は、mpm_workerおよびmpm_eventモゞュヌルによっお実装されたす。 埌者はたた、いく぀かのアカりンティングアクションからリク゚スト凊理のメむンスレッドをアンロヌドし、これたでのずころ実隓的なステヌタスを持っおいたす。



ワヌカヌは、それ自䜓ではなく䞍安定で安党ではないず長い間考えられおきたしたが、他の倚くのApacheモゞュヌルがマルチスレッドモヌドに適応しおいないか、実装に゚ラヌがあったためです。 しかし、時間が経぀に぀れお、これらの問題は解決され、今では劎働者はビゞネスで䜿甚するのに十分安党です。



GILなどのCPython機胜のおかげで、mod_wsgiはマルチスレッド化された䜜業に非垞に簡単に適応できたしたが、この同じ機胜ではマルチスレッド化の利点を最倧限に掻甚するこずはできたせん。 GILは、1぀のプロセス内でPythonコヌドのすべおのスレッドがクォンタムごずに連続しお実行されるこずを保蚌したす。これにより、同時実行の錯芚のみが䜜成されたす。 しかし、これはPythonを開始たたはPythonから実行するCコヌドには適甚されたせんが、芁求パラメヌタヌの解析、WSGIハンドラヌぞのアドレスのマッピングなど-これはすべおCコヌドで行われたす。 したがっお、Pythonで䜜成されたサむトでは、mpm_workerを䜿甚するこずで特定のパフォヌマンスが向䞊したす。



2局アヌキテクチャ



2局アヌキテクチャでは、倖郚フロント゚ンドず内郚バック゚ンドの異なるレベルのWebサヌバヌを共同で䜿甚したす。



倖郚サヌバヌは、「リバヌスプロキシ」のようなプロトコルずプラグむンを䜿甚しお、ナヌザヌず内郚サヌバヌ間の仲介圹ずしお機胜したす。 さらに、倖郚サヌバヌは1990幎に䜜成されたHTTPプロトコルを実行したす。クラむアントに静的ファむルアセットを提䟛したす。 最近では、この機胜は本番環境のCDNサヌビスにしばしば移行されおいたす。



Apacheは倖郚サヌバヌずしおも䜿甚できたすが、軜量のnginx、たたはリ゜ヌスが限られおいる状況では、lighttpdがこの圹割に適しおいたす。 この圹割では、サヌバヌは芁求に察する迅速な応答ず、消費されるリ゜ヌスに関する謙虚さのみを必芁ずしたす。



通垞、内郚サヌバヌは、アプリケヌションのアヌキテクチャず蚀語に䟝存したす。 Pythonアプリケヌションは、 uWSGI 、 Green Unicorn、たたはtwistedやTornadoなどのマルチスレッドネットワヌクフレヌムワヌクに基づいた独自のサヌバヌを䜿甚するこずがよくありたす。 倚くのWebフレヌムワヌクには、戊闘操䜜に倚少なりずも適しおいるWebサヌバヌも含たれおいたす。 たずえば、Djangoに組み蟌たれおいるWebサヌバヌはデバッグ専甚であり、運甚環境ではより深刻なものに眮き換える必芁がありたす。 䞀方、組み蟌みのCherryPy Webサヌバヌは、戊闘負荷に察しお最適化されおいたす。



テストサヌバヌCIサヌバヌの特別な芁件



ファむル蚱可の問題



POSIXシステムのネットワヌクアヌキテクチャでは、特暩ナヌザヌのみがポヌト1〜1024にアクセスできるず想定しおいたす。 ポヌト80HTTPおよび443HTTPSはこの制限に該圓するため、Webサヌバヌの芪プロセス2局アヌキテクチャに関しおは倖郚は垞にルヌト暩限を持っおいたす。



しかし、CGIスクリプトがセキュリティ䞊の理由で䞍必芁に広い暩利を䞎えるこずは望たしくありたせん。 したがっお、スクリプトずデヌタを䜿甚する堎合、Webサヌバヌは垞に特暩を通垞のナヌザヌのレベルたで䞋げたす。 Apacheのこのようなナヌザヌは、環境倉数APACHE_RUN_USERおよびAPACHE_RUN_GROUPによっお定矩されたす。 Debianおよびその掟生ディストリビュヌションでは、このナヌザヌの名前は「www-data」です。 システムのセキュリティをさらに匷化するために、他のサヌビスナヌザヌず同様に、www-dataナヌザヌはシェルを持たず、システムにログむンできたせん。



Webアプリケヌションがサヌバヌに䞀床むンストヌルされ、将来倉曎されない堎合ナヌザヌがダりンロヌドしたファむルを陀く、高い特暩を持぀ナヌザヌずしおサヌバヌにログむンし、適切なディレクトリ '/ var / www'でファむルを展開するこずは論理的ですDebianでおよびこれらのファむルの所有者を倉曎したす。



# chown -R www-data:www-data /var/www/
      
      





開発サヌバヌにずっお、この方法は䞍䟿であり、特暩アカりントを絶えず䜿甚しおいるため懞念を匕き起こすこずは明らかです。 詳现な回答を含むディレクトリおよびWebサヌバヌデヌタぞの理想的なアクセス暩に぀いおの質問は、 こちらをご芧ください 。 この蚘事は、Serverfaultに関する正芏の質問のリストにありたす。これは䜕かを意味したす。



この蚘事の本質は次のずおりです。







議論で蚀及されおいないのは、chmodずchownを䜿甚したこれらすべおの操䜜の猛烈な耇雑さであり、その結果、脆匱性に぀ながる人的゚ラヌの可胜性が高いこずです。



Apacheで利甚可胜な特暩分離ツヌルを䜿甚するか、2局アヌキテクチャに切り替えるず、すべおがより簡単で安党になりたす。



Apache特暩共有ツヌル



mpm_itk



mpm_itkモゞュヌルを䜿甚するず、どのナヌザヌで最も簡単で最も自然な方法でWebアプリケヌションを実行するかを決定できたす。



 <VirtualHost *:80> <IfModule mpm_itk_module> AssignUserID johnd developers </IfModule> 
 </VirtualHost>
      
      







mod_suexec



䜕らかの理由で別のマルチプロセッサモゞュヌルの䜿甚を䜙儀なくされた堎合は、 mod_suexecが圹立ちたす。 欠点はおそらくセットアップの盞察的な耇雑さであるず考えるこずができたすが、これは゜ヌスからむンストヌルする堎合のみです。 ディストリビュヌションでは、すべおが自動化されおいたす。 たた、mod_suexecの䜿甚は、仮想ホスト構成の単䞀のディレクティブに芁玄されたす。



 <VirtualHost *:80> <IfModule mod_suexec.c> SuexecUserGroup johnd developers </IfModule> 
 </VirtualHost>
      
      







テストサヌバヌ䞊の2局アヌキテクチャ



倚くの堎合、サヌバヌのパフォヌマンスを最適化するために2局アヌキテクチャが䜿甚されたす。 開発者は、速床よりもWebアプリケヌションの展開の利䟿性をより重芖しおいたす。 テストサヌバヌで2局アヌキテクチャを䜿甚するこずには、特定の利点もありたす。



利点には、開発者が内郚サヌバヌのむンストヌルず構成を担圓し、最適なパラメヌタヌず起動方法を決定するずいう事実が含たれたす。 内郚サヌバヌは開発者特暩で動䜜し、プログラムファむルずプロゞェクトディレクトリぞのアクセス暩の最適な蚭定に関する質問はなくなりたした。 ホストログも開発者が完党に自由に䜿甚できたす。 Webアプリケヌションは、他のプロゞェクトに関係なく、virtualenvで指定されたバヌゞョンのPythonを䜿甚できたす。 サヌバヌ管理者が凊理する必芁があるのは、倖郚サヌバヌず内郚サヌバヌが通信するための静的倉数ずUNIX゜ケットたたは非特暩ポヌトを備えたディレクトリだけです。



開発者は、サヌバヌの自動起動ずその円滑な運甚にも責任を負いたす。 前者がcrontab -eコマンドで簡単に解決できる堎合は、埌者にスヌパヌバむザヌを提䟛できたす。



Webサヌバヌの再起動



Apacheを唯䞀のサヌバヌずしお䜿甚する堎合、蚭定に「 MaxRequestsPerChild 1 」ディレクティブを远加する必芁がありたす。 これにより、開発者はサヌバヌを再起動する必芁がなくなりたす。 リク゚ストごずにむンタヌプリタヌの新しいむンスタンスが起動されるため、サむトコヌドのすべおの倉曎はすぐにその䜜業に反映されたす。



もちろん、リク゚ストハンドラの二次䜿甚を犁止するず、サヌバヌのパフォヌマンスが䜎䞋したすが、それ以倖の堎合は、コヌドを倉曎するたびにサヌバヌを再起動する必芁がありたす。 Apacheを再起動するには、WSGI固有の方法ず汎甚の2぀の方法がありたす。







2局アヌキテクチャを䜿甚する堎合は、内郚サヌバヌのみを再起動する必芁がありたす。 展開が実行されるのず同じナヌザヌの代わりに機胜するため、再起動たたは再起動の必芁なしに蚭定しおも問題はありたせん。



結論



2å±€Webサヌバヌアヌキテクチャは、同じ䌁業内の耇数の開発者たたは開発チヌムが䜿甚するテストサヌバヌに最適です。 サヌバヌ管理者を倚数のルヌチンから解攟し、開発者がプロ​​ゞェクトを実装する手段をより自由に遞択できるようにし、ハヌドりェアリ゜ヌスをより効率的に䜿甚できるようにしたす。 同時に、開発の利䟿性は生産性の䜎䞋を犠牲にしお達成される堎合がありたす。 しかし、組織の資金が非垞に限られおおり、1぀のサヌバヌにテストプロゞェクトず戊闘プロゞェクトを配眮するこずを䜙儀なくされた堎合でも、この堎合もセキュリティずかなり良いレベルのパフォヌマンスを実珟できたす。



All Articles