Apache hosts virtuales y proxy inverso

Tengo muchos hosts virtuales cuyos nombres de dominio se asignan a un único server Apache (llamémoslo server1). Bajo ciertas circunstancias, todas las direcciones URL de un determinado host virtual deben ser servidas por un server diferente (llamémosle server2).

¿Cuál es la manera más fácil de lograr eso? ¿Puedo simplemente configurar server2 para usar la misma configuration de host virtual basada en nombres como server1 y luego confiar en los encabezados X-Forwarded-Host del server1 (es decir, server2 hará lo correcto basándose sólo en esos encabezados)? Por "configuration de host virtual basada en el mismo nombre" me refiero a los nombres de dominio "reales" (es decir, los nombres de dominio que se asignan al IP del server1).

de hecho puede utilizar el module mod_proxy. Funciona bien con vhosts. Básicamente, el server principal recibirá todas las peticiones, y cuando una determinada url / dominio se llama, mod_proxy networkingireccionará este dominio a otro server (server 2) que se parece a esto en el server 1

<VirtualHost *> ServerName server1.com Hosted on the server </VirtualHost *> <VirtualHost *> ServerName server2.com // mod_proxy directives in order to networkingirect this domain name to the other server // </VirtualHost> 

Y hay un buen tutorial: http://www.apachetutor.org/admin/reverseproxies

Acabo de ejecutar en el mismo problema, he explorado dos soluciones:

  1. Refleje la jerarquía externa en el DNS interno (por ejemplo, foo.example.com -> foo.internal.lan , bar.example.com -> bar.internal.lan , etc.); en cada bloque de VirtualHost en el frontend agrega las directivas ProxyPass y ProxyPassReverse apropiadas. Si tiene vhosts, entonces puede crear una sección catch-all ( ServerAlias *.example.com ) en el frontend y usar mod_rewrite ( [P] ) para enviar la request al backend, asignando las requestes a los nombres internos.

    Este primero se acercó a lo que intenté: funciona bien, pero requiere cambios en la denominación del backend. Si no puede tocar el DNS o si el server backend ni siquiera tiene un nombre que no puede utilizar este enfoque.

    Oh, no te olvides de arreglar las cookies con ProxyPassReverseCookieDomain , de lo contrario te fijas en los loggings preguntándose por qué las sesiones no funcionan más 😉

  2. Utilice un ProxyPreserveHost on catch-all en el frontend, y use ProxyPreserveHost on ; en este caso el frontend conserva el encabezado Host: en la request, para que pueda reutilizar su configuration vhost original en el backend (es decir, el backend ve la request con el nombre externo en el encabezado Host: foo.example.com )