Domanda

Quali sono alcuni buoni modi per farlo? È anche possibile fare in modo pulito?

Idealmente, vorrei usare le intestazioni dei pacchetti per decidere quale server dovrebbe gestire le richieste. Tuttavia, se esiste un modo più semplice / migliore, fammelo sapere.

È stato utile?

Soluzione

È impossibile che entrambi i server ascoltino sulla stessa porta con lo stesso indirizzo IP: poiché un singolo socket può essere aperto solo da un singolo processo, solo il primo server configurato per una determinata combinazione IP / porta si collegherà correttamente, e il secondo fallirà.

Avrai quindi bisogno di una soluzione alternativa per ottenere ciò che desideri. Il più semplice è probabilmente quello di eseguire Apache sulla combinazione IP / porta primaria e di instradare le richieste per IIS (che dovrebbe essere configurato per un IP e / o porta diversi) utilizzando mod_rewrite .

Tieni presente che l'IP alternativo e la porta su cui viene eseguito IIS dovrebbero essere raggiungibili dai client che si connettono al tuo server: se hai un solo indirizzo IP disponibile, dovresti fare attenzione a scegliere una porta IIS che non è generalmente bloccato dai firewall (8080 potrebbe essere una buona opzione, o 443, anche se si esegue HTTP normale e non SSL)

P.S. Inoltre, tieni presente che devi modificare la configurazione predefinita di IIS utilizzando httpcfg prima che consentirà ad altri server di funzionare sulla porta 80 su qualsiasi indirizzo IP sullo stesso server: vedi la risposta di Micky McQuade per la procedura per farlo ...

Altri suggerimenti

Ho trovato questo post che suggeriva di avere due indirizzi IP separati in modo che entrambi potessero ascoltare sulla porta 80.

Si è verificato un avvertimento che è stato necessario apportare una modifica a IIS a causa del pool di socket. Ecco le istruzioni basate sul link sopra:

  1. Estrai l'utilità httpcfg.exe dall'area degli strumenti di supporto sul CD di Win2003.
  2. Interrompi tutti i servizi IIS: net stop http /y
  3. Chiedi a IIS di ascoltare solo sull'indirizzo IP designato per IIS: httpcfg set iplisten -i 192.168.1.253
  4. Assicurati: httpcfg query iplisten (Gli IP elencati sono gli unici indirizzi IP su cui IIS ascolterà e nessun altro.)
  5. Riavvia i servizi IIS: net start w3svc
  6. Avvia il servizio Apache

Per le persone con solo un indirizzo IP e più siti su un server, puoi configurare IIS per l'ascolto su una porta diversa da 80, ad es. 8080 impostando la porta TCP nelle proprietà di ciascuno dei suoi siti (incluso quello predefinito).

In Apache, abilita mod_proxy e mod_proxy_http, quindi aggiungi un VirtualHost tutto sommato (dopo tutti gli altri) in modo che le richieste Apache non gestiscano esplicitamente get " inoltrato " su IIS.

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

Ora puoi fare in modo che Apache serva alcuni siti e IIS serva altri, senza alcuna differenza visibile per l'utente.

Modifica: i tuoi siti IIS non devono includere il loro numero di porta in nessun URL all'interno delle loro risposte, comprese le intestazioni.

Devi avere almeno mod_proxy e mod_proxy_http che fanno entrambi parte della distribuzione (ma non sempre creati automaticamente). Quindi puoi guardare qui: http://httpd.apache.org/docs/ 2.2 / mod / mod_proxy.html

La configurazione più semplice in un contesto di host virtuale è:

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

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

(A seconda della tua webapp, la configurazione effettiva potrebbe diventare più sofisticata.) Ciò reindirizza in modo trasparente ogni richiesta sul percorso winapp / al server Windows e trasferisce l'output risultante al client.

Attenzione: prenditi cura dei link nelle pagine consegnate: non vengono riscritti, quindi puoi risparmiarti una seccatura se usi generalmente i collegamenti relativi nella tua app, come

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

invece del solito incubo di integrazione di ogni collegamento essendo assoluto:

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

L'ULTIMO È MALE QUASI OGNI SINGOLO!

Per riscrivere i collegamenti nelle pagine c'è mod_proxy_html (da non confondere con mod_proxy_http!) ma questa è un'altra storia e anche una crudele.

O due diversi indirizzi IP (come consigliato) o un server web sta inviando un altro proxy (che è in ascolto su una porta < > 80).

Ad esempio: Apache è in ascolto sulla porta 80, IIS sulla porta 8080. Ogni richiesta http va prima ad Apache (ovviamente). Puoi quindi decidere di inoltrare ogni richiesta a un determinato dominio (denominato virtuale) o ogni richiesta che contiene una directory specifica (ad es. http://www.example.com/winapp/ ) all'IIS.

Il vantaggio di questo concetto è che hai solo un server che ascolta il pubblico invece di due, sei più flessibile come con due server distinti.

Svantaggi: alcune webapp sono progettate in modo pessimo e una vera seccatura nel culo da integrare in un'infrastruttura di proxy inverso. Una webapp IIS funzionante dipende da un Apache funzionante, quindi abbiamo alcune interdipendenze.

Vedo che questo è un post piuttosto vecchio, ma mi sono imbattuto in questo cercando una risposta per questo problema. Dopo aver letto alcune delle risposte sembrano molto lunghe, quindi dopo circa 5 minuti sono riuscito a risolvere il problema molto semplicemente come segue:

httpd.conf per Apache lascia la porta di ascolto come 80 e 'Nome server' come FQDN / IP: 80.

Ora per IIS vai a Servizi amministrativi > Manager IIS & Gt; I "siti" nel menu di navigazione a sinistra scendono & Gt; nella finestra di destra selezionare la riga superiore (sito Web predefinito), quindi i collegamenti sulla destra.

Ora seleziona http > modifica e cambia in 81 e inserisci il tuo IP locale per il server / pc e nel dominio inserisci il tuo nome di dominio completo (www.domain.com) o la chiusura dell'IP esterno.

Riavvia entrambi i server assicurati che le porte siano aperte sia sul router che sul firewall, fatto.

Sembra lungo, ma richiede letteralmente 5 minuti di gioco. funziona perfettamente.

Sistema: Windows 8, IIS 8, Apache 2.2

Installazione di Windows 10 Ho riscontrato questo problema: apache (ipv4) e servizio spooler (ipv6) ascoltando la stessa porta 80.

Ho risolto la modifica del file httpd.conf di apache cambiando la linea

Ascolta 80

a

Ascolta 127.0.0.1:80

Non è del tutto vero. Per esempio. per HTTP Windows supporta la condivisione delle porte basata su URL, consentendo a più processi di utilizzare lo stesso indirizzo IP e la stessa porta.

Dovrai utilizzare indirizzi IP diversi. Il server, sia Apache che IIS, acquisisce il traffico in base all'IP e alla porta, che sono sempre tenuti ad ascoltare. Una volta avviato l'ascolto, utilizza le intestazioni, ad esempio il nome del server, per filtrare e determinare a quale sito si accede. Non puoi farlo semplicemente cambiando il nome del server nella richiesta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top