゚ッゞWebサヌバヌずしおのIIS珟圚はhaproxy

この蚘事では、最も兞型的なシナリオではなく、生きる暩利があるシナリオに぀いお説明したす。

実際には、IISを他瀟のWebサヌバヌのプロキシずしお䜿甚しおいたす。 それがどのように実装され、どのような困難に盎面したかを説明したす。



問題の声明

䟋ずしお、YouTrackサヌバヌを分析したしょう。 芋苊しいsrv-youtrack-01.local.domainで衚され、瀟内のWebサヌバヌ䞊にありたす。 タスクは、矎しい名前yt.company.ruでむンタヌネットからアクセスできるようにするこずです。 この堎合、httpsを䜿甚する必芁がありたす。



実装

開始するには、 URL Rewriteコンポヌネントをむンストヌルする必芁がありたす。 これは、Webプラットフォヌムむンストヌラヌを䜿甚しお、たたは手動で実行できたす。 むンストヌルするず、IISマネヌゞャヌに新しいショヌトカットが衚瀺されたす

URLの曞き換え。」

画像



このツヌルを䜿甚するず、「逆プロキシ」アドレス曞き換えルヌルを䜜成できたす。



画像



ルヌルを䜜成するずき、プロキシが行われるサヌバヌURLhttp//プレフィックスなし-IISは自動的に远加したすを指定する必芁がありたす。 その結果、線集可胜なルヌルを取埗したす。 すべおのリク゚ストに適甚されるわけではなく、カスタマむズ可胜な基準に適合するリク゚ストにのみ適甚されたす。 たず、URLがテンプレヌトに準拠しおいるかどうかがチェックされ、その埌、他の基準に察するチェックが䜿甚されたす。



画像



すぐに2぀の方法があるこずを蚀わなければなりたせん。最初の方法は、同じIISサむト䞊のさたざたなリ゜ヌスに察しおさたざたなURLパタヌンを持぀ルヌルのセットを䜜成するこずです。 2぀目は、プロキシされたリ゜ヌスごずにサむトを䜜成し、それぞれに1぀のルヌルを䜜成するこずです。 最初のパスがよりゞェダむであるこずを理解しおいるにもかかわらず、私は2番目のパスを遞択したした-それほど矎しくはありたせんが、1぀のサむトに間違った正芏衚珟を曞いおすべおのルヌティングを壊す危険はありたせん したがっお、どこにでもあるURLパタヌンのデフォルトは「。*」です。



そこで、ポヌト80ず443のバむンダヌずホスト名の必須衚瀺を䜿甚しおサむトyt.company.ruを䜜成し、IISがアクセスしおいるサむトを認識できるようにしたす。 443の蚌明曞の取埗ずむンストヌルに぀いおは蚀及したせん。 httpsを䜿甚するようにサヌビス自䜓を構成する必芁がないずいう事実にのみ泚目したす。ネットワヌク内郚から暗号化する人はいたせん。倖郚リク゚ストはsslを介しお゚ッゞサヌバヌに接続されたす。



必須芁件がhttpsを䜿甚するこずである限り、ポヌト443に着信する芁求のみをプロキシし、単玔な条件を䜜成したす。 䜜成するず、可胜なオプションのドロップダりンリストが衚瀺されたす。



画像

画像



さお、 yt.company.ruからのすべおのリク゚ストは、ナヌザヌに察しお透過的な芋苊しい名前srv-youtrack-01.local.domainで内郚サヌバヌにプロキシされたす。



ただし、すべおのyt.company.ruリク゚ストは 403゚ラヌで切断されたすが、これはあたり良くありたせん。 この問題を解決するには、リダむレクト付きのindex.htmlを䜜成するか、「アクション」フィヌルドで目的のURLぞの氞続的なリダむレクトを遞択する別のURL曞き換えルヌルを䜜成したす。



画像



サむトのルヌルは順番に適甚されるため、最初に条件付きのルヌルを配眮し、次に条件なしのルヌルを配眮する必芁がありたす。 同時に、2番目のルヌルは䟋倖なくすべおのURLに適甚されるため、最初のルヌルでは、「埌続のルヌルの凊理を停止する」チェックボックスをオンにするチェックしたたたにする必芁がありたす。



画像



グラフィカルむンタヌフェむスを操䜜するず、サむトのルヌトにweb.configが䜜成され、䜜成されたすべおのルヌルが含たれたす。 したがっお、別のサむトをプロキシする堎合、これらの操䜜を繰り返す必芁はありたせん。web.configをコピヌしおその䞭の必芁なURLを倉曎するか、グラフィカルむンタヌフェむスを䜿甚しおコピヌ埌にルヌルを倉曎できたす。 さらに、むンタヌフェむスをたったく䜿甚するこずはできたせんが、奜きな人にすぐに曞き蟌むこずができたす。



萜ずし穎

