Utilización de hosts virtuales
Puede utilizar hosts virtuales si desea aislamiento entre las aplicaciones y los puntos finales que sirven.
A menudo, un solo servidor de aplicaciones responde a solicitudes de varias configuraciones de puerto y host distintas. Esto se produce por una combinación de motivos como, por ejemplo, se está ejecutando en una máquina con varias interfaces de red con nombres distintos o se direcciona desde un servidor http, proxy o equilibrador de carga. En estos casos, es posible que desee controlar con qué aplicación se puede contactar desde un host específico. Los hosts virtuales proporcionan la prestación. Coincide con el nombre de host y el número de puerto solicitado (tal como se determina en la cabecera de host HTTP) según la lista configurada de alias de host.
En WebSphere Application Server Liberty, es suficiente la configuración predeterminada. El host virtual predeterminado (default_host) coincide con las solicitudes de cualquier combinación de host y puerto entrante y las envía en el contenedor de aplicación predeterminado.
- El valor del ID del elemento de configuración virtualHost.
- La configuración del subelemento hostAlias.
- La configuración del subelemento allowFromEndpoint (si se utiliza).
- La configuración del host virtual en el archivo ibm-web-bnd.xml o ibm-web-bnd.xmi del WAR.
- El valor de atributo de host del httpEndpoint.
- El valor del atributo de ID del httpEndpoint.
Aislamiento de dos aplicaciones entre sí
<httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" />
<httpEndpoint id="alternateEndpoint" host="*" httpPort="9081" />
<virtualHost id="application-1">
<hostAlias>your_host_name:9080</hostAlias>
</virtualHost>
<virtualHost id="application-2">
<hostAlias>localhost:9081</hostAlias>
</virtualHost>
<enterpriseApplication location="myApp.ear" name="App1"/>
<webApplication location="myApp2.war" name="App2" />
El defaultHttpEndpoint expone todas las interfaces en el puerto 9080 y el alternateEndpoint expone todas las interfaces en el puerto 9081.
Si una App1 tiene un archivo WAR con un archivo ibm-web-bnd.xml que especifica <virtual-host name="application-1"/>, solo se puede acceder a esta aplicación en su_nombre_host:9080/raíz_contexto_app1.
Si la App2 (que es un WAR) tiene un archivo ibm-web-bnd.xml que especifica <virtual-host name="application-2"/>, solo se puede acceder a esta aplicación en localhost:9081/raíz_contexto_app2.
Si se ha desplegado una tercera aplicación que no ha especificado ningún host virtual específico, en la configuración, solo se podría acceder a dicha aplicación si se realizara una solicitud con proxy que tuviera la cabecera HOST que especifica un puerto diferente. Por ejemplo, si se ha realizado la solicitud a un proxy en el puerto 80, dicho puerto no aparece listado en ninguna de las especificaciones de hostAlias y la solicitud se direccionaría al host virtual default_host.
Aislamiento de aplicaciones basándose en el host o el puerto solicitado
- Decida el nombre del host virtual, y actualice la aplicación para
hacer referencia al nuevo host (no predeterminado). Añada un
elemento de host virtual al archivo
ibm-web-bnd.xml o
ibm-web-bnd.xmi del WAR.
<?xml version="1.0" encoding="UTF-8"?> <web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xmk/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd" version="1.0" /> <virtual-host name="proxiedRequests" /> </web-bnd>
- Añada un elemento virtualHost al archivo
server.xml. El nombre debe coincidir con lo que
se ha especificado en la aplicación y debe definir los hostAliases
que se direccionan al nuevo host virtual.Nota: El nombre de host y el puerto que se está cotejando es el que ha sido solicitado originalmente por el usuario, que podría coincidir o no con el host y el puerto que está utilizando Liberty. El ejemplo siguiente ilustra un elemento de host virtual añadido al archivo server.xml.
<virtualHost id="proxiedRequests"> <hostAlias>external.host.name:80</hostAlias> <hostAlias>external.host.name:443</hostAlias> </virtualHost>
Si las solicitudes proceden de un proxy, esta configuración sola direcciona cualquier solicitud que se realiza en el host y el puerto del proxy al host virtual "proxiedRequests".
Restricción del acceso basándose en el punto final de origen
- Defina otro httpEndpoint. El ejemplo siguiente ilustra otro
httpEndpoint.
<httpEndpoint id="localHostOnly" host="localhost" httpPort="9081" httpsPort="9444"/>
Este punto final http especifica que host="localhost," lo que significa que los puertos 9081 y 9444 solo están expuestos en la interfaz localhost.
- Actualice las definiciones de virtualHost para
especificarel atributo allowFromEndpointRef. Cuando este atributo
está especificado, un virtualHost acepta solicitudes solo del punto
final especificado. Por ejemplo:
<virtualHost id="default_host" allowFromEndpointRef="localHostOnly"> <hostAlias>*:9081</hostAlias> <hostAlias>*:9444</hostAlias> </virtualHost> </virtualHost id="proxiedRequests"> <hostAlias>*:9080</hostAlias> <hostAlias>*:9443</hostAlias> <hostAlias>external.host.name:80</hostAlias> <hostAlias>external.host.name:443</hostAlias> </virtualHost>
Con esta configuración:- El host virtual default_host ahora acepta solicitudes que se direccionan solo en localhost:9081 y localhost:9444 que también se han originado desde el punto final localHostOnly. Se rechaza cualquier otra solicitud a los puertos 9081 y 9444. Por ejemplo, una solicitud procedente defaultHttpEndpoing con cabeceras de Host que hacen referencia al localhost:9081 se rechaza.
- El host virtual proxiedRequests ahora acepta cualquier solicitud que se haya emitido al puerto 9080, o 9443 (que son los puertos predeterminados que utiliza el defaultHttpEndpoint), además de aquellos que tienen una cabecera de Host que haga referencia al nombre de host externo procedente del proxy y el puerto 80 o 443.