
Estoy intentando configurar dos subdominios, para a
y b
en domain.com
. Utilizo dos archivos .conf, que se ven prácticamente iguales con los cambios correspondientes en ServerName y ProxyPass:
<VirtualHost *:80>
ServerName a.domain.com #This was added as a try for a fix.
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/a
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
ProxyPass / https://a.domain.com:8444/
ProxyPassReverse / https://a.domain.com:8444/
ProxyPass /a/ https://a.domain.com:8444/
ProxyPassReverse /a/ https://a.domain.com:8444/
ProxyPass /b/ https://b.domain.com:8445/
ProxyPassReverse /b/ https://b.domain.com:8445/
</VirtualHost>
Esto se está haciendo en mi entorno de prueba, replicando algo similar a lo que está actualmente en producción. En /etc/hosts, agregué a.domain.com
y b.domain.com
a 127.0.0.1. El DNS en producción tiene registros de qué a.domain.com
y b.domain.com
son, que es la misma IP (también hice esto en la máquina desde la que estoy probando esto).
También tenga en cuenta que no publico ningún contenido desde sus directorios raíz. Agregué eso tratando de solucionar el problema indicado en el título. Sin embargo, hay un HTML simple en ambos directorios.
¿Cuál es el problema real?
Simplemente, al intentarlo a.domain.com
, el resultado es la aplicación web de localhost:8444
, como se esperaba. Al intentarlo b.domain.com
, el resultado es también localhost:8444
, en lugar de localhost:8445
. Ambos a.conf
y b.conf
están habilitados, y si los desactivo a.conf
, entonces obtengo correctamente localhost:8445
. Si también intento dar me gusta a.domain.com/b
, la redirección se resuelve de nuevo en a.domain.com
.
He leído varias preguntas y tutoriales, y la mayoría de ellos tienen algo que funciona como en mi configuración o agregan NameVirtualHost, que entiendo que no es necesario para mi versión de Apache. También agregué un nombre de servidor en el puerto 80 porque pensé que tal vez la solicitud b
coincidía a.conf
porque son la misma IP, pero eso tampoco funcionó.
¿Que me estoy perdiendo aqui? ¿Es algo relacionado con mod_proxy que parece que estoy ignorando? Si es posible, me gustaría conservar un archivo por aplicación web. ¡Gracias!
Esto está en Ubuntu 18.04.2, Apache 2.4 (mod_proxy y mod_ssl), Tomcat 9. Cualquier otra información que desee, haré todo lo posible para entregársela.
ACTUALIZAR
Probé con esta configuración también. Mismo resultado no deseado.
<VirtualHost *:80>
ServerAlias a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
ACTUALIZAR
Ok, acabo de encontrar algo muy molesto. Si entro con mi navegador a cualquiera de los dos a.domain.com
o b.domain.com
, ambos se resuelven en a.domain.com
. Ese es el problema que describí originalmente. PERO si lo intenta https://a.domain.com
o https://b.domain.com
, ambos se resuelven en el servidor correcto: a
to 8444
y b
to 8445
.
Como esto es muy frustrante, tomaré un freno y analizaré esto en un momento.
ACTUALIZAR
Después de un largo descanso, probé algunos otros ajustes aleatorios solo para ver qué sucedía y, una vez más, nada funcionó como se esperaba, excepto cuando usé HTTPS. Instalé Postman para ver qué se enviaba en la solicitud y descubrí que en Postman, tanto HTTP como HTTPS usan el Host correctamente. Aún mejor/peor: la respuesta real muestra las diferentes páginas de bienvenida para a.domain.com
y b.domain.com
, lo que significa que mis configuraciones funcionan correctamente cuando uso Postman.
Creo que toda esta terrible experiencia podría ser simplemente un problema de caché, pero mi navegador de prueba preferido (Firefox dev ed) está configurado para no almacenar en caché. Verificaré las respuestas con curl y con mis otros navegadores.
Respuesta1
Culpable:el caché.
En algún momento, la configuración de mi navegador cambió (¿Quizás una actualización?) y tenía más de 3 GB de caché, incluidos los sitios de prueba que estaba intentando configurar como subdominios. Vaya.
Después de borrar el caché, apareció una alerta sobre mi certificado autofirmado al acceder a mis URL, como se esperaba. Después de aceptar los riesgos, fui redirigido a los sitios adecuados. Esto mediante el uso b.domain.com
sin agregar el protocolo.
Para asegurarme de que esto funcionara, probé en todos mis otros 7 navegadores (debo asegurarme) y hice curl con y sin el protocolo y los resultados también fueron los deseados.
Al final la configuración estuvo bien. Lo publicaré aquí por si lo necesitas.Un servidor Apache que actúa como proxy para instancias específicas de Tomcat por subdominio, utilizando proxy_mod que también redirige inmediatamente desde el puerto 80 al puerto 433..
<VirtualHost *:80>
ServerName a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
SSLEngine On
SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
SSLVerifyClient none
#Proxies
ProxyRequests Off
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
#Redirections
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
Tenga en cuenta que las configuraciones para SSL Proxy y SSL son para certificados autofirmados. Lea la documentación relevante para cada uno si implementa esto para entornos productivos. También tenga en cuenta que este es el archivo de configuración para a.domain.com
. El equivalente para b.domain.com
es exactamente el mismo, con el nombre del servidor, el alias del servidor, las redirecciones, la ubicación y el puerto de localhost apropiados.