これを行うための良い方法は何ですか? きれいにすることさえ可能ですか?
理想的には、パケット ヘッダーを使用して、要求を処理するサーバーを決定したいと考えています。ただし、より簡単な/より良い方法があれば教えてください。
これを行うための良い方法は何ですか? きれいにすることさえ可能ですか?
理想的には、パケット ヘッダーを使用して、要求を処理するサーバーを決定したいと考えています。ただし、より簡単な/より良い方法があれば教えてください。
両方のサーバーが同じ IP アドレスで同じポートをリッスンすることは不可能です。単一のソケットは単一のプロセスによってのみ開くことができるため、特定の IP/ポートの組み合わせに対して構成された最初のサーバーのみが正常にバインドされ、2 番目のサーバーは正常にバインドされます。失敗します。
したがって、目的を達成するための回避策が必要になります。おそらく最も簡単なのは、プライマリ IP/ポートの組み合わせで Apache を実行し、mod_rewriteを使用して IIS (別の IP および/またはポート用に構成する必要があります) への要求をルーティングすることです。
IIS が実行される代替 IP とポートは、サーバーに接続しているクライアントに到達できる必要があることに注意してください。使用可能な IP アドレスが 1 つしかない場合は、一般にファイアウォールによってブロックされていない IIS ポートを選択するように注意する必要があります。 (SSL ではなく通常の HTTP を実行している場合でも、8080 または 443 が適切なオプションである可能性があります)
PSまた、他のサーバーが同じサーバー上の任意のIPアドレスのポート80で実行できるようにする前に、httpcfgを使用してIISのデフォルト構成を変更する必要があることに注意してください。それを行う手順については、Micky McQuadeの回答を参照してください...
両方がポート 80 でリッスンできるように、2 つの別々の IP アドレスを持つことを提案するこの投稿を見つけました。
ソケット プールのために IIS を変更しなければならないという警告がありました。上記のリンクに基づく手順は次のとおりです。
httpcfg.exe
Win2003 CD のサポート ツール エリアからユーティリティを抽出します。net stop http /y
httpcfg set iplisten -i 192.168.1.253
httpcfg query iplisten
(リストされている IP は、IIS がリッスンする唯一の IP アドレスであり、他の IP アドレスではありません。)net start w3svc
IP アドレスが 1 つしかなく、1 つのサーバーに複数のサイトがある場合は、IIS を 以外のポートでリッスンするように構成できます80
。たとえば8080
、各サイト (既定のものを含む) のプロパティで TCP ポートを設定します。
Apache で有効にmod_proxy
してからmod_proxy_http
、(他のすべての後に) キャッチオール VirtualHost を追加して、Apache が明示的に処理しない要求が IIS に「転送」されるようにします。
<VirtualHost *:80>
ServerName foo.bar
ServerAlias *
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
</VirtualHost>
これで、Apache が一部のサイトにサービスを提供し、IIS が他のサイトにサービスを提供することができますが、ユーザーには目に見える違いはありません。
編集: IIS サイトでは、ヘッダーを含め、応答内の URL にポート番号を含めてはなりません。
少なくとも、ディストリビューションの一部である mod_proxy と mod_proxy_http が必要です (ただし、毎回自動的にビルドされるわけではありません)。次に、ここを見ることができます: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
virtualhost コンテキストでの最も単純な構成は次のとおりです。
ProxyPass /winapp http://127.0.0.1:8080/somedir/
ProxyPassReverse /winapp http://127.0.0.1:8080/somedir/
(webapp によっては、実際の構成がより洗練されたものになる場合があります。) これにより、パス winapp/ 上のすべての要求が透過的に Windows サーバーにリダイレクトされ、結果の出力がクライアントに戻されます。
注意: 配信されたページのリンクに注意してください: リンクは書き換えられないため、アプリで一般的に相対リンクを使用する場合は、多くの手間を省くことができます。
<a href=../pics/mypic.jpg">
すべてのリンクが絶対的であるという通常の統合の悪夢の代わりに:
<a href="http://myinternalhostname/somedir/crappydesign.jpg">
後者はほぼ毎回悪いです!
ページ内のリンクを書き換えるために mod_proxy_html (mod_proxy_http と混同しないでください!) がありますが、これは別の話であり、残酷な話でもあります。
2 つの異なる IP アドレス (推奨) か、1 つの Web サーバーがもう一方の IP アドレスをリバース プロキシしている (ポート <>80 でリッスンしている)。
例: Apache はポート 80 でリッスンし、IIS はポート 8080 でリッスンします。すべての http 要求は (もちろん) 最初に Apache に送信されます。次に、すべての要求を特定の (名前付きの仮想) ドメインに転送するか、特定のディレクトリ (たとえばhttp://www.example.com/winapp/ ) を含むすべての要求をIIS に転送するかを決定できます。
この概念の利点は、パブリックをリッスンするサーバーが 2 つではなく 1 つだけであることです。2 つの別個のサーバーを使用する場合と同様に、より柔軟です。
欠点: 一部の Web アプリケーションの設計はお粗末で、リバース プロキシ インフラストラクチャに統合するのは非常に困難です。動作中の IIS Web アプリケーションは動作中の Apache に依存しているため、いくつかの相互依存関係があります。
Windows 10 をインストールすると、この問題が発生しました。Apache(ipv4) とスプーラー サービス(ipv6) が同じ 80 ポートをリッスンします。
行を変更するapache httpd.confファイルの編集を解決しました
聞く 80
に
聞く 127.0.0.1:80
それは完全に真実ではありません。たとえば、HTTP Windows では URL ベースのポート共有がサポートされているため、複数のプロセスが同じ IP アドレスとポートを使用できます。
これはかなり古い投稿だと思いますが、この問題の答えを探しているときにこれに出会いました。いくつかの回答を読んだ後、それらは非常に長く続いているように見えるため、約 5 分後に次のように問題を非常に簡単に解決することができました。
Apache の httpd.conf は、リッスン ポートを 80 のままにし、「サーバー名」を FQDN/IP :80 のままにします。
次に、IIS の場合、左側のナビゲーション ドロップダウンで [管理サービス] > [IIS マネージャー] > [サイト] に移動し、右側のウィンドウで一番上の行 (既定の Web サイト) を選択し、右側でバインディングを選択します。
http > edit を選択して 81 に変更し、サーバー/PC のローカル IP を入力し、ドメインに FQDN (www.domain.com) または外部 IP を入力します。
両方のサーバーを再起動して、ルーターとファイアウォールの両方でポートが開いていることを確認します。
これは長々と聞こえますが、文字通り5分間遊んでいました。完璧に動作します。
システム: Windows 8、IIS 8、Apache 2.2
別の IP アドレスを使用する必要があります。サーバーは、Apache であれ IIS であれ、リッスンする IP とポートに基づいてトラフィックを取得します。リッスンを開始すると、サーバー名などのヘッダーを使用してフィルタリングし、アクセスされているサイトを特定します。リクエストのサーバー名を変更するだけではできません