2008-09-20 6 views

Antwort

26

Es ist unmöglich für beide Server auf den gleichen Port an der gleichen IP-Adresse zu hören: da ein einzelner Socket nur durch einen einzigen Prozess nur geöffnet werden kann Der erste Server, der für eine bestimmte IP/Port-Kombination konfiguriert ist, wird erfolgreich gebunden, und der zweite wird fehlschlagen.

Sie benötigen daher eine Problemumgehung, um zu erreichen, was Sie wollen. Am einfachsten ist es wahrscheinlich, Apache auf Ihrer primären IP/Port-Kombination auszuführen und Anforderungen für IIS (die für eine andere IP und/oder einen anderen Port konfiguriert sein müssen) an es zu leiten, indem Sie mod_rewrite verwenden. Beachten Sie, dass die alternative IP und der Port, auf dem IIS ausgeführt wird, für die Clients erreichbar sein sollten, die eine Verbindung zu Ihrem Server herstellen: Wenn Sie nur eine einzige IP-Adresse haben, sollten Sie einen IIS-Port auswählen, der nicht aktiv ist im Allgemeinen durch Firewalls blockiert (8080 könnte eine gute Option sein, oder 443, obwohl Sie reguläres HTTP und nicht SSL verwenden)

PS Beachten Sie auch, dass Sie die IIS-Standardkonfiguration mithilfe von httpcfg ändern müssen, bevor andere Server auf Port 80 für eine beliebige IP-Adresse auf demselben Server ausgeführt werden können. Weitere Informationen finden Sie in der Antwort von Micky McQuade für das Verfahren ...

+0

Können Sie erläutern, wie Apache die Anfrage weiterleiten soll? Gibt es auch einen Grund, warum Apache der primäre Server sein sollte oder ist es nur eine Vorliebe? –

+0

Der Grund, Apache zum primären zu machen, ist die Tatsache, dass es mod_rewrite hat. (Ähnliche Lösungen gibt es für IIS, aber nicht so flexibel.) Damit Apache die Anforderung weiterleitet, müssen Sie einen Ordner (der ein virtuelles Host-Stammverzeichnis sein kann) mit Umschreibungsregeln in .htaccess oder httpd definieren. conf – mdb

+3

Für zukünftige Leser ist 'mod_rewrite' keine gute Lösung für dieses Problem, da es nur die URL behandelt, während ein richtiger Proxy alles andere behandelt. – Walf

26

Ich habe den folgenden Link gefunden, der vorgeschlagen hat, zwei separate IP-Adressen zu haben, so dass beide auf Port 80 hören konnten: (Edit: Link funktioniert nicht mehr: www.prismix.com/blog/2006/06/running_apache_and_iis_6_toget.cfm)

Es gab einen Vorbehalt, dass Sie wegen Socket-Pooling eine Änderung in IIS vornehmen mussten. Hier sind die Anweisungen basierend auf dem obigen Link:

  1. Extrahieren Sie das httpcfg.exe-Dienstprogramm aus dem Support-Tools-Bereich auf der Win2003-CD.
  2. Stopp alle IIS-Dienste: net stop http/y
  3. IIS nur auf die IP-Adresse hören habe ich für IIS bezeichnet hatte: httpcfg gesetzt iplisten -i 192.168.1.253
  4. sicher: httpcfg Abfrage iplisten (die IPs aufgelistet sind die einzigen IP-Adressen, die IIS wird abhört und keine andere)
  5. Neustart IIS-Dienste: net start w3svc
  6. Start Apache-Dienst
+0

Das ist genau richtig; Ich musste dies vor ein paar Monaten tun, um genau das gleiche Problem zu lösen. Wenn zwei IP-Adressen akzeptiert werden, ist dies eine sehr einfache und robuste Lösung. –

+1

fyi, für Windows 2008 gibt es einen anderen Artikel, der erklärt, wie es geht. http://weblogs.asp.net/steveschofield/archive/2007/07/06/iis7-post-44-iis7-and-apache-on-the-same-machine.aspx –

+1

Danke, es half mir, aber 'net stop/y' stoppte auch den Druckspooler, so dass' net start spooler' später benötigt wird. – Alexey

-1

Sie müssen verschiedene IP-Adressen verwenden. Der Server, egal ob Apache oder IIS, erfasst den Datenverkehr basierend auf der IP und dem Port, auf den sie sich verlassen müssen. Sobald es zu hören beginnt, verwendet es die Header, z. B. den Servernamen, um zu filtern und festzustellen, auf welche Site zugegriffen wird. Sie können nicht einfach den Servernamen in der Anfrage ändern

+0

wow. Ich tippe wirklich zu langsam, als ich etwas eingegeben habe, haben 5 Leute ungefähr dieselbe Antwort gegeben. – stephenbayer

+0

Haha, wohin sind sie alle gegangen? –

2

Entweder zwei verschiedene IP-Adressen (wie empfohlen) oder ein Web-Server verhält sich umgekehrt (der auf einem Port <> 80 horcht).