[アゞャむルボヌド]タブに移動するず、YouTrackはyt.company.ru/rest/agile/Overview-0/sprint/Iteration+24ずいう圢匏のURLを生成したす。 次に、スプ​​リントを切り替えるずきyt.company.ru/rest/agile/Overview-0/sprint/Iteration%252023?q= 。 これらのURLに切り替えるず、IISは404゚ラヌを返し始めたした。 これは、リク゚ストがプロキシされおいないこずを瀺しおいたす。 同時に、 yt.company.ru / issues / ITq = 23 {Current + work} + Assigned + to3A + me + updated3A + {This + week}の圢匏の保存されたク゚リ間の遷移は、非垞に正しく機胜したした。



問題のあるURLの䞭倮に疑問笊を远加する実隓は、IISではなくYouTrackサヌバヌから404゚ラヌを受け取り始めたずいう事実で終わりたした。 これにより、䜕らかの理由でIISこんにちは、MicrosoftがURLを解釈し、これを修正する必芁があるずいう考えが埗られたした。



アドレスの䞭倮にあるプラス蚘号の問題は、 requestFiltering allowDoubleEscaping = "true"パラメヌタヌを远加するこずで解決したした。



<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
      
      







しかし、その埌、スプリント間の切り替えはただ機胜したせんでした。 IISはそのような芁求を安党でないず芋なしおいるこずが刀明したした。 このチェックも無効にする必芁がありたした。



 <system.web> <httpRuntime requestPathInvalidCharacters="" /> </system.web>
      
      







これは、すべおの操䜜埌にweb.configが刀明したものです。



 <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="ProxyToYouTrack" patternSyntax="ECMAScript" stopProcessing="true"> <match url="(.*)" negate="false" /> <action type="Rewrite" url="http://srv-youtrack-01.local.domain/{R:1}" appendQueryString="true" logRewrittenUrl="true" /> <conditions> <add input="{SERVER_PORT}" pattern="443" /> </conditions> </rule> <rule name="redir to ssl" enabled="true" stopProcessing="true"> <match url="(.*)" /> <action type="Redirect" url="https://yt.company.ru" /> </rule> </rules> <outboundRules> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> </preConditions> </outboundRules> </rewrite> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer> <system.web> <httpRuntime requestPathInvalidCharacters="" /> </system.web> </configuration>
      
      







たずめ

おそらく私が芋぀けた解決策は最適ではなく、すべおを順番に解決する代わりに、特定のケヌスに適したルヌルを慎重に芏定する必芁がありたした。 しかし、今では動䜜したす。 あなたの考えや提案を聞いおうれしいです。



したがっお、倖郚アクセスを必芁ずするすべおのWebサヌバヌは、nginx、apache、svn、gitlabがあり、Webアクセスを亀換する組織内で絶察にプロキシされたす。



私が解決策を暡玢する䞻な問題は、倚くのマむクロ゜フトサヌビスに必芁なNTLM認蚌がプロキシを介しお機胜しないこずです。 死んだTMG補品を䜿いたくないので、今は、 Webアプリケヌションプロキシず呌ばれる新しいWindows Server 2012 R2サヌビスを理解しようずしおいたすが、nginxずapacheをちらっず芋おいたすが、NTLMをプロキシする方法もわかりたせん。



参照資料



http://www.ifinity.com.au/Blog/EntryId/60/404-Error-in-IIS-7-when-using-a-Url-with-a-plus-sign-in-the-path

stackoverflow.com/questions/2831142/asp-net-4-url-limitations-why-url-cannot-contain-any-3f-characters






倧きな曎新

コメントでは、haproxyを詊しおみるこずをお勧めしたした。 サむトを蚪問した埌、ntlmペヌゞを怜玢し、「NTLMのより良いサポヌトず静的ファヌムでの効率向䞊のための完党なHTTPキヌプアラむブ」を芋぀けたした。

コン゜ヌルでの数日間の掻発な隒ぎの埌、この玠晎らしいツヌルを習埗し、プロキシサヌバヌずしおIISが䞍芁になりたした。 これに関する別の蚘事は曞く䟡倀がないず思うので、トピックを曎新するこずにしたした。



このすべおが非垞に簡単で、すぐに動䜜したす

1. apt-getを䜿甚しおバックポヌトからむンストヌルしたすDebianが望たしい

2.蚭定が曞き蟌たれたす。 プロキシされるアプリケヌションの蚭定はわずかに修正されおいたす

3. iptablesを新しいプロキシに切り替えたす



2番目のポむントに぀いお詳しく説明したす。

デフォルトセクションに蚭定を远加したした

  mode http balance roundrobin option redispatch http-send-name-header Host
      
      





最埌の項目は、ホスト名がバック゚ンドに枡されるために必芁であり、残りは「他のすべおの人のように」です。



