web-dev-qa-db-fra.com

Apache et IIS côte à côte (tous deux écoutant le port 80) sous Windows 2003

Quels sont les bons moyens de procéder? Est-il même possible de faire proprement?

Idéalement, j'aimerais utiliser des en-têtes de paquets pour décider quel serveur devrait gérer les demandes. Cependant, s'il existe un moyen plus facile/meilleur, faites le moi savoir.

42
Dane O'Connor

Il est impossible pour les deux serveurs d'écouter sur le même port à la même adresse IP: puisqu'un seul socket ne peut être ouvert que par un seul processus, seul le premier serveur configuré pour une certaine combinaison IP/port se liera avec succès, et le second échouera.

Vous aurez donc besoin d'une solution de contournement pour réaliser ce que vous voulez. Le plus simple est probablement d'exécuter Apache sur votre combinaison IP/port principale, et de lui faire acheminer les demandes pour IIS (qui devrait être configuré pour une IP et/ou un port différent) vers lui en utilisant mod_rewrite .

Gardez à l'esprit que l'adresse IP et le port alternatifs IIS s'exécute sur doivent être accessibles aux clients se connectant à votre serveur: si vous n'avez qu'une seule adresse IP disponible, vous devez prendre soin de choisir un = IIS port qui n'est généralement pas bloqué par les pare-feu (8080 peut être une bonne option, ou 443, même si vous utilisez HTTP et non SSL))

P.S. Notez également que vous devez modifier la configuration par défaut IIS en utilisant httpcfg avant de permettre aux autres serveurs de s'exécuter sur le port 80 sur n'importe quelle adresse IP sur le même serveur: voir la réponse de Micky McQuade pour la procédure pour le faire ...

31
mdb

J'ai trouvé ce message qui suggérait d'avoir deux adresses IP distinctes pour que les deux puissent écouter sur le port 80.

Il y avait une mise en garde que vous deviez apporter une modification dans IIS à cause du pool de socket. Voici les instructions basées sur le lien ci-dessus:

  1. Extraire le httpcfg.exe utilitaire de la zone des outils de support sur le CD Win2003.
  2. Arrêtez tous les services IIS: net stop http /y
  3. Demandez à IIS d'écouter uniquement sur l'adresse IP que j'ai désignée pour IIS: httpcfg set iplisten -i 192.168.1.253
  4. Assure-toi: httpcfg query iplisten (Les adresses IP répertoriées sont les seules adresses IP sur lesquelles IIS écoutera et aucune autre.)
  5. Redémarrez IIS Services: net start w3svc
  6. Démarrez le service Apache
28
Micky McQuade

Pour les personnes avec seulement ne adresse IP et plusieurs sites sur un serveur, vous pouvez configurer IIS pour écouter sur un port autre que 80, par exemple 8080 en définissant le port TCP dans les propriétés de chacun de ses sites (y compris celui par défaut).

Dans Apache, activez mod_proxy et mod_proxy_http, puis ajoutez un VirtualHost fourre-tout (après tous les autres) afin que les demandes qu'Apache ne gère pas explicitement soient "transférées" vers IIS.

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

Maintenant, vous pouvez demander à Apache de servir certains sites et IIS servir d'autres, sans aucune différence visible pour l'utilisateur.

Modifier: vos IIS sites ne doivent pas inclure leur numéro de port dans les URL de leurs réponses, y compris les en-têtes.

13
Walf

Vous avez besoin d'au moins mod_proxy et mod_proxy_http qui font tous deux partie de la distribution (mais pas à chaque fois construits automatiquement). Ensuite, vous pouvez regarder ici: http://httpd.Apache.org/docs/2.2/mod/mod_proxy.html

La configuration la plus simple dans un contexte d'hôte virtuel est:

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

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

(Selon votre application Web, la configuration réelle peut devenir plus sophistiquée.) Cela redirige de manière transparente toutes les demandes sur le chemin winapp/vers le serveur Windows et transfère la sortie résultante au client.

Attention: Prenez soin des liens dans les pages livrées: ils ne sont pas réécrits, donc vous pouvez vous épargner beaucoup de tracas si vous utilisez généralement des liens relatifs dans votre application, comme

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

au lieu du cauchemar habituel d'intégration où chaque lien est absolu:

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

LE DERNIER IS MAUVAIS PRESQUE CHAQUE FOIS!

Pour réécrire les liens dans les pages, il y a mod_proxy_html (à ne pas confondre avec mod_proxy_http!) Mais c'est une autre histoire et aussi cruelle.

3
Dirk Taggesell

Soit deux adresses IP différentes (comme recommandé) ou un serveur Web procède à un proxy inverse de l'autre (qui écoute sur un port <> 80).

Par exemple: Apache écoute sur le port 80, IIS sur le port 8080. Chaque demande http va d'abord à Apache (bien sûr). Vous pouvez ensuite décider de transmettre chaque demande à un particulier (nommé virtuel) domaine ou chaque demande qui contient un répertoire particulier (par exemple http://www.example.com/winapp/ ) à IIS.

L'avantage de ce concept est que vous n'avez qu'un seul serveur à l'écoute du public au lieu de deux, vous êtes plus flexible qu'avec deux serveurs distincts.

Inconvénients: certaines webapps sont conçues de manière insensée et sont vraiment pénibles à intégrer dans une infrastructure de proxy inverse. Une webapp IIS webapp dépend d'un Apache qui fonctionne, nous avons donc des interdépendances.

2
Dirk Taggesell

Je vois que c'est un message assez ancien, mais je suis tombé sur cette recherche d'une réponse à ce problème. Après avoir lu certaines des réponses, elles semblent très longues, donc après environ 5 minutes, j'ai réussi à résoudre le problème très simplement comme suit:

httpd.conf pour Apache laisse le port d'écoute à 80 et 'Nom du serveur' à FQDN/IP: 80.

Maintenant pour IIS allez dans Services administratifs> IIS Manager> 'Sites' dans le menu déroulant de navigation à gauche> dans la fenêtre de droite, sélectionnez la ligne supérieure (par défaut site web) puis reliures à droite.

Maintenant, sélectionnez http> modifier et passer à 81 et entrez votre IP locale pour le serveur/PC et dans le domaine, entrez votre FQDN (www.domain.com) ou IP externe.

Redémarrez les deux serveurs pour vous assurer que vos ports sont ouverts sur le routeur et le pare-feu, c'est fait.

Cela semble long mais a littéralement pris 5 minutes à jouer. fonctionne parfaitement.

Système: Windows 8, IIS 8, Apache 2.2

0
Matthew White

Ce n'est pas tout à fait vrai. Par exemple. pour HTTP Windows prend en charge le partage de port basé sur URL, permettant à plusieurs processus d'utiliser la même adresse IP et le même port.

0
Andre Kaufmann

Installation de Windows 10 J'ai eu ce problème: Apache (ipv4) et service de spouleur (ipv6) écoutant le même port 80.

J'ai résolu la modification du fichier Apache httpd.conf en changeant la ligne

Écouter 80

à

Écouter 127.0.0.1:80

0
Riccardo Siccardi