Zum Beispiel: Apache hört auf Port 80, IIS auf Port 8080. Jede http Anfrage geht zuerst an Apache (natürlich). Sie können dann entscheiden, jede Anforderung an eine bestimmte (benannte virtuelle) Domäne oder jede Anforderung weiterzuleiten, die ein bestimmtes Verzeichnis (z. B. http://www.example.com/winapp/) an den IIS enthält.

Vorteil dieses Konzepts ist, dass Sie nur einen Server haben, der der Öffentlichkeit statt zwei zuhört, Sie sind flexibler als mit zwei unterschiedlichen Servern.

Nachteile: Einige Webapps sind crappy entworfen und ein echter Schmerz in den Arsch zu integrieren in eine Reverse-Proxy-Infrastruktur. Eine funktionierende IIS-Webanwendung hängt von einem funktionierenden Apache ab, sodass wir einige Abhängigkeiten haben.

+0

Aus meiner Forschung erwog ich ein Reverse-Proxy-Szenario. Können Sie erläutern, wie Sie das einrichten? Haben Sie Apache mod_Proxy benutzt? Meine zwei Apps sind nicht voneinander abhängig, was ein Plus ist - gibt es noch einige Probleme, auf die ich achten sollte? –

3

Sie benötigen mindestens mod_proxy und mod_proxy_http, die beide Teil der Distribution sind (aber nicht immer automatisch erstellt). Dann können Sie hier sehen: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

Simplest config in einem Virtualhost Kontext ist:

ProxyPass   /winapp http://127.0.0.1:8080/somedir/ 

ProxyPassReverse /winapp http://127.0.0.1:8080/somedir/ 

(Je nach Webapp, die tatsächliche Konfiguration könnte immer ausgefeilter.) , die transparent, jede Anfrage auf dem Weg umleitet winapp/an den Windows-Server und überträgt die resultierende Ausgabe zurück zum Client.

Achtung: Achten Sie auf die Links in den gelieferten Seiten: sie sind nicht neu geschrieben werden, so können Sie sich lotsa Mühe sparen, wenn Sie in der Regel relative Links in Ihrer Anwendung verwenden, wie

<a href=../pics/mypic.jpg"> 

statt der übliche Integration Alptraum eines jeden Link ist absolut:

<a href="http://myinternalhostname/somedir/crappydesign.jpg"> 

Letzteres ist BAD NAHEZU jedes Mal!

Zum Umschreiben von Links in Seiten gibt es mod_proxy_html (nicht zu verwechseln mit mod_proxy_http!), Aber das ist eine andere Geschichte und auch eine grausame.

+0

Bitte füge dies in deine andere Antwort ein :) –

13

Für Menschen mit nur eine IP-Adresse und mehrere Standorte auf einem Server, können Sie IIS so konfigurieren, auf einem anderen Port als 80, zB 8080 durch Einstellen der TCP-Port in den Eigenschaften jeder seiner Seiten zu hören (einschließlich der Standard).

In Apache, aktivieren Sie mod_proxy und mod_proxy_http, dann fügen Sie einen Catch-All-VirtualHost (nach allen anderen), so dass Apache nicht explizit behandelt Anfragen "weitergeleitet" auf IIS.

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

Jetzt können Sie Apache einige Seiten bedienen und IIS andere, ohne sichtbaren Unterschied für den Benutzer.

Bearbeiten: Ihre IIS-Sites dürfen ihre Portnummer nicht in URLs innerhalb ihrer Antworten enthalten, einschließlich Header.

0

Ich sehe, das ist ein ziemlich alter Beitrag, aber stieß auf diese Suche nach einer Antwort für dieses Problem. Nachdem ich einige der Antworten gelesen habe, scheinen sie sehr langwierig zu sein, so dass ich nach etwa 5 Minuten das Problem sehr einfach wie folgt lösen konnte:

httpd.conf für Apache belassen den Listenport als 80 und 'Server Name' als FQDN/IP: 80.

Jetzt für IIS gehen Sie zu Administrative Services> IIS-Manager> 'Sites' in der linken Navigationsleiste> im rechten Fenster wählen Sie die obere Zeile (Standard-Website) und Bindings auf der rechten Seite.

Wählen Sie nun http> bearbeiten und ändern Sie auf 81 und geben Sie Ihre lokale IP für den Server/PC und in Domäne geben Sie entweder Ihren FQDN (www.domain.com) oder externe IP schließen.

Starten Sie beide Server neu, um sicherzustellen, dass Ihre Ports sowohl auf dem Router als auch auf der Firewall geöffnet sind.

Das hört sich lange umständlich an, dauerte aber buchstäblich 5 Minuten. funktioniert perfekt.

System: Windows 8, IIS 8, Apache 2.2

+1

Ich denke, dass @thedeeno versucht hat, die Probleme zu vermeiden, die mit der Verwendung eines nicht standardmäßigen Ports verbunden sind. – Walf

0

Installation 10 Fenster hatte ich dieses Problem: Apache (IPv4) und Spooler-Dienst (IPv6) den gleichen Port 80 zu hören.

aufgelöst ich Apache httpd.conf Bearbeitung der Linie

80 Anhören Ändern

zu

Anhören 127.0.0.1:80

0

Das ist nicht ganz richtig ist. Z.B. für HTTP Windows unterstützt die URL-basierte Portfreigabe, sodass mehrere Prozesse dieselbe IP-Adresse und denselben Port verwenden können.