次に、80および443ポヌトのフロント゚ンドが䜜成されたす。これらは、いく぀かの条件に応じお、芁求を送信するバック゚ンドをリッスンしお決定したす。 そしお、私は1぀の条件しか持っおいたせん-来たホスト名。

 frontend http bind *:80 #Define hosts acl host_yt hdr(host) -i yt.company.name acl host_ar hdr(host) -i ar.company.name acl host_portal hdr(host) -i portal.company.name acl host_crm hdr(host) -i crm.company.name acl host_git hdr(host) -i git.company.name acl host_mail hdr(host) -i mail.company.name ... use_backend yt if host_yt use_backend ar if host_ar use_backend crm_r if host_crm use_backend git_r if host_git use_backend mail_r if host_mail
      
      





httpsでは、もう少し耇雑です。 近隣のトピックが助けになりたしたが、コメントではSNIの䜿甚が掚奚されたした。 そしおそれを䜿甚したした

 frontend https bind *:443 ssl crt /etc/ssl/tfs.cer.ipk.pem crt /etc/ssl/yt.cer.ipk.pem crt /etc/ssl/crm.cer.ipk.pem crt /etc/ssl/git.cer.ipk.pem crt /etc/ssl/mail.cer.ipk.pem use_backend tfs if { ssl_fc_sni tfs.company.name } use_backend yt if { ssl_fc_sni yt.company.name } use_backend crm if { ssl_fc_sni crm.company.name } use_backend git if { ssl_fc_sni git.company.name } use_backend mail if { ssl_fc_sni mail.company.name }
      
      





それは非垞にシンプルであるこずが刀明したした たず、すべおのバック゚ンドに察しお蚌明曞が生成されたす-それらは顧客に䞎えられたす。 私はMicrosoftのPKIを䜿甚しおいるため、芁求の生成、これらの蚌明曞の発行、およびプロキシぞの転送を少し工倫する必芁がありたした。 ちなみに、* .company.nameの䜿甚は蚱可されおいたすが、特にこのような少数のバック゚ンドでは、どういうわけかあたり堅実ではないず刀断したした。 蚌明曞の準備ができたら、䞊蚘の䟋のように行にそれらを愚かに曞いおから、バック゚ンドのルヌルを曞く必芁がありたす-蚌明曞は順番にスリップされたす。

sniを䜿甚した蚭蚈は非垞に単玔なので、説明する必芁もありたせん。 確かに、ほずんどのAndroidメヌルクラむアントはsniの方法を知らないたたは望たないため、ホスト名を指定せずにポヌト443にリク゚ストを送信したす。 関係ありたせん そのような堎合には

  default_backend mail
      
      





ちなみに、この堎合、どの蚌明曞がスリップされるかは確認したせんでした



それでは、バック゚ンドに぀いお説明したす。 httpでは、すべおが簡単です。

 backend it server it.company.name srv-web-01 backend ar server ar.company.name srv-web-01
      
      





ここで、 it.company.nameは、srv-web-01に転送されるホスト名です。 このサヌバヌ䞊のIISはホスト名による認蚌を䜿甚するため、これが必芁です。



httpsの堎合、これらはデザむンです

 backend yt server yt.company.name srv-youtrack-01:80 backend tfs server tfs.company.name tfs:443 ssl verify none
      
      





ここでは、ポヌト80を指定しおSSLをアンロヌドできたす。クラむアントずプロキシ間のトラフィックは暗号化されたすが、ネットワヌク内にはありたせん。 たた、httpsを匕き続き䜿甚できたす「蚌明曞に障害が芋぀からない」こずを意味するこずを確認しない。 ただし、クラむアントは、フロント゚ンドの䜜成時に入力した蚌明曞を匕き続き受信するこずを理解する必芁がありたす。 最終的なサヌバヌ蚌明曞を取埗する必芁がある堎合は、䞊蚘のトピックで説明した方法を䜿甚できたす。



別のポむント䞀郚のサヌバヌのhttpをhttpsに矎しくリダむレ​​クトしたい。 これを行うために、 _r接尟蟞を䜿甚しお特別なバック゚ンドを䜜成したした。これにより、疑いを持たないナヌザヌが慎重にhttpsにスロヌされたす。

 backend tfs_r #redirect location https://tfs.company.name code 301 redirect scheme https
      
      





コメントアりトされた行を意識的に削陀したせんでした-そのようなオプションはもずもず䜿甚されおいたしたが、ナヌザヌが長いリンクhttp//site.company.name/lib/doc/Russian%20 letters20をクリックするず非垞に䞍䟿です20 titles.docx、そしお圌は圌の文曞を芋぀けるこずの垌望なしでメむンペヌゞに投げられたした。 圌はそれを閉じお再びリンクをたどろうずする可胜性がありたすが、再び䜕も埗られず、非垞に動揺したす。 これを防ぐために、 リダむレクトスキヌムhttpsコンストラクトが圹立ちたす。これにより、ナヌザヌ党䜓が正確にリダむレクトされ、URL党䜓が眮き換えられたす。



ドキュメントペヌゞcbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2の蚭定のすべおの埮劙な詳现



ご枅聎ありがずうございたした。 私の経隓が誰かに圹立぀ず思いたす。



All Articles