Pregunta

¿Cuáles son algunas buenas maneras de hacer esto?¿Es siquiera posible hacerlo de forma limpia?

Idealmente, me gustaría usar encabezados de paquetes para decidir qué servidor debe manejar las solicitudes.Sin embargo, si hay una manera mejor o más fácil, hágamelo saber.

¿Fue útil?

Solución

Es imposible que ambos servidores escuchen en el mismo puerto con la misma dirección IP:Dado que un solo socket solo puede abrirse mediante un único proceso, solo el primer servidor configurado para una determinada combinación de IP/puerto se vinculará con éxito y el segundo fallará.

Por lo tanto, necesitará una solución alternativa para lograr lo que desea.Probablemente lo más fácil sea ejecutar Apache en su combinación de IP/puerto principal y hacer que enrute las solicitudes para IIS (que deben configurarse para una IP y/o puerto diferente) usando mod_reescritura.

Tenga en cuenta que la IP alternativa y el puerto en el que se ejecuta IIS deben ser accesibles para los clientes que se conectan a su servidor:Si solo tiene una dirección IP disponible, debe tener cuidado de elegir un puerto IIS que generalmente no esté bloqueado por firewalls (8080 podría ser una buena opción, o 443, aunque esté ejecutando HTTP normal y no SSL)

PDAdemás, tenga en cuenta que necesita modificar la configuración predeterminada de IIS usando httpcfg antes de que permita que otros servidores se ejecuten en el puerto 80 en cualquier dirección IP en el mismo servidor:vea la respuesta de Micky McQuade para conocer el procedimiento para hacer eso...

Otros consejos

encontré esta publicación lo que sugirió tener dos direcciones IP separadas para que ambas pudieran escuchar en el puerto 80.

Hubo una advertencia de que era necesario realizar un cambio en IIS debido a la agrupación de sockets.Aquí están las instrucciones basadas en el enlace de arriba:

  1. Extrae el httpcfg.exe utilidad desde el área de herramientas de soporte en el CD de Win2003.
  2. Detenga todos los servicios de IIS: net stop http /y
  3. Haga que IIS escuche solo en la dirección IP que designé para IIS: httpcfg set iplisten -i 192.168.1.253
  4. Cerciorarse: httpcfg query iplisten (Las IP enumeradas son las únicas direcciones IP en las que IIS escuchará y ninguna otra).
  5. Reinicie los servicios IIS: net start w3svc
  6. Iniciar el servicio Apache

Para personas con sólo una dirección IP y múltiples sitios en un servidor, puede configurar IIS para escuchar en un puerto que no sea 80, p.ej 8080 configurando el puerto TCP en las propiedades de cada uno de sus sitios (incluido el predeterminado).

En Apache, habilite mod_proxy y mod_proxy_http, luego agregue un VirtualHost general (después de todos los demás) para que las solicitudes que Apache no maneja explícitamente se "reenvíen" a IIS.

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

Ahora puede hacer que Apache preste servicio a algunos sitios y IIS a otros, sin diferencias visibles para el usuario.

Editar: sus sitios IIS no deben incluir su número de puerto en ninguna URL dentro de sus respuestas, incluidos los encabezados.

Necesita al menos mod_proxy y mod_proxy_http, que son parte de la distribución (aunque no siempre se crean automáticamente).Entonces puedes mirar aquí: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

La configuración más simple en un contexto de host virtual es:

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

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

(Dependiendo de su aplicación web, la configuración real podría volverse más sofisticada.) Que redirige transparentemente cada solicitud en la ruta WinApp/ al servidor de Windows y transfiere la salida resultante al cliente.

Atención:Cuide los enlaces en las páginas entregadas:no se reescriben, por lo que puedes ahorrarte muchas molestias si generalmente usas enlaces relativos en tu aplicación, como

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

en lugar de la habitual pesadilla de integración de que cada enlace sea absoluto:

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

¡ESTO ÚLTIMO ES MALO CASI SIEMPRE!

Para reescribir enlaces en páginas existe mod_proxy_html (¡no confundir con mod_proxy_http!), pero esa es otra historia y también cruel.

O dos direcciones IP diferentes (como se recomienda) o un servidor web realiza un proxy inverso al otro (que escucha en un puerto <>80).

Por ejemplo:Apache escucha en el puerto 80, IIS en el puerto 8080.Cada solicitud http va primero a Apache (por supuesto).Luego puede decidir reenviar cada solicitud a un dominio particular (llamado virtual) o cada solicitud que contenga un directorio particular (p. ej. http://www.example.com/winapp/) al IIS.

La ventaja de este concepto es que tienes un solo servidor escuchando al público en lugar de dos, eres más flexible como con dos servidores distintos.

Desventajas:Algunas aplicaciones web están mal diseñadas y es un verdadero dolor de cabeza integrarlas en una infraestructura de proxy inverso.Una aplicación web IIS que funcione depende de un Apache que funcione, por lo que tenemos algunas interdependencias.

Veo que esta es una publicación bastante antigua, pero la encontré buscando una respuesta a este problema.Después de leer algunas de las respuestas, parecen muy largas, así que después de unos 5 minutos logré resolver el problema de manera muy simple de la siguiente manera:

httpd.conf para Apache deje el puerto de escucha como 80 y el 'Nombre del servidor' como FQDN/IP: 80.

Ahora, para IIS, vaya a Servicios administrativos > Administrador de IIS > 'Sitios' en el menú desplegable de navegación de la izquierda > en la ventana derecha seleccione la línea superior (sitio web predeterminado) y luego los enlaces a la derecha.

Ahora seleccione http > editar y cambie a 81 e ingrese su IP local para el servidor/pc y en el dominio ingrese su FQDN (www.dominio.com) o cierre IP externo.

Reinicie ambos servidores y asegúrese de que sus puertos estén abiertos tanto en el enrutador como en el firewall, listo.

Esto suena largo, pero literalmente tomó 5 minutos de juego.funciona perfectamente.

Sistema:Windows 8, IIS 8, Apache 2.2

Al instalar Windows 10 tuve este problema:Apache (ipv4) y el servicio de cola de impresión (ipv6) escuchan el mismo puerto 80.

Resolví editando el archivo httpd.conf de Apache cambiando la línea

Escuchar 80

a

Escuchar 127.0.0.1:80

Eso no es del todo cierto.P.ej.para HTTP Windows admite el uso compartido de puertos basado en URL, lo que permite que múltiples procesos utilicen la misma dirección IP y puerto.

Necesitará utilizar diferentes direcciones IP.El servidor, ya sea Apache o IIS, capta el tráfico en función de la IP y el puerto, cualquiera que esté obligado a escuchar.Una vez que comienza a escuchar, utiliza los encabezados, como el nombre del servidor, para filtrar y determinar a qué sitio se accede.No puede hacerlo simplemente cambiando el nombre del servidor en la solicitud.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top