何か良い方法はないだろうか?きれいにできるものなのでしょうか?
理想的には、パケットヘッダを使って、どのサーバーがリクエストを処理すべきかを決めたいのですが。しかし、もっと簡単で良い方法があれば教えてください。
1つのソケットは1つのプロセスでしかオープンできないので、あるIPとポートの組み合わせに設定された最初のサーバーだけがバインドに成功し、2番目のサーバーは失敗する。
そのため、あなたが望むことを実現するためには回避策が必要になります。最も簡単なのは、プライマリ IP/ ポートの組み合わせで Apache を走らせ、mod_rewrite を使って IIS (別の IP やポートに設定されているはず) へのリクエストをルーティングさせることでしょう。
もし利用可能なIPアドレスが1つしかないのであれば、一般的にファイアウォールでブロックされないIISポートを選ぶように注意してください(8080が良い選択肢かもしれませんし、SSLではなく通常のHTTPを実行している場合でも443が良いでしょう)。
追伸: また、同じサーバー上のどのIPアドレスでも他のサーバーがポート80で実行できるようにするには、httpcfgを使ってIISのデフォルト設定を変更する必要があることに注意してください: その手順についてはMicky McQuadeの回答を参照してください...
この投稿]1では、2つの別々のIPアドレスを持って、両方とも80番ポートをリッスンできるようにすることを提案している。
ソケットプールのため、IISを変更しなければならないという注意書きがありました。 以下は、上記のリンクに基づいた手順です:
1.1.Win2003のCDにあるサポートツールのエリアから「httpcfg.exe」ユーティリティを展開する。
2.すべてのIISサービスを停止します:net stop http /yとする。 3.IISに指定したIPアドレスだけをリッスンするようにする:
httpcfg set iplisten -i 192.168.1.2534. 4.httpcfg set iplisten -i 192.168.1.253
4. 確認する: httpcfg query iplisten
(リストされたIPアドレスは、IISがリッスンする唯一のIPアドレスであり、他のIPアドレスはリッスンしない)。
5.IISサービスを再起動する:net start w3svc`
6.Apache サービスを開始します。
1つのサーバーに 1つのIPアドレスと複数のサイトのみを持つユーザーの場合、TCPポートをプロパティに設定することにより、「80」などの「8080」以外のポートでリッスンするようにIISを構成できます。各サイト(デフォルトのサイトを含む)。
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を参照してください。
仮想ホストコンテキストで最も単純な構成は次のとおりです。
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">
ラターは、ほとんどの場合、1つの時間で悪いです。!
ページのリンクを書き換えるには、mod_proxy_htmlがあります(mod_proxy_httpと混同しないでください)。!)しかし、それは別の話であり、残酷な話でもあります。
2つの異なるIPアドレス(推奨など)または1つのWebサーバーがもう1つのWebサーバーを逆プロキシします(ポートで待機しています<> 80)。
例:Apacheはポート80を聞き、IISはポート8080を聞きます。 すべてのhttpリクエストは最初にApacheに送信されます(もちろん)。 次に、すべてのリクエストを特定の(仮想という名前の)ドメインまたは特定のディレクトリを含むすべてのリクエスト(例:. http://www.example.com/winapp/)からIISへ。
このコンセプトの利点は、2つではなく1つのサーバーのみが一般に耳を傾けることであり、2つの異なるサーバーのように柔軟になります。
欠点:一部のWebアプリは、逆プロキシインフラストラクチャに統合するために、くだらないように設計されており、お尻に本当の痛みがあります。 動作するIIS Webappは動作するApacheに依存しているため、いくつかの相互依存関係があります。
これはかなり古い投稿だと思いますが、この問題に対する答えを探してこれに出くわしました。 いくつかの答えを読んだ後、彼らは非常に長い風に吹かれたように見えるので、約5分後、私は問題を次のように非常に簡単に解決することができました。
Apacheのhttpd.confは、リッスンポートを80のままにし、「サーバー名」をFQDN / IP:80として残します。
IISの場合は、管理サービスに移動します> IISマネージャー>左側の「サイト」navドロップダウン>右側のウィンドウで、一番上の行(デフォルトのWebサイト)を選択し、右側のバインディングを選択します。
次にhttp>を選択します。 81に編集して変更し、サーバー/ PCのローカルIPを入力し、ドメインにFQDN(www.domain.com)または外部IP closeを入力します。
両方のサーバーを再起動して、ルーターとファイアウォールの両方でポートが開いていることを確認します。
これは長い風に聞こえますが、文字通り5分のプレイが必要でした。 完全に動作します。
システム: Windows 8、IIS 8、Apache 2.2。