web-dev-qa-db-ja.com

ApacheおよびIIS side by side(両方ともポート80をリッスン)Windows 2003で)

これを行ういくつかの良い方法は何ですか?きれいにすることさえ可能ですか?

理想的には、パケットヘッダーを使用して、要求を処理するサーバーを決定したいと思います。しかし、もっと簡単で良い方法があれば教えてください。

42
Dane O'Connor

両方のサーバーが同じIPアドレスの同じポートでリッスンすることは不可能です。1つのソケットは1つのプロセスでしか開くことができないため、特定のIP /ポートの組み合わせに対して構成された最初のサーバーのみが正常にバインドされ、2番目のサーバーは正常にバインドされます失敗します。

したがって、必要なものを実現するには回避策が必要になります。最も簡単な方法は、おそらくプライマリIP /ポートの組み合わせでApacheを実行し、 mod_rewrite を使用してIIS(異なるIPやポート用に構成する必要があります)へのリクエストをルーティングすることです。

代替IPとポートIISは、サーバーに接続しているクライアントに到達可能である必要があることに注意してください。使用可能なIPアドレスが1つしかない場合は、IIS通常ファイアウォールでブロックされないポート(8080が適切なオプションかもしれません。SSLではなく通常のHTTPを実行している場合でも443)

追伸また、httpcfgを使用してIISデフォルト構成を変更してから、同じサーバー上の任意のIPアドレスのポート80で他のサーバーを実行できるようにする必要があることに注意してください。手順については、Micky McQuadeの回答を参照それを行う...

31
mdb

この投稿 が見つかりました。これは、2つが別々のIPアドレスを持ち、両方がポート80でリッスンできることを示唆しています。

ソケットプーリングのため、IISを変更する必要があるという警告がありました。上記のリンクに基づいた手順は次のとおりです。

  1. httpcfg.exe Win2003 CDのサポートツール領域にあるユーティリティ。
  2. すべて停止IISサービス:net stop http /y
  3. IIS IISに指定したIPアドレスでのみリッスンする:httpcfg set iplisten -i 192.168.1.253
  4. 確認してください: httpcfg query iplisten(リストされているIPのみがIISがリッスンし、他のIPアドレスはありません。)
  5. 再起動IISサービス:net start w3svc
  6. Apacheサービスを開始します
28
Micky McQuade

1つのサーバーで1つのIPアドレスおよび複数のサイトのみを持つユーザーの場合、80以外のポートでリッスンするようにIISたとえば、8080は、各サイト(デフォルトのサイトを含む)のプロパティでTCPポートを設定します。

Apacheでmod_proxymod_proxy_httpを有効にしてから、キャッチオールVirtualHost(他のすべての後)を追加して、ApacheがIISに「転送」されることを明示的に処理しないようにします。

<VirtualHost *:80>
    ServerName foo.bar
    ServerAlias *
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
</VirtualHost>

これで、Apacheがいくつかのサイトにサービスを提供し、IIS=他にサービスを提供できます。ユーザーには目に見える違いはありません。

編集: your IISサイトは、ヘッダーを含む応答内のURLにポート番号を含めてはなりません。

13
Walf

少なくとも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">

後でIS毎回悪い時間になります!

ページ内のリンクを書き換えるにはmod_proxy_htmlがあります(mod_proxy_httpと混同しないでください!)が、これは別の話であり、残酷な話でもあります。

3
Dirk Taggesell

2つの異なるIPアドレス(推奨など)または1つのWebサーバーがもう一方(ポート<> 80でリッスンしている)をリバースプロキシしています。

たとえば、Apacheはポート80でリッスンします。IISポート8080で。すべてのhttpリクエストが最初にApacheに送信されます(もちろん)。その後、すべてのリクエストを特定の(仮想)ドメインまたは特定のディレクトリ(たとえば、 http://www.example.com/winapp/ )を含むIISへのすべてのリクエスト。

この概念の利点は、2つではなく1つのサーバーだけがパブリックをリッスンすることであり、2つの異なるサーバーと同様に柔軟性が高くなります。

欠点:いくつかのwebappsは粗末に設計されており、リバースプロキシインフラストラクチャに統合するために本当に苦労しています。動作中のIIS webappは動作中のApacheに依存しているため、相互依存性があります。

2
Dirk Taggesell

これはかなり古い記事ですが、この問題の答えを探してこれに出会いました。回答のいくつかを読んだ後、彼らは非常に長い間曲がったように見えたので、約5分後、次のように非常に簡単に問題を解決できました。

apacheのhttpd.confは、リスンポートを80のままにし、「サーバー名」をFQDN/IP:80のままにします。

ここでIIS管理サービスに移動> IIS [マネージャー]> [左側]ナビゲーションドロップダウンの[サイト]>右側のウィンドウで最上行を選択(デフォルトウェブサイト)、右側のバインディング。

次に、http>編集を選択して81に変更し、server/pcのローカルIPを入力し、ドメインにFQDN(www.domain.com)または外部IPを入力します閉じる。

両方のサーバーを再起動して、ルーターとファイアウォールの両方でポートが開いていることを確認してください。

これは長い曲がりくねった音に聞こえますが、文字通り5分ほど遊んでいます。完全に動作します。

システム:Windows 8、IIS 8、Apache 2.2

0
Matthew White

それはまったく真実ではありません。例えば。 HTTPの場合、WindowsはURLベースのポート共有をサポートし、複数のプロセスが同じIPアドレスとポートを使用できるようにします。

0
Andre Kaufmann

Windows 10のインストールこの問題が発生しました:同じ80ポートをリッスンするApache(ipv4)とスプーラーサービス(ipv6)。

行を変更してApache httpd.confファイルの編集を解決しました

聞く80

聞く127.0.0.1:80